diff options
author | Jamie Bullock <jamie@postlude.co.uk> | 2007-04-20 08:49:49 +0000 |
---|---|---|
committer | Jamie Bullock <jamie@postlude.co.uk> | 2007-04-20 08:49:49 +0000 |
commit | df6ca885dba5d131417c709366efbe2ff524dda6 (patch) | |
tree | 9e100eeee8369f8b9101b236ebfe194e8bda7e6d /src/vector.c | |
parent | a6a907d1fe30536ec004940c5fdf196abe5103cd (diff) | |
download | LibXtract-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.c | 42 |
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; } |