Changeset cfe4038
- Timestamp:
- Sep 8, 2007, 2:37:02 PM (17 years ago)
- 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
- Location:
- src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/filterbank.c
r4f33dd3 rcfe4038 59 59 } 60 60 61 // Initialization62 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 else122 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 28 28 #include "math.h" 29 29 30 #define VERY_SMALL_NUMBER 2e-42 31 #define USE_EQUAL_GAIN 1 30 32 31 33 … … 46 48 47 49 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 */ 59 void aubio_filterbank_mfcc_init(aubio_filterbank_t * fb, smpl_t nyquist, int style, smpl_t freq_min, smpl_t freq_max); 60 48 61 aubio_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 51 62 /** allocating space for mfcc object */ 52 53 63 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; 54 67 55 68 mfcc->win_s=win_s; … … 61 74 62 75 /** 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); 65 77 66 78 /** allocating space for fft object (used for dct) */ … … 68 80 69 81 /** allocating buffers */ 70 71 82 mfcc->in_dct=new_fvec(mfcc->win_s, 1); 72 83 73 mfcc->fftgrain_dct=new_cvec( mfcc->fb->n_filters, 1);84 mfcc->fftgrain_dct=new_cvec(n_filters, 1); 74 85 75 86 /** 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); 78 88 79 89 return mfcc; 80 81 90 }; 82 91 83 84 92 void del_aubio_mfcc(aubio_mfcc_t *mf){ 85 86 93 /** deleting filterbank */ 87 94 del_aubio_filterbank(mf->fb); … … 94 101 /** deleting mfcc object */ 95 102 AUBIO_FREE(mf); 96 97 } 98 99 100 // Computation 103 } 101 104 102 105 void aubio_mfcc_do(aubio_mfcc_t * mf, cvec_t *in, fvec_t *out){ … … 110 113 mf->in_dct->data[0][filter_cnt] += in->norm[0][n] * f->filters[filter_cnt]->data[0][n]; 111 114 } 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]); 113 116 } 114 117 … … 118 121 119 122 aubio_dct_do(mf, mf->in_dct, out); 120 121 //return XTRACT_SUCCESS;123 124 return; 122 125 } 123 126 124 127 void 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 131 128 //compute mag spectrum 132 129 aubio_mfft_do (mf->fft_dct, in, mf->fftgrain_dct); … … 138 135 } 139 136 140 141 //return XTRACT_SUCCESS; 142 } 143 137 return; 138 } 139 140 void 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.