Changeset b276dee for src/filterbank.c


Ignore:
Timestamp:
Sep 8, 2007, 3:59:11 PM (17 years ago)
Author:
Paul Brossier <piem@piem.org>
Branches:
feature/autosink, feature/cnn, feature/cnn_org, feature/constantq, feature/crepe, feature/crepe_org, feature/pitchshift, feature/pydocstrings, feature/timestretch, fix/ffmpeg5, master, pitchshift, sampler, timestretch, yinfft+
Children:
f14a78d
Parents:
53a7576
Message:

mfcc.{c,h}, filterbank.{c,h}: move filter initialisation into new_aubio_filterbank_mfcc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/filterbank.c

    r53a7576 rb276dee  
    2424
    2525#include "aubio_priv.h"
     26#include "sample.h"
    2627#include "filterbank.h"
     28
     29#define USE_EQUAL_GAIN 1
     30#define VERY_SMALL_NUMBER 2e-42
    2731
    2832/** \brief A structure to store a set of n_filters filters of lenghts win_s */
     
    3034    uint_t win_s;
    3135    uint_t n_filters;
    32     fvec_t *filters;
     36    fvec_t **filters;
    3337};
    3438
     
    4145
    4246  /** allocating filter tables */
    43   fb->filters=AUBIO_ARRAY(n_filters,fvec_t);
     47  fb->filters=AUBIO_ARRAY(fvec_t*,n_filters);
    4448  for (filter_cnt=0; filter_cnt<n_filters; filter_cnt++)
    4549    /* considering one-channel filters */
    46     filters[filter_cnt]=new_fvec(win_s, 1);
     50    fb->filters[filter_cnt]=new_fvec(win_s, 1);
     51
     52  return fb;
     53}
     54
     55aubio_filterbank_t * new_aubio_filterbank_mfcc(uint_t n_filters, uint_t win_s, smpl_t samplerate, smpl_t freq_min, smpl_t freq_max){
     56  smpl_t nyquist = samplerate/2.;
     57  uint_t style = 1;
     58  aubio_filterbank_t * fb = new_aubio_filterbank(n_filters, win_s);
     59
     60  uint_t n, i, k, *fft_peak, M, next_peak;
     61  smpl_t norm, mel_freq_max, mel_freq_min, norm_fact, height, inc, val,
     62         freq_bw_mel, *mel_peak, *height_norm, *lin_peak;
     63
     64  mel_peak = height_norm = lin_peak = NULL;
     65  fft_peak = NULL;
     66  norm = 1;
     67
     68  mel_freq_max = 1127 * log(1 + freq_max / 700);
     69  mel_freq_min = 1127 * log(1 + freq_min / 700);
     70  freq_bw_mel = (mel_freq_max - mel_freq_min) / fb->n_filters;
     71
     72  mel_peak = (smpl_t *)malloc((fb->n_filters + 2) * sizeof(smpl_t));
     73  /* +2 for zeros at start and end */
     74  lin_peak = (smpl_t *)malloc((fb->n_filters + 2) * sizeof(smpl_t));
     75  fft_peak = (uint_t *)malloc((fb->n_filters + 2) * sizeof(uint_t));
     76  height_norm = (smpl_t *)malloc(fb->n_filters * sizeof(smpl_t));
     77
     78  if(mel_peak == NULL || height_norm == NULL ||
     79      lin_peak == NULL || fft_peak == NULL)
     80    return NULL;
     81
     82  M = fb->win_s >> 1;
     83
     84  mel_peak[0] = mel_freq_min;
     85  lin_peak[0] = 700 * (exp(mel_peak[0] / 1127) - 1);
     86  fft_peak[0] = lin_peak[0] / nyquist * M;
     87
     88
     89  for (n = 1; n <= fb->n_filters; n++){ 
     90    /*roll out peak locations - mel, linear and linear on fft window scale */
     91    mel_peak[n] = mel_peak[n - 1] + freq_bw_mel;
     92    lin_peak[n] = 700 * (exp(mel_peak[n] / 1127) -1);
     93    fft_peak[n] = lin_peak[n] / nyquist * M;
     94  }
     95
     96  for (n = 0; n < fb->n_filters; n++){
     97    /*roll out normalised gain of each peak*/
     98    if (style == USE_EQUAL_GAIN){
     99      height = 1;
     100      norm_fact = norm;
     101    }
     102    else{
     103      height = 2 / (lin_peak[n + 2] - lin_peak[n]);
     104      norm_fact = norm / (2 / (lin_peak[2] - lin_peak[0]));
     105    }
     106    height_norm[n] = height * norm_fact;
     107  }
     108
     109  i = 0;
     110
     111  for(n = 0; n < fb->n_filters; n++){
     112
     113    /*calculate the rise increment*/
     114    if(n > 0)
     115      inc = height_norm[n] / (fft_peak[n] - fft_peak[n - 1]);
     116    else
     117      inc = height_norm[n] / fft_peak[n];
     118    val = 0; 
     119
     120    /*zero the start of the array*/
     121    for(k = 0; k < i; k++)
     122      //fft_tables[n][k] = 0.f;
     123      fb->filters[n]->data[0][k]=0.f;
     124
     125    /*fill in the rise */
     126    for(; i <= fft_peak[n]; i++){
     127      // fft_tables[n][i] = val;
     128      fb->filters[n]->data[0][k]=val;
     129      val += inc;
     130    }
     131
     132    /*calculate the fall increment */
     133    inc = height_norm[n] / (fft_peak[n + 1] - fft_peak[n]);
     134
     135    val = 0;
     136    next_peak = fft_peak[n + 1];
     137
     138    /*reverse fill the 'fall' */
     139    for(i = next_peak; i > fft_peak[n]; i--){
     140      //fft_tables[n][i] = val;
     141      fb->filters[n]->data[0][k]=val;
     142      val += inc;
     143    }
     144
     145    /*zero the rest of the array*/
     146    for(k = next_peak + 1; k < fb->win_s; k++)
     147      //fft_tables[n][k] = 0.f;
     148      fb->filters[n]->data[0][k]=0.f;
     149  }
     150
     151  free(mel_peak);
     152  free(lin_peak);
     153  free(height_norm);
     154  free(fft_peak);
     155
     156  return fb;
    47157
    48158}
    49159
     160
    50161void del_aubio_filterbank(aubio_filterbank_t * fb){
    51  
    52   int filter_cnt;
     162  uint_t filter_cnt;
    53163  /** deleting filter tables first */
    54164  for (filter_cnt=0; filter_cnt<fb->n_filters; filter_cnt++)
     
    56166  AUBIO_FREE(fb->filters);
    57167  AUBIO_FREE(fb);
    58 
    59168}
    60169
     170void aubio_filterbank_do(aubio_filterbank_t * f, cvec_t * in, fvec_t *out) {
     171  uint_t n, filter_cnt;
     172  for(filter_cnt = 0; filter_cnt < f->n_filters; filter_cnt++){
     173      out->data[0][filter_cnt] = 0.f;
     174      for(n = 0; n < f->win_s; n++){
     175          out->data[0][filter_cnt] += in->norm[0][n]
     176            * f->filters[filter_cnt]->data[0][n];
     177      }
     178      out->data[0][filter_cnt] =
     179        LOG(out->data[0][filter_cnt] < VERY_SMALL_NUMBER ?
     180            VERY_SMALL_NUMBER : out->data[0][filter_cnt]);
     181  }
     182
     183  return;
     184}
Note: See TracChangeset for help on using the changeset viewer.