Ignore:
Timestamp:
Sep 17, 2009, 5:54:25 AM (15 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:
e7b3629
Parents:
bc3c51b
Message:

src/spectral/filterbank_mel.c: move Slaney's specific code to _slaney function

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/spectral/filterbank_mel.c

    rbc3c51b r1e37ade  
    2727
    2828void
    29 aubio_filterbank_set_mel_coeffs (aubio_filterbank_t * fb, smpl_t samplerate,
    30     smpl_t freq_min, smpl_t freq_max)
     29aubio_filterbank_set_mel_coeffs (aubio_filterbank_t * fb, fvec_t * freqs,
     30    smpl_t samplerate)
    3131{
    3232
     
    3434  uint_t n_filters = filters->channels, win_s = filters->length;
    3535
    36   /* Malcolm Slaney parameters */
    37   smpl_t lowestFrequency = 133.3333;
    38   smpl_t linearSpacing = 66.66666666;
    39   smpl_t logSpacing = 1.0711703;
     36  uint_t fn;                    /* filter counter */
     37  uint_t bin;                   /* bin counter */
    4038
    41   uint_t linearFilters = 13;
    42   uint_t logFilters = 27;
    43   uint_t allFilters = linearFilters + logFilters;
    44 
    45   /* throw a warning if filterbank object fb is too short */
    46   if (allFilters > n_filters) {
    47     AUBIO_WRN ("not enough Mel filters, got %d but %d needed\n",
    48         n_filters, allFilters);
     39  /* freqs define the bands of triangular overlapping windows.
     40     throw a warning if filterbank object fb is too short. */
     41  if (freqs->length - 2 > n_filters) {
     42    AUBIO_WRN ("not enough filters, %d allocated but %d requested\n",
     43        n_filters, freqs->length - 2);
    4944  }
    5045
    51   /* buffers for computing filter frequencies */
    52   fvec_t *freqs = new_fvec (allFilters + 2, 1);
    53 
    5446  /* convenience reference to lower/center/upper frequency for each triangle */
    55   fvec_t *lower_freqs = new_fvec (allFilters, 1);
    56   fvec_t *upper_freqs = new_fvec (allFilters, 1);
    57   fvec_t *center_freqs = new_fvec (allFilters, 1);
     47  fvec_t *lower_freqs = new_fvec (n_filters, 1);
     48  fvec_t *upper_freqs = new_fvec (n_filters, 1);
     49  fvec_t *center_freqs = new_fvec (n_filters, 1);
    5850
    5951  /* height of each triangle */
    60   fvec_t *triangle_heights = new_fvec (allFilters, 1);
     52  fvec_t *triangle_heights = new_fvec (n_filters, 1);
    6153
    6254  /* lookup table of each bin frequency in hz */
    6355  fvec_t *fft_freqs = new_fvec (win_s, 1);
    6456
    65   uint_t fn;                    /* filter counter */
    66   uint_t bin;                   /* bin counter */
    67 
    68   /* first step: filling all the linear filter frequencies */
    69   for (fn = 0; fn < linearFilters; fn++) {
    70     freqs->data[0][fn] = lowestFrequency + fn * linearSpacing;
    71   }
    72   smpl_t lastlinearCF = freqs->data[0][fn - 1];
    73 
    74   /* second step: filling all the log filter frequencies */
    75   for (fn = 0; fn < logFilters + 2; fn++) {
    76     freqs->data[0][fn + linearFilters] =
    77         lastlinearCF * (POW (logSpacing, fn + 1));
    78   }
    79 
    8057  /* fill up the lower/center/upper */
    81   for (fn = 0; fn < allFilters; fn++) {
     58  for (fn = 0; fn < n_filters; fn++) {
    8259    lower_freqs->data[0][fn] = freqs->data[0][fn];
    8360    center_freqs->data[0][fn] = freqs->data[0][fn + 1];
     
    8663
    8764  /* compute triangle heights so that each triangle has unit area */
    88   for (fn = 0; fn < allFilters; fn++) {
     65  for (fn = 0; fn < n_filters; fn++) {
    8966    triangle_heights->data[0][fn] =
    9067        2. / (upper_freqs->data[0][fn] - lower_freqs->data[0][fn]);
     
    144121
    145122  /* destroy temporarly allocated vectors */
    146   del_fvec (freqs);
    147123  del_fvec (lower_freqs);
    148124  del_fvec (upper_freqs);
     
    153129
    154130}
     131
     132void
     133aubio_filterbank_set_mel_coeffs_slaney (aubio_filterbank_t * fb,
     134    smpl_t samplerate)
     135{
     136  /* Malcolm Slaney parameters */
     137  smpl_t lowestFrequency = 133.3333;
     138  smpl_t linearSpacing = 66.66666666;
     139  smpl_t logSpacing = 1.0711703;
     140
     141  uint_t linearFilters = 13;
     142  uint_t logFilters = 27;
     143  uint_t n_filters = linearFilters + logFilters;
     144
     145  uint_t fn;                    /* filter counter */
     146  uint_t bin;                   /* bin counter */
     147
     148  /* buffers to compute filter frequencies */
     149  fvec_t *freqs = new_fvec (n_filters + 2, 1);
     150
     151  /* first step: fill all the linear filter frequencies */
     152  for (fn = 0; fn < linearFilters; fn++) {
     153    freqs->data[0][fn] = lowestFrequency + fn * linearSpacing;
     154  }
     155  smpl_t lastlinearCF = freqs->data[0][fn - 1];
     156
     157  /* second step: fill all the log filter frequencies */
     158  for (fn = 0; fn < logFilters + 2; fn++) {
     159    freqs->data[0][fn + linearFilters] =
     160        lastlinearCF * (POW (logSpacing, fn + 1));
     161  }
     162
     163  /* now compute the actual coefficients */
     164  aubio_filterbank_set_mel_coeffs (fb, freqs, samplerate);
     165
     166  /* destroy vector used to store frequency limits */
     167  del_fvec (freqs);
     168
     169}
Note: See TracChangeset for help on using the changeset viewer.