aboutsummaryrefslogtreecommitdiff
path: root/src/vector.c
diff options
context:
space:
mode:
authorJamie Bullock <jamie@postlude.co.uk>2007-04-20 08:49:49 +0000
committerJamie Bullock <jamie@postlude.co.uk>2007-04-20 08:49:49 +0000
commitdf6ca885dba5d131417c709366efbe2ff524dda6 (patch)
tree9e100eeee8369f8b9101b236ebfe194e8bda7e6d /src/vector.c
parenta6a907d1fe30536ec004940c5fdf196abe5103cd (diff)
downloadLibXtract-df6ca885dba5d131417c709366efbe2ff524dda6.tar.gz
LibXtract-df6ca885dba5d131417c709366efbe2ff524dda6.tar.bz2
LibXtract-df6ca885dba5d131417c709366efbe2ff524dda6.zip
Fixed autocorrelation_fft() it now gives comparable output to autocorrelation()
Diffstat (limited to 'src/vector.c')
-rw-r--r--src/vector.c42
1 files changed, 30 insertions, 12 deletions
diff --git a/src/vector.c b/src/vector.c
index 97e087b..17733b9 100644
--- a/src/vector.c
+++ b/src/vector.c
@@ -156,25 +156,43 @@ int xtract_spectrum(const float *data, const int N, const void *argv, float *res
int xtract_autocorrelation_fft(const float *data, const int N, const void *argv, float *result){
- float *temp, *input;
- size_t bytes;
- int n;
+ float *freq, *time;
+ int n, M;
fftwf_plan plan;
- temp = (float *)fftwf_malloc(N * sizeof(float));
- input = (float *)malloc(bytes = N * sizeof(float));
- input = memcpy(input, data, bytes);
+ M = N << 1;
+
+ freq = (float *)fftwf_malloc(M * sizeof(float));
+ /* Zero pad the input vector */
+ time = (float *)calloc(M, sizeof(float));
+ time = memcpy(time, data, N * sizeof(float));
- plan = fftwf_plan_r2r_1d(N, input, temp, FFTW_HC2R, FFTW_ESTIMATE);
+ plan = fftwf_plan_r2r_1d(M, time, freq, FFTW_R2HC, FFTW_ESTIMATE);
fftwf_execute(plan);
+
+ for(n = 1; n < M / 2; n++){
+ freq[n] = XTRACT_SQ(freq[n]) + XTRACT_SQ(freq[M - n]);
+ freq[M - n] = 0.f;
+ }
- for(n = 0; n < N - 1; n++)
- result[n] = temp[n+1];
-
+ freq[0] = XTRACT_SQ(freq[0]);
+ freq[N] = XTRACT_SQ(freq[N]);
+
+ plan = fftwf_plan_r2r_1d(M, freq, time, FFTW_HC2R, FFTW_ESTIMATE);
+
+ fftwf_execute(plan);
+
+ /* Normalisation factor */
+ M = M * N;
+
+ for(n = 0; n < N; n++)
+ result[n] = time[n] / (float)M;
+ /* result[n] = time[n+1] / (float)M; */
+
fftwf_destroy_plan(plan);
- fftwf_free(temp);
- free(input);
+ fftwf_free(freq);
+ free(time);
return XTRACT_SUCCESS;
}