}
/* compute triangle heights so that each triangle has unit area */
- for (fn = 0; fn < n_filters; fn++) {
- triangle_heights->data[fn] =
- 2. / (upper_freqs->data[fn] - lower_freqs->data[fn]);
+ if (aubio_filterbank_get_norm(fb)) {
+ for (fn = 0; fn < n_filters; fn++) {
+ triangle_heights->data[fn] =
+ 2. / (upper_freqs->data[fn] - lower_freqs->data[fn]);
+ }
+ } else {
+ fvec_ones (triangle_heights);
}
/* fill fft_freqs lookup table, which assigns the frequency in hz to each bin */
}
/* compute positive slope step size */
- riseInc =
- triangle_heights->data[fn] /
- (center_freqs->data[fn] - lower_freqs->data[fn]);
+ riseInc = triangle_heights->data[fn]
+ / (center_freqs->data[fn] - lower_freqs->data[fn]);
/* compute coefficients in positive slope */
for (; bin < win_s - 1; bin++) {
}
/* compute negative slope step size */
- downInc =
- triangle_heights->data[fn] /
- (upper_freqs->data[fn] - center_freqs->data[fn]);
+ downInc = triangle_heights->data[fn]
+ / (upper_freqs->data[fn] - center_freqs->data[fn]);
/* compute coefficents in negative slope */
for (; bin < win_s - 1; bin++) {
{
uint_t retval;
+ if (samplerate <= 0) {
+ AUBIO_ERR("filterbank: set_mel_coeffs_slaney samplerate should be > 0\n");
+ return AUBIO_FAIL;
+ }
+
/* Malcolm Slaney parameters */
smpl_t lowestFrequency = 133.3333;
smpl_t linearSpacing = 66.66666666;
return retval;
}
+static uint_t aubio_filterbank_check_freqs (aubio_filterbank_t *fb UNUSED,
+ smpl_t samplerate, smpl_t *freq_min, smpl_t *freq_max)
+{
+ if (samplerate <= 0) {
+ AUBIO_ERR("filterbank: set_mel_coeffs samplerate should be > 0\n");
+ return AUBIO_FAIL;
+ }
+ if (*freq_max < 0) {
+ AUBIO_ERR("filterbank: set_mel_coeffs freq_max should be > 0\n");
+ return AUBIO_FAIL;
+ } else if (*freq_max == 0) {
+ *freq_max = samplerate / 2.;
+ }
+ if (*freq_min < 0) {
+ AUBIO_ERR("filterbank: set_mel_coeffs freq_min should be > 0\n");
+ return AUBIO_FAIL;
+ }
+ return AUBIO_OK;
+}
+
uint_t
aubio_filterbank_set_mel_coeffs (aubio_filterbank_t * fb, smpl_t samplerate,
smpl_t freq_min, smpl_t freq_max)
{
uint_t m, retval;
- smpl_t start, end, step;
+ smpl_t start = freq_min, end = freq_max, step;
fvec_t *freqs;
fmat_t *coeffs = aubio_filterbank_get_coeffs(fb);
uint_t n_bands = coeffs->height;
- if (freq_max < 0) {
- AUBIO_ERR("filterbank: set_mel_coeffs freq_max should be > 0\n");
- return AUBIO_FAIL;
- } else if (freq_max == 0) {
- end = aubio_hztomel(samplerate / 2.);
- } else {
- end = aubio_hztomel(freq_max);
- }
- if (freq_min < 0) {
- AUBIO_ERR("filterbank: set_mel_coeffs freq_min should be > 0\n");
- return AUBIO_FAIL;
- } else {
- start = aubio_hztomel(freq_min);
- }
- if (n_bands <= 0) {
- AUBIO_ERR("filterbank: set_mel_coeffs n_bands should be > 0\n");
+ if (aubio_filterbank_check_freqs(fb, samplerate, &start, &end)) {
return AUBIO_FAIL;
}
+ start = aubio_hztomel(start);
+ end = aubio_hztomel(end);
+
freqs = new_fvec(n_bands + 2);
step = (end - start) / (n_bands + 1);
smpl_t freq_min, smpl_t freq_max)
{
uint_t m, retval;
- smpl_t start, end, step;
+ smpl_t start = freq_min, end = freq_max, step;
fvec_t *freqs;
fmat_t *coeffs = aubio_filterbank_get_coeffs(fb);
uint_t n_bands = coeffs->height;
- if (freq_max < 0) {
- AUBIO_ERR("filterbank: set_mel_coeffs freq_max should be > 0\n");
- return AUBIO_FAIL;
- } else if (freq_max == 0) {
- end = aubio_hztomel_htk(samplerate / 2.);
- } else {
- end = aubio_hztomel_htk(freq_max);
- }
- if (freq_min < 0) {
- AUBIO_ERR("filterbank: set_mel_coeffs freq_min should be > 0\n");
- return AUBIO_FAIL;
- } else {
- start = aubio_hztomel_htk(freq_min);
- }
- if (n_bands <= 0) {
- AUBIO_ERR("filterbank: set_mel_coeffs n_bands should be > 0\n");
+ if (aubio_filterbank_check_freqs(fb, samplerate, &start, &end)) {
return AUBIO_FAIL;
}
+ start = aubio_hztomel_htk(start);
+ end = aubio_hztomel_htk(end);
+
freqs = new_fvec (n_bands + 2);
step = (end - start) / (n_bands + 1);