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 }