changeset 171:661c1c732269

Copy out input values for Ooura so the in-place transform doesn't overwrite *data
author Jamie Bullock <jamie@jamiebullock.com>
date Tue, 18 Jun 2013 13:21:02 -0700
parents 251df503d0fe
children 772c03f47063
files src/vector.c
diffstat 1 files changed, 22 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/vector.c	Tue Jun 18 08:51:28 2013 -0700
+++ b/src/vector.c	Tue Jun 18 13:21:02 2013 -0700
@@ -26,6 +26,7 @@
 #include <math.h>
 #include <string.h>
 #include <stdlib.h>
+#include <assert.h>
 
 #include "fft.h"
 
@@ -53,7 +54,9 @@
     unsigned int n = 0;
     unsigned int m = 0;
     unsigned int M = N >> 1;
-#ifndef USE_OOURA
+#ifdef USE_OOURA
+    double *fft = NULL;
+#else 
     DSPDoubleSplitComplex *fft = NULL;
 #endif
 
@@ -80,7 +83,11 @@
      * the output format is
      * a[0] - DC, a[1] - nyquist, a[2...N-1] - remaining bins
      */
-    rdft(N, 1, data, ooura_data_spectrum.ooura_ip, 
+    fft = malloc(N * sizeof(double));
+    assert(fft != NULL);
+    memcpy(fft, data, N * sizeof(double));
+
+    rdft(N, 1, fft, ooura_data_spectrum.ooura_ip, 
             ooura_data_spectrum.ooura_w);
 #else
     fft = &vdsp_data_spectrum.fft;
@@ -110,8 +117,8 @@
                 ++n;
             }
 
-            real = data[n*2];
-            imag = data[n*2+1];
+            real = fft[n*2];
+            imag = fft[n*2+1];
 #else
             real = fft->realp[n];
             imag = fft->realp[n];
@@ -155,8 +162,8 @@
                 ++n;
             }
 
-            real = data[n*2];
-            imag = data[n*2+1];
+            real = fft[n*2];
+            imag = fft[n*2+1];
 #else
             real = fft->realp[n];
             imag = fft->realp[n];
@@ -186,8 +193,8 @@
                 ++n;
             }
 
-            real = data[n*2];
-            imag = data[n*2+1];
+            real = fft[n*2];
+            imag = fft[n*2+1];
 #else
             real = fft->realp[n];
             imag = fft->realp[n];
@@ -224,8 +231,8 @@
             {
                 ++n;
             }
-            real = data[n*2];
-            imag = data[n*2+1];
+            real = fft[n*2];
+            imag = fft[n*2+1];
 #else
             real = fft->realp[n];
             imag = fft->realp[n];
@@ -244,6 +251,10 @@
             result[n] /= max;
     }
 
+#ifdef USE_OOURA
+    free(fft);
+#endif
+
     return XTRACT_SUCCESS;
 }
 
@@ -506,7 +517,7 @@
         }
     }
 
-    free(input);
+   // free(input);
     return (rv ? rv : XTRACT_SUCCESS);
 }