aboutsummaryrefslogtreecommitdiff
path: root/src/vector.c
diff options
context:
space:
mode:
authorJamie Bullock <jamie@jamiebullock.com>2013-06-18 13:21:02 -0700
committerJamie Bullock <jamie@jamiebullock.com>2013-06-18 13:21:02 -0700
commit6dbfcddf8250cb981f7bd630e9e6f1fdb12608e6 (patch)
treee653de3f73887d7d85abcd941cdfe2ecbfd31982 /src/vector.c
parent2ed48cb3cf96a4822caa8b63da6d176c6c4524b2 (diff)
downloadLibXtract-6dbfcddf8250cb981f7bd630e9e6f1fdb12608e6.tar.gz
LibXtract-6dbfcddf8250cb981f7bd630e9e6f1fdb12608e6.tar.bz2
LibXtract-6dbfcddf8250cb981f7bd630e9e6f1fdb12608e6.zip
Copy out input values for Ooura so the in-place transform doesn't overwrite *data
Diffstat (limited to 'src/vector.c')
-rw-r--r--src/vector.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/src/vector.c b/src/vector.c
index 3233d92..5d88882 100644
--- a/src/vector.c
+++ b/src/vector.c
@@ -26,6 +26,7 @@
#include <math.h>
#include <string.h>
#include <stdlib.h>
+#include <assert.h>
#include "fft.h"
@@ -53,7 +54,9 @@ int xtract_spectrum(const double *data, const int N, const void *argv, double *r
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 @@ int xtract_spectrum(const double *data, const int N, const void *argv, double *r
* 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 @@ int xtract_spectrum(const double *data, const int N, const void *argv, double *r
++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 @@ int xtract_spectrum(const double *data, const int N, const void *argv, double *r
++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 @@ int xtract_spectrum(const double *data, const int N, const void *argv, double *r
++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 @@ int xtract_spectrum(const double *data, const int N, const void *argv, double *r
{
++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 @@ int xtract_spectrum(const double *data, const int N, const void *argv, double *r
result[n] /= max;
}
+#ifdef USE_OOURA
+ free(fft);
+#endif
+
return XTRACT_SUCCESS;
}
@@ -506,7 +517,7 @@ int xtract_peak_spectrum(const double *data, const int N, const void *argv, doub
}
}
- free(input);
+ // free(input);
return (rv ? rv : XTRACT_SUCCESS);
}