Mercurial > hg > libxtract
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; |