comparison src/init.c @ 204:f262144347e7

Return XTRACT_ARGUMENT_ERROR if we try to initialise an mel filter bank with less than 2 bands
author Jamie Bullock <jamie@jamiebullock.com>
date Fri, 07 Mar 2014 22:14:55 +0000
parents 5176462e2797
children ef80f7c52c6d
comparison
equal deleted inserted replaced
203:302eab34dc88 204:f262144347e7
249 249
250 mel_peak = height_norm = lin_peak = NULL; 250 mel_peak = height_norm = lin_peak = NULL;
251 fft_peak = NULL; 251 fft_peak = NULL;
252 norm = 1; 252 norm = 1;
253 253
254 if (freq_bands <= 1)
255 {
256 return XTRACT_ARGUMENT_ERROR;
257 }
258
254 mel_freq_max = 1127 * log(1 + freq_max / 700); 259 mel_freq_max = 1127 * log(1 + freq_max / 700);
255 mel_freq_min = 1127 * log(1 + freq_min / 700); 260 mel_freq_min = 1127 * log(1 + freq_min / 700);
256 freq_bw_mel = (mel_freq_max - mel_freq_min) / freq_bands; 261 freq_bw_mel = (mel_freq_max - mel_freq_min) / freq_bands;
257 262
258 mel_peak = (double *)malloc((freq_bands + 2) * sizeof(double)); 263 mel_peak = (double *)malloc((freq_bands + 2) * sizeof(double));
267 lin_peak = (double *)malloc((freq_bands + 2) * sizeof(double)); 272 lin_peak = (double *)malloc((freq_bands + 2) * sizeof(double));
268 273
269 if (lin_peak == NULL) 274 if (lin_peak == NULL)
270 { 275 {
271 perror("error"); 276 perror("error");
277 free(mel_peak);
272 return XTRACT_MALLOC_FAILED; 278 return XTRACT_MALLOC_FAILED;
273 } 279 }
274 280
275 fft_peak = (int *)malloc((freq_bands + 2) * sizeof(int)); 281 fft_peak = (int *)malloc((freq_bands + 2) * sizeof(int));
276 282
277 if (fft_peak == NULL) 283 if (fft_peak == NULL)
278 { 284 {
279 perror("error"); 285 perror("error");
286 free(mel_peak);
287 free(lin_peak);
280 return XTRACT_MALLOC_FAILED; 288 return XTRACT_MALLOC_FAILED;
281 } 289 }
282 290
283 height_norm = (double *)malloc(freq_bands * sizeof(double)); 291 height_norm = (double *)malloc(freq_bands * sizeof(double));
284 292
285 if (height_norm == NULL) 293 if (height_norm == NULL)
286 { 294 {
287 perror("error"); 295 perror("error");
296 free(mel_peak);
297 free(lin_peak);
298 free(fft_peak);
288 return XTRACT_MALLOC_FAILED; 299 return XTRACT_MALLOC_FAILED;
289 } 300 }
290 301
291 M = N >> 1; 302 M = N >> 1;
292 303
293 mel_peak[0] = mel_freq_min; 304 mel_peak[0] = mel_freq_min;
294 lin_peak[0] = freq_min; // === 700 * (exp(mel_peak[0] / 1127) - 1); 305 lin_peak[0] = freq_min; // === 700 * (exp(mel_peak[0] / 1127) - 1);
295 fft_peak[0] = lin_peak[0] / nyquist * M; 306 fft_peak[0] = lin_peak[0] / nyquist * M;
296 307
297 308
298 for (n = 1; n < freq_bands + 2; n++) 309 for (n = 1; n < (freq_bands + 2); ++n)
299 { 310 {
300 //roll out peak locations - mel, linear and linear on fft window scale 311 //roll out peak locations - mel, linear and linear on fft window scale
301 mel_peak[n] = mel_peak[n - 1] + freq_bw_mel; 312 mel_peak[n] = mel_peak[n - 1] + freq_bw_mel;
302 lin_peak[n] = 700 * (exp(mel_peak[n] / 1127) -1); 313 lin_peak[n] = 700 * (exp(mel_peak[n] / 1127) -1);
303 fft_peak[n] = lin_peak[n] / nyquist * M; 314 fft_peak[n] = lin_peak[n] / nyquist * M;