Changeset cfe4038


Ignore:
Timestamp:
Sep 8, 2007, 2:37:02 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:
d3c5282
Parents:
4f33dd3
Message:

filterbank.c, mfcc.c: move aubio_mfcc_init to mfcc

Location:
src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/filterbank.c

    r4f33dd3 rcfe4038  
    5959}
    6060
    61 // Initialization
    62 
    63 void aubio_filterbank_mfcc_init(aubio_filterbank_t * fb, smpl_t nyquist, int style, smpl_t freq_min, smpl_t freq_max){
    64 
    65     int n, i, k, *fft_peak, M, next_peak;
    66     smpl_t norm, mel_freq_max, mel_freq_min, norm_fact, height, inc, val,
    67         freq_bw_mel, *mel_peak, *height_norm, *lin_peak;
    68 
    69     mel_peak = height_norm = lin_peak = NULL;
    70     fft_peak = NULL;
    71     norm = 1;
    72 
    73     mel_freq_max = 1127 * log(1 + freq_max / 700);
    74     mel_freq_min = 1127 * log(1 + freq_min / 700);
    75     freq_bw_mel = (mel_freq_max - mel_freq_min) / fb->n_filters;
    76 
    77     mel_peak = (smpl_t *)malloc((fb->n_filters + 2) * sizeof(smpl_t));
    78     /* +2 for zeros at start and end */
    79     lin_peak = (smpl_t *)malloc((fb->n_filters + 2) * sizeof(smpl_t));
    80     fft_peak = (int *)malloc((fb->n_filters + 2) * sizeof(int));
    81     height_norm = (smpl_t *)malloc(fb->n_filters * sizeof(smpl_t));
    82 
    83     if(mel_peak == NULL || height_norm == NULL ||
    84                     lin_peak == NULL || fft_peak == NULL)
    85                     return XTRACT_MALLOC_FAILED;
    86    
    87     M = fb->win_s >> 1;
    88 
    89     mel_peak[0] = mel_freq_min;
    90     lin_peak[0] = 700 * (exp(mel_peak[0] / 1127) - 1);
    91     fft_peak[0] = lin_peak[0] / nyquist * M;
    92 
    93 
    94     for (n = 1; n <= fb->n_filters; n++){ 
    95     /*roll out peak locations - mel, linear and linear on fft window scale */
    96         mel_peak[n] = mel_peak[n - 1] + freq_bw_mel;
    97         lin_peak[n] = 700 * (exp(mel_peak[n] / 1127) -1);
    98         fft_peak[n] = lin_peak[n] / nyquist * M;
    99     }
    100 
    101     for (n = 0; n < fb->n_filters; n++){
    102         /*roll out normalised gain of each peak*/
    103         if (style == XTRACT_EQUAL_GAIN){
    104             height = 1;
    105             norm_fact = norm;
    106         }
    107         else{
    108             height = 2 / (lin_peak[n + 2] - lin_peak[n]);
    109             norm_fact = norm / (2 / (lin_peak[2] - lin_peak[0]));
    110         }
    111         height_norm[n] = height * norm_fact;
    112     }
    113 
    114     i = 0;
    115    
    116     for(n = 0; n < fb->n_filters; n++){
    117  
    118   /*calculate the rise increment*/
    119         if(n > 0)
    120             inc = height_norm[n] / (fft_peak[n] - fft_peak[n - 1]);
    121         else
    122             inc = height_norm[n] / fft_peak[n];
    123         val = 0; 
    124  
    125   /*zero the start of the array*/
    126   for(k = 0; k < i; k++)
    127      //fft_tables[n][k] = 0.f;
    128      fb->filters[n]->data[0][k]=0.f;
    129  
    130   /*fill in the rise */
    131         for(; i <= fft_peak[n]; i++){
    132          // fft_tables[n][i] = val;
    133             fb->filters[n]->data[0][k]=val;
    134             val += inc;
    135         }
    136  
    137         /*calculate the fall increment */
    138         inc = height_norm[n] / (fft_peak[n + 1] - fft_peak[n]);
    139  
    140         val = 0;
    141   next_peak = fft_peak[n + 1];
    142  
    143   /*reverse fill the 'fall' */
    144         for(i = next_peak; i > fft_peak[n]; i--){
    145             //fft_tables[n][i] = val;
    146             fb->filters[n]->data[0][k]=val;
    147             val += inc;
    148         }
    149 
    150   /*zero the rest of the array*/
    151   for(k = next_peak + 1; k < fb->win_s; k++)
    152       //fft_tables[n][k] = 0.f;
    153       fb->filters[n]->data[0][k]=0.f;
    154     }
    155 
    156     free(mel_peak);
    157     free(lin_peak);
    158     free(height_norm);
    159     free(fft_peak);
    160 
    161     //return XTRACT_SUCCESS;
    162 
    163 }
    164 
  • src/mfcc.c

    r4f33dd3 rcfe4038  
    2828#include "math.h"
    2929
     30#define VERY_SMALL_NUMBER 2e-42
     31#define USE_EQUAL_GAIN 1
    3032
    3133
     
    4648
    4749
     50/** filterbank initialization for mel filters
     51
     52  \param fb filterbank, as returned by new_aubio_filterbank method
     53  \param nyquist nyquist frequency, i.e. half of the sampling rate
     54  \param style libxtract style
     55  \param freqmin lowest filter frequency
     56  \param freqmax highest filter frequency
     57
     58*/
     59void aubio_filterbank_mfcc_init(aubio_filterbank_t * fb, smpl_t nyquist, int style, smpl_t freq_min, smpl_t freq_max);
     60
    4861aubio_mfcc_t * new_aubio_mfcc (uint_t win_s, uint_t samplerate ,uint_t n_coefs, smpl_t lowfreq, smpl_t highfreq, uint_t channels){
    49 
    50 
    5162  /** allocating space for mfcc object */
    52  
    5363  aubio_mfcc_t * mfcc = AUBIO_NEW(aubio_mfcc_t);
     64
     65  //we need (n_coefs-1)*2 filters to obtain n_coefs coefficients after dct
     66  uint_t n_filters = (n_coefs-1)*2;
    5467 
    5568  mfcc->win_s=win_s;
     
    6174
    6275  /** filterbank allocation */
    63   //we need (n_coefs-1)*2 filters to obtain n_coefs coefficients after dct
    64   mfcc->fb=new_aubio_filterbank((n_coefs-1)*2, mfcc->win_s);
     76  mfcc->fb = new_aubio_filterbank(n_filters, mfcc->win_s);
    6577
    6678  /** allocating space for fft object (used for dct) */
     
    6880
    6981  /** allocating buffers */
    70  
    7182  mfcc->in_dct=new_fvec(mfcc->win_s, 1);
    7283 
    73   mfcc->fftgrain_dct=new_cvec(mfcc->fb->n_filters, 1);
     84  mfcc->fftgrain_dct=new_cvec(n_filters, 1);
    7485
    7586  /** populating the filterbank */
    76  
    77   aubio_filterbank_mfcc_init(mfcc->fb, (mfcc->samplerate)/2, XTRACT_EQUAL_GAIN, mfcc->lowfreq, mfcc->highfreq);
     87  aubio_filterbank_mfcc_init(mfcc->fb, (mfcc->samplerate)/2, mfcc->lowfreq, mfcc->highfreq);
    7888
    7989  return mfcc;
    80 
    8190};
    8291
    83 
    8492void del_aubio_mfcc(aubio_mfcc_t *mf){
    85  
    8693  /** deleting filterbank */
    8794  del_aubio_filterbank(mf->fb);
     
    94101  /** deleting mfcc object */
    95102  AUBIO_FREE(mf);
    96 
    97 }
    98 
    99 
    100 // Computation
     103}
    101104
    102105void aubio_mfcc_do(aubio_mfcc_t * mf, cvec_t *in, fvec_t *out){
     
    110113            mf->in_dct->data[0][filter_cnt] += in->norm[0][n] * f->filters[filter_cnt]->data[0][n];
    111114        }
    112         mf->in_dct->data[0][filter_cnt] = LOG(mf->in_dct->data[0][filter_cnt] < XTRACT_LOG_LIMIT ? XTRACT_LOG_LIMIT : mf->in_dct->data[0][filter_cnt]);
     115        mf->in_dct->data[0][filter_cnt] = LOG(mf->in_dct->data[0][filter_cnt] < VERY_SMALL_NUMBER ? VERY_SMALL_NUMBER : mf->in_dct->data[0][filter_cnt]);
    113116    }
    114117
     
    118121   
    119122    aubio_dct_do(mf, mf->in_dct, out);
    120    
    121     //return XTRACT_SUCCESS;
     123
     124    return;
    122125}
    123126
    124127void aubio_dct_do(aubio_mfcc_t * mf, fvec_t *in, fvec_t *out){
    125    
    126    
    127    
    128     //fvec_t * momo = new_fvec(20, 1);
    129     //momo->data = data;
    130    
    131128    //compute mag spectrum
    132129    aubio_mfft_do (mf->fft_dct, in, mf->fftgrain_dct);
     
    138135    }
    139136
    140 
    141     //return XTRACT_SUCCESS;
    142 }
    143 
     137    return;
     138}
     139
     140void aubio_filterbank_mfcc_init(aubio_filterbank_t * fb, smpl_t nyquist, int style, smpl_t freq_min, smpl_t freq_max){
     141
     142  int n, i, k, *fft_peak, M, next_peak;
     143  smpl_t norm, mel_freq_max, mel_freq_min, norm_fact, height, inc, val,
     144         freq_bw_mel, *mel_peak, *height_norm, *lin_peak;
     145
     146  mel_peak = height_norm = lin_peak = NULL;
     147  fft_peak = NULL;
     148  norm = 1;
     149
     150  mel_freq_max = 1127 * log(1 + freq_max / 700);
     151  mel_freq_min = 1127 * log(1 + freq_min / 700);
     152  freq_bw_mel = (mel_freq_max - mel_freq_min) / fb->n_filters;
     153
     154  mel_peak = (smpl_t *)malloc((fb->n_filters + 2) * sizeof(smpl_t));
     155  /* +2 for zeros at start and end */
     156  lin_peak = (smpl_t *)malloc((fb->n_filters + 2) * sizeof(smpl_t));
     157  fft_peak = (int *)malloc((fb->n_filters + 2) * sizeof(int));
     158  height_norm = (smpl_t *)malloc(fb->n_filters * sizeof(smpl_t));
     159
     160  if(mel_peak == NULL || height_norm == NULL ||
     161      lin_peak == NULL || fft_peak == NULL)
     162    return NULL;
     163
     164  M = fb->win_s >> 1;
     165
     166  mel_peak[0] = mel_freq_min;
     167  lin_peak[0] = 700 * (exp(mel_peak[0] / 1127) - 1);
     168  fft_peak[0] = lin_peak[0] / nyquist * M;
     169
     170
     171  for (n = 1; n <= fb->n_filters; n++){ 
     172    /*roll out peak locations - mel, linear and linear on fft window scale */
     173    mel_peak[n] = mel_peak[n - 1] + freq_bw_mel;
     174    lin_peak[n] = 700 * (exp(mel_peak[n] / 1127) -1);
     175    fft_peak[n] = lin_peak[n] / nyquist * M;
     176  }
     177
     178  for (n = 0; n < fb->n_filters; n++){
     179    /*roll out normalised gain of each peak*/
     180    if (style == USE_EQUAL_GAIN){
     181      height = 1;
     182      norm_fact = norm;
     183    }
     184    else{
     185      height = 2 / (lin_peak[n + 2] - lin_peak[n]);
     186      norm_fact = norm / (2 / (lin_peak[2] - lin_peak[0]));
     187    }
     188    height_norm[n] = height * norm_fact;
     189  }
     190
     191  i = 0;
     192
     193  for(n = 0; n < fb->n_filters; n++){
     194
     195    /*calculate the rise increment*/
     196    if(n > 0)
     197      inc = height_norm[n] / (fft_peak[n] - fft_peak[n - 1]);
     198    else
     199      inc = height_norm[n] / fft_peak[n];
     200    val = 0; 
     201
     202    /*zero the start of the array*/
     203    for(k = 0; k < i; k++)
     204      //fft_tables[n][k] = 0.f;
     205      fb->filters[n]->data[0][k]=0.f;
     206
     207    /*fill in the rise */
     208    for(; i <= fft_peak[n]; i++){
     209      // fft_tables[n][i] = val;
     210      fb->filters[n]->data[0][k]=val;
     211      val += inc;
     212    }
     213
     214    /*calculate the fall increment */
     215    inc = height_norm[n] / (fft_peak[n + 1] - fft_peak[n]);
     216
     217    val = 0;
     218    next_peak = fft_peak[n + 1];
     219
     220    /*reverse fill the 'fall' */
     221    for(i = next_peak; i > fft_peak[n]; i--){
     222      //fft_tables[n][i] = val;
     223      fb->filters[n]->data[0][k]=val;
     224      val += inc;
     225    }
     226
     227    /*zero the rest of the array*/
     228    for(k = next_peak + 1; k < fb->win_s; k++)
     229      //fft_tables[n][k] = 0.f;
     230      fb->filters[n]->data[0][k]=0.f;
     231  }
     232
     233  free(mel_peak);
     234  free(lin_peak);
     235  free(height_norm);
     236  free(fft_peak);
     237
     238}
     239
Note: See TracChangeset for help on using the changeset viewer.