Changes in / [7a46bf6:ef1c3b7]
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
examples/aubiomfcc.c
r7a46bf6 ref1c3b7 87 87 int main(int argc, char **argv) { 88 88 // params 89 //uint_t n_filters = 40; 90 //uint_t n_coefs = 15; 91 89 92 90 examples_common_init(argc,argv); 93 91 smpl_t lowfreq = 133.333f; … … 97 95 //populating the filter 98 96 mfcc = new_aubio_mfcc(buffer_size, samplerate, n_filters, n_coefs , lowfreq, highfreq, channels); 99 97 dump_filterbank(mfcc); 98 100 99 //process 101 100 examples_common_process(aubio_process,process_print); -
src/filterbank.c
r7a46bf6 ref1c3b7 57 57 aubio_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){ 58 58 59 uint_t writelog=1;60 61 FILE * mlog;62 if(writelog==1) mlog=fopen("filterbank.txt","w");63 64 65 59 smpl_t nyquist = samplerate/2.; 66 60 uint_t style = 1; … … 152 146 fb->filters[n]->data[0][k]=0.f; 153 147 154 if(writelog){155 //dumping filter values156 smpl_t area_tmp=0.f;157 for(k = 0; k < fb->win_s; k++){158 fprintf(mlog,"%f ",fb->filters[n]->data[0][k]);159 }160 fprintf(mlog,"\n");161 }162 148 163 149 } … … 168 154 free(fft_peak); 169 155 156 157 return fb; 158 159 } 160 161 162 aubio_filterbank_t * new_aubio_filterbank_mfcc2(uint_t n_filters, uint_t win_s, smpl_t samplerate, smpl_t freq_min, smpl_t freq_max){ 163 164 //slaney params 165 smpl_t lowestFrequency = 133.3333; 166 smpl_t linearSpacing = 66.66666666; 167 smpl_t logSpacing = 1.0711703; 168 169 uint_t linearFilters = 13; 170 uint_t logFilters = 27; 171 uint_t allFilters = linearFilters + logFilters; 172 173 //buffers for computing filter frequencies 174 fvec_t * freqs=new_fvec( allFilters +2 , 1); 175 fvec_t * lower_freqs=new_fvec( allFilters, 1); 176 fvec_t * upper_freqs=new_fvec( allFilters, 1); 177 fvec_t * center_freqs=new_fvec( allFilters, 1); 178 fvec_t * triangle_heights=new_fvec( allFilters, 1); 179 //lookup table of each bin frequency in hz 180 fvec_t * fft_freqs=(win_s, 1); 181 182 uint_t filter_cnt, bin_cnt; 183 184 //first: filling all the linear filter frequencies 185 for(filter_cnt=0; filter_cnt<linearFilters; filter_cnt++){ 186 freqs[0][filter_cnt]=lowestFrequency+ filter_cnt*linearSpacing; 187 } 188 smpl_t lastlinearCF=freqs[0][filter_cnt-1]; 189 190 //second: filling all the log filter frequencies 191 for(filter_cnt=0; filter_cnt<logFilters+2; filter_cnt++){ 192 freqs[filter_cnt+linearFilters]=lastlinearCF*(pow(logSpacing,filter_cnt+1)); 193 } 194 //TODO: check if the referencing above works! 195 lower_freqs->data=freqs->data; 196 center_freqs->data=&(freqs->data[1]); 197 upper_freqs->data=&(freqs->data[2]); 198 199 //computing triangle heights so that each triangle has unit area 200 for(filter_cnt=0; filter_cnt<allFilters; filter_cnt++){ 201 triangle_heights[filter_cnt]=2./(upper_freqs[filter_cnt]-lower_freqs[filter_cnt]); 202 } 203 204 //filling the lookup table, which assign the frequency in hz to each bin 205 for(bin_cnt=0; bin_cnt<win_s; bin_cnt++){ 206 //TODO: check the formula! 207 fft_freqs[bin_cnt]=((smpl_t) bin_cnt/(smpl_t) win_s)* (smpl_t) samplerate; 208 } 209 210 //building each filter 211 for(filter_cnt=0; filter_cnt<allFilters; filter_cnt++){ 212 //finding bins corresponding to lower, center, and upper frequencies 213 214 for(bin_cnt=0; bin_cnt<; bin_cnt++) 215 fb->filters[filter_cnt]->data[0][bin_cnt]=0.f; 216 } 217 218 // xtract 219 smpl_t nyquist = samplerate/2.; 220 uint_t style = 1; 221 aubio_filterbank_t * fb = new_aubio_filterbank(n_filters, win_s); 222 223 uint_t n, i, k, *fft_peak, M, next_peak; 224 smpl_t norm, mel_freq_max, mel_freq_min, norm_fact, height, inc, val, 225 freq_bw_mel, *mel_peak, *height_norm, *lin_peak; 226 227 mel_peak = height_norm = lin_peak = NULL; 228 fft_peak = NULL; 229 norm = 1; 230 231 mel_freq_max = 1127 * log(1 + freq_max / 700); 232 mel_freq_min = 1127 * log(1 + freq_min / 700); 233 freq_bw_mel = (mel_freq_max - mel_freq_min) / fb->n_filters; 234 235 mel_peak = (smpl_t *)malloc((fb->n_filters + 2) * sizeof(smpl_t)); 236 /* +2 for zeros at start and end */ 237 lin_peak = (smpl_t *)malloc((fb->n_filters + 2) * sizeof(smpl_t)); 238 fft_peak = (uint_t *)malloc((fb->n_filters + 2) * sizeof(uint_t)); 239 height_norm = (smpl_t *)malloc(fb->n_filters * sizeof(smpl_t)); 240 241 if(mel_peak == NULL || height_norm == NULL || 242 lin_peak == NULL || fft_peak == NULL) 243 return NULL; 244 245 M = fb->win_s >> 1; 246 247 mel_peak[0] = mel_freq_min; 248 lin_peak[0] = 700 * (exp(mel_peak[0] / 1127) - 1); 249 fft_peak[0] = lin_peak[0] / nyquist * M; 250 251 for (n = 1; n <= fb->n_filters; n++){ 252 /*roll out peak locations - mel, linear and linear on fft window scale */ 253 mel_peak[n] = mel_peak[n - 1] + freq_bw_mel; 254 lin_peak[n] = 700 * (exp(mel_peak[n] / 1127) -1); 255 fft_peak[n] = lin_peak[n] / nyquist * M; 256 } 257 258 for (n = 0; n < fb->n_filters; n++){ 259 /*roll out normalised gain of each peak*/ 260 if (style == USE_EQUAL_GAIN){ 261 height = 1; 262 norm_fact = norm; 263 } 264 else{ 265 height = 2 / (lin_peak[n + 2] - lin_peak[n]); 266 norm_fact = norm / (2 / (lin_peak[2] - lin_peak[0])); 267 } 268 height_norm[n] = height * norm_fact; 269 } 270 271 i = 0; 272 273 for(n = 0; n < fb->n_filters; n++){ 274 275 /*calculate the rise increment*/ 276 if(n > 0) 277 inc = height_norm[n] / (fft_peak[n] - fft_peak[n - 1]); 278 else 279 inc = height_norm[n] / fft_peak[n]; 280 val = 0; 281 282 /*zero the start of the array*/ 283 for(k = 0; k < i; k++) 284 fb->filters[n]->data[0][k]=0.f; 285 286 /*fill in the rise */ 287 for(; i <= fft_peak[n]; i++){ 288 fb->filters[n]->data[0][k]=val; 289 val += inc; 290 } 291 292 /*calculate the fall increment */ 293 inc = height_norm[n] / (fft_peak[n + 1] - fft_peak[n]); 294 295 val = 0; 296 next_peak = fft_peak[n + 1]; 297 298 /*reverse fill the 'fall' */ 299 for(i = next_peak; i > fft_peak[n]; i--){ 300 fb->filters[n]->data[0][k]=val; 301 val += inc; 302 } 303 304 /*zero the rest of the array*/ 305 for(k = next_peak + 1; k < fb->win_s; k++) 306 fb->filters[n]->data[0][k]=0.f; 307 308 309 } 310 311 free(mel_peak); 312 free(lin_peak); 313 free(height_norm); 314 free(fft_peak); 315 316 317 return fb; 318 319 } 320 321 void aubio_dump_filterbank(aubio_filterbank_t * fb){ 322 323 FILE * mlog; 324 mlog=fopen("filterbank.txt","w"); 325 326 int k,n; 327 //dumping filter values 328 //smpl_t area_tmp=0.f; 329 for(n = 0; n < fb->n_filters; n++){ 330 for(k = 0; k < fb->win_s; k++){ 331 fprintf(mlog,"%f ",fb->filters[n]->data[0][k]); 332 } 333 fprintf(mlog,"\n"); 334 } 335 170 336 if(mlog) fclose(mlog); 171 172 return fb; 173 174 } 175 337 } 176 338 177 339 void del_aubio_filterbank(aubio_filterbank_t * fb){ -
src/filterbank.h
r7a46bf6 ref1c3b7 46 46 /** filterbank initialization for mel filters 47 47 48 \param nyquist nyquist frequency, i.e. half of the sampling rate 49 \param style libxtract style 50 \param freqmin lowest filter frequency 51 \param freqmax highest filter frequency 48 49 \param n_filters number of filters 50 \param win_s window size 51 \param samplerate 52 \param freq_min lowest filter frequency 53 \param freq_max highest filter frequency 52 54 53 55 */ 54 56 aubio_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); 57 58 /** filterbank initialization for mel filters 59 60 \param n_filters number of filters 61 \param win_s window size 62 \param samplerate 63 \param freq_min lowest filter frequency 64 \param freq_max highest filter frequency 65 66 */ 67 aubio_filterbank_t * new_aubio_filterbank_mfcc_2(uint_t n_filters, uint_t win_s, smpl_t samplerate, smpl_t freq_min, smpl_t freq_max); 55 68 56 69 … … 67 80 void aubio_filterbank_do(aubio_filterbank_t * fb, cvec_t * in, fvec_t *out); 68 81 82 /** dump filterbank filter tables in a txt file 83 84 */ 85 void aubio_dump_filterbank(aubio_filterbank_t * fb); 86 69 87 #ifdef __cplusplus 70 88 } -
src/mfcc.c
r7a46bf6 ref1c3b7 112 112 } 113 113 114 //a bit a kludge 115 void dump_filterbank(aubio_mfcc_t * mf){ 116 aubio_dump_filterbank(mf->fb); 117 118 } 119 -
src/mfcc.h
r7a46bf6 ref1c3b7 70 70 void aubio_dct_do(aubio_mfcc_t * mf, fvec_t *in, fvec_t *out); 71 71 72 /** dump filterbank to log file 73 74 \param mf mfcc object as returned by new_aubio_mfcc 75 76 */ 77 void dump_filterbank(aubio_mfcc_t * mf); 78 72 79 #ifdef __cplusplus 73 80 }
Note: See TracChangeset
for help on using the changeset viewer.