[Scipy-svn] r5369 - trunk/scipy/fftpack/src

scipy-svn at scipy.org scipy-svn at scipy.org
Wed Jan 7 13:26:00 EST 2009


Author: cdavid
Date: 2009-01-07 12:25:47 -0600 (Wed, 07 Jan 2009)
New Revision: 5369

Modified:
   trunk/scipy/fftpack/src/drfft.c
Log:
Put all real input fft code in one file.

Modified: trunk/scipy/fftpack/src/drfft.c
===================================================================
--- trunk/scipy/fftpack/src/drfft.c	2009-01-07 18:25:14 UTC (rev 5368)
+++ trunk/scipy/fftpack/src/drfft.c	2009-01-07 18:25:47 UTC (rev 5369)
@@ -6,31 +6,98 @@
 
 #include "fftpack.h"
 
-/* The following macro convert private backend specific function to the public
- * functions exported by the module  */
-#define GEN_PUBLIC_API(name) \
-void destroy_drfft_cache(void)\
-{\
-        destroy_dr##name##_caches();\
-}\
-\
-void drfft(double *inout, int n, \
-        int direction, int howmany, int normalize)\
-{\
-        drfft_##name(inout, n, direction, howmany, normalize);\
-}\
-void destroy_rfft_cache(void)\
-{\
-        destroy_r##name##_caches();\
-}\
-\
-void rfft(float *inout, int n, \
-        int direction, int howmany, int normalize)\
-{\
-        rfft_##name(inout, n, direction, howmany, normalize);\
+extern void F_FUNC(dfftf, DFFTF) (int *, double *, double *);
+extern void F_FUNC(dfftb, DFFTB) (int *, double *, double *);
+extern void F_FUNC(dffti, DFFTI) (int *, double *);
+extern void F_FUNC(rfftf, RFFTF) (int *, float *, float *);
+extern void F_FUNC(rfftb, RFFTB) (int *, float *, float *);
+extern void F_FUNC(rffti, RFFTI) (int *, float *);
+
+
+GEN_CACHE(drfftpack, (int n)
+	  , double *wsave;
+	  , (caches_drfftpack[i].n == n)
+	  , caches_drfftpack[id].wsave =
+	  (double *) malloc(sizeof(double) * (2 * n + 15));
+	  F_FUNC(dffti, DFFTI) (&n, caches_drfftpack[id].wsave);
+	  , free(caches_drfftpack[id].wsave);
+	  , 10)
+
+GEN_CACHE(rfftpack, (int n)
+	  , float *wsave;
+	  , (caches_rfftpack[i].n == n)
+	  , caches_rfftpack[id].wsave =
+	  (float *) malloc(sizeof(float) * (2 * n + 15));
+	  F_FUNC(rffti, RFFTI) (&n, caches_rfftpack[id].wsave);
+	  , free(caches_rfftpack[id].wsave);
+	  , 10)
+
+void drfft_fftpack(double *inout, int n, int direction, int howmany,
+			  int normalize)
+{
+    int i;
+    double *ptr = inout;
+    double *wsave = NULL;
+    wsave = caches_drfftpack[get_cache_id_drfftpack(n)].wsave;
+
+
+    switch (direction) {
+        case 1:
+        for (i = 0; i < howmany; ++i, ptr += n) {
+            dfftf_(&n, ptr, wsave);
+        }
+        break;
+
+    case -1:
+        for (i = 0; i < howmany; ++i, ptr += n) {
+            dfftb_(&n, ptr, wsave);
+        }
+        break;
+
+    default:
+        fprintf(stderr, "drfft: invalid direction=%d\n", direction);
+    }
+
+    if (normalize) {
+        double d = 1.0 / n;
+        ptr = inout;
+        for (i = n * howmany - 1; i >= 0; --i) {
+            (*(ptr++)) *= d;
+        }
+    }
 }
 
+void rfft_fftpack(float *inout, int n, int direction, int howmany,
+			 int normalize)
+{
+    int i;
+    float *ptr = inout;
+    float *wsave = NULL;
+    wsave = caches_rfftpack[get_cache_id_rfftpack(n)].wsave;
 
-#include "drfft_fftpack.c"
-#include "rfft_fftpack.c"
-GEN_PUBLIC_API(fftpack)
+
+    switch (direction) {
+        case 1:
+        for (i = 0; i < howmany; ++i, ptr += n) {
+            rfftf_(&n, ptr, wsave);
+        }
+        break;
+
+    case -1:
+        for (i = 0; i < howmany; ++i, ptr += n) {
+            rfftb_(&n, ptr, wsave);
+        }
+        break;
+
+    default:
+        fprintf(stderr, "rfft: invalid direction=%d\n", direction);
+    }
+
+    if (normalize) {
+        float d = 1.0 / n;
+        ptr = inout;
+        for (i = n * howmany - 1; i >= 0; --i) {
+            (*(ptr++)) *= d;
+        }
+    }
+}




More information about the Scipy-svn mailing list