Mercurial > hg > libxtract
comparison src/init.c @ 164:7a23234648b4
Pass block size to xtract_init_vdsp_data() instead of block size / 2. Fixes bug with erroneous values in second half of spectrum when using vDSP FFT
author | Jamie Bullock <jamie@jamiebullock.com> |
---|---|
date | Sun, 02 Jun 2013 22:54:41 +0100 |
parents | 39d168ee5917 |
children | 1a0907add40c |
comparison
equal
deleted
inserted
replaced
163:5c20a9a34f0c | 164:7a23234648b4 |
---|---|
124 #else | 124 #else |
125 | 125 |
126 void xtract_init_vdsp_data(xtract_vdsp_data *vdsp_data, unsigned int N) | 126 void xtract_init_vdsp_data(xtract_vdsp_data *vdsp_data, unsigned int N) |
127 { | 127 { |
128 vdsp_data->setup = vDSP_create_fftsetupD(log2f(N), FFT_RADIX2); | 128 vdsp_data->setup = vDSP_create_fftsetupD(log2f(N), FFT_RADIX2); |
129 vdsp_data->fft.realp = (double *) malloc((N >> 1) * sizeof(double)); | 129 vdsp_data->fft.realp = (double *) malloc((N >> 1) * sizeof(double) + 1); |
130 vdsp_data->fft.imagp = (double *) malloc((N >> 1) * sizeof(double)); | 130 vdsp_data->fft.imagp = (double *) malloc((N >> 1) * sizeof(double) + 1); |
131 vdsp_data->log2N = log2f(N); | 131 vdsp_data->log2N = log2f(N); |
132 vdsp_data->initialised = true; | 132 vdsp_data->initialised = true; |
133 } | 133 } |
134 | 134 |
135 void xtract_free_vdsp_data(xtract_vdsp_data *vdsp_data) | 135 void xtract_free_vdsp_data(xtract_vdsp_data *vdsp_data) |
142 vdsp_data->initialised = false; | 142 vdsp_data->initialised = false; |
143 } | 143 } |
144 | 144 |
145 int xtract_init_vdsp_(int N, int feature_name) | 145 int xtract_init_vdsp_(int N, int feature_name) |
146 { | 146 { |
147 | |
148 int M = N >> 1; | |
149 | |
150 if(feature_name == XTRACT_AUTOCORRELATION_FFT) | |
151 { | |
152 M = N; /* allow for zero padding */ | |
153 } | |
154 | |
155 switch(feature_name) | 147 switch(feature_name) |
156 { | 148 { |
157 case XTRACT_SPECTRUM: | 149 case XTRACT_SPECTRUM: |
158 if(vdsp_data_spectrum.initialised) | 150 if(vdsp_data_spectrum.initialised) |
159 { | 151 { |
160 xtract_free_vdsp_data(&vdsp_data_spectrum); | 152 xtract_free_vdsp_data(&vdsp_data_spectrum); |
161 } | 153 } |
162 xtract_init_vdsp_data(&vdsp_data_spectrum, M); | 154 xtract_init_vdsp_data(&vdsp_data_spectrum, N); |
163 break; | 155 break; |
164 case XTRACT_AUTOCORRELATION_FFT: | 156 case XTRACT_AUTOCORRELATION_FFT: |
165 if(vdsp_data_autocorrelation_fft.initialised) | 157 if(vdsp_data_autocorrelation_fft.initialised) |
166 { | 158 { |
167 xtract_free_vdsp_data(&vdsp_data_autocorrelation_fft); | 159 xtract_free_vdsp_data(&vdsp_data_autocorrelation_fft); |
168 } | 160 } |
169 xtract_init_vdsp_data(&vdsp_data_autocorrelation_fft, M); | 161 xtract_init_vdsp_data(&vdsp_data_autocorrelation_fft, N * 2); // allow for zero padding |
170 break; | 162 break; |
171 case XTRACT_DCT: | 163 case XTRACT_DCT: |
172 if(vdsp_data_dct.initialised) | 164 if(vdsp_data_dct.initialised) |
173 { | 165 { |
174 xtract_free_vdsp_data(&vdsp_data_dct); | 166 xtract_free_vdsp_data(&vdsp_data_dct); |
175 } | 167 } |
176 xtract_init_vdsp_data(&vdsp_data_dct, M); | 168 xtract_init_vdsp_data(&vdsp_data_dct, N); |
177 case XTRACT_MFCC: | 169 case XTRACT_MFCC: |
178 if(vdsp_data_mfcc.initialised) | 170 if(vdsp_data_mfcc.initialised) |
179 { | 171 { |
180 xtract_free_vdsp_data(&vdsp_data_mfcc); | 172 xtract_free_vdsp_data(&vdsp_data_mfcc); |
181 } | 173 } |
182 xtract_init_vdsp_data(&vdsp_data_mfcc, M); | 174 xtract_init_vdsp_data(&vdsp_data_mfcc, N); |
183 break; | 175 break; |
184 } | 176 } |
185 | 177 |
186 return XTRACT_SUCCESS; | 178 return XTRACT_SUCCESS; |
187 } | 179 } |