[Scipy-svn] r5348 - trunk/scipy/fftpack/src
scipy-svn at scipy.org
scipy-svn at scipy.org
Wed Jan 7 09:45:56 EST 2009
Author: cdavid
Date: 2009-01-07 08:45:41 -0600 (Wed, 07 Jan 2009)
New Revision: 5348
Added:
trunk/scipy/fftpack/src/cfftnd_fftpack.c
Modified:
trunk/scipy/fftpack/src/zfftnd.c
Log:
Add single prec backend for ND complex transform.
Added: trunk/scipy/fftpack/src/cfftnd_fftpack.c
===================================================================
--- trunk/scipy/fftpack/src/cfftnd_fftpack.c 2009-01-07 14:45:13 UTC (rev 5347)
+++ trunk/scipy/fftpack/src/cfftnd_fftpack.c 2009-01-07 14:45:41 UTC (rev 5348)
@@ -0,0 +1,118 @@
+/*
+ * fftpack backend for multi dimensional fft
+ *
+ * Original code by Pearu Peaterson
+ *
+ * Last Change: Wed Aug 08 02:00 PM 2007 J
+ */
+
+GEN_CACHE(cfftnd_fftpack, (int n, int rank)
+ , complex_float * ptr; int *iptr; int rank;
+ , ((caches_cfftnd_fftpack[i].n == n)
+ && (caches_cfftnd_fftpack[i].rank == rank))
+ , caches_cfftnd_fftpack[id].n = n;
+ caches_cfftnd_fftpack[id].ptr =
+ (complex_float *) malloc(2 * sizeof(float) * n);
+ caches_cfftnd_fftpack[id].iptr =
+ (int *) malloc(4 * rank * sizeof(int));
+ ,
+ free(caches_cfftnd_fftpack[id].ptr);
+ free(caches_cfftnd_fftpack[id].iptr);
+ , 10)
+
+static
+/*inline : disabled because MSVC6.0 fails to compile it. */
+int next_comb(int *ia, int *da, int m)
+{
+ while (m >= 0 && ia[m] == da[m]) {
+ ia[m--] = 0;
+ }
+ if (m < 0) {
+ return 0;
+ }
+ ia[m]++;
+ return 1;
+}
+
+static
+void flatten(complex_float * dest, complex_float * src,
+ int rank, int strides_axis, int dims_axis, int unflat,
+ int *tmp)
+{
+ int *new_strides = tmp + rank;
+ int *new_dims = tmp + 2 * rank;
+ int *ia = tmp + 3 * rank;
+ int rm1 = rank - 1, rm2 = rank - 2;
+ int i, j, k;
+ for (i = 0; i < rm2; ++i)
+ ia[i] = 0;
+ ia[rm2] = -1;
+ j = 0;
+ if (unflat) {
+ while (next_comb(ia, new_dims, rm2)) {
+ k = 0;
+ for (i = 0; i < rm1; ++i) {
+ k += ia[i] * new_strides[i];
+ }
+ for (i = 0; i < dims_axis; ++i) {
+ *(dest + k + i * strides_axis) = *(src + j++);
+ }
+ }
+ } else {
+ while (next_comb(ia, new_dims, rm2)) {
+ k = 0;
+ for (i = 0; i < rm1; ++i) {
+ k += ia[i] * new_strides[i];
+ }
+ for (i = 0; i < dims_axis; ++i) {
+ *(dest + j++) = *(src + k + i * strides_axis);
+ }
+ }
+ }
+}
+
+extern void cfft(complex_float * inout,
+ int n, int direction, int howmany, int normalize);
+
+extern void cfftnd_fftpack(complex_float * inout, int rank,
+ int *dims, int direction, int howmany,
+ int normalize)
+{
+ int i, sz;
+ complex_float *ptr = inout;
+ int axis;
+ complex_float *tmp;
+ int *itmp;
+ int k, j;
+
+ sz = 1;
+ for (i = 0; i < rank; ++i) {
+ sz *= dims[i];
+ }
+ cfft(ptr, dims[rank - 1], direction, howmany * sz / dims[rank - 1],
+ normalize);
+
+ i = get_cache_id_cfftnd_fftpack(sz, rank);
+ tmp = caches_cfftnd_fftpack[i].ptr;
+ itmp = caches_cfftnd_fftpack[i].iptr;
+
+ itmp[rank - 1] = 1;
+ for (i = 2; i <= rank; ++i) {
+ itmp[rank - i] = itmp[rank - i + 1] * dims[rank - i + 1];
+ }
+
+ for (i = 0; i < howmany; ++i, ptr += sz) {
+ for (axis = 0; axis < rank - 1; ++axis) {
+ for (k = j = 0; k < rank; ++k) {
+ if (k != axis) {
+ *(itmp + rank + j) = itmp[k];
+ *(itmp + 2 * rank + j++) = dims[k] - 1;
+ }
+ }
+ flatten(tmp, ptr, rank, itmp[axis], dims[axis], 0, itmp);
+ cfft(tmp, dims[axis], direction, sz / dims[axis], normalize);
+ flatten(ptr, tmp, rank, itmp[axis], dims[axis], 1, itmp);
+ }
+ }
+
+}
Modified: trunk/scipy/fftpack/src/zfftnd.c
===================================================================
--- trunk/scipy/fftpack/src/zfftnd.c 2009-01-07 14:45:13 UTC (rev 5347)
+++ trunk/scipy/fftpack/src/zfftnd.c 2009-01-07 14:45:41 UTC (rev 5348)
@@ -17,7 +17,19 @@
int *dims, int direction, int howmany, int normalize)\
{\
zfftnd_##name(inout, rank, dims, direction, howmany, normalize);\
+}\
+void destroy_cfftnd_cache(void)\
+{\
+ destroy_cfftnd_##name##_caches();\
+}\
+\
+void cfftnd(complex_float * inout, int rank,\
+ int *dims, int direction, int howmany, int normalize)\
+{\
+ cfftnd_##name(inout, rank, dims, direction, howmany, normalize);\
}
+
#include "zfftnd_fftpack.c"
+#include "cfftnd_fftpack.c"
GEN_PUBLIC_API(fftpack)
More information about the Scipy-svn
mailing list