Changeset 7a84b21
- Timestamp:
- Sep 17, 2009, 7:54:57 PM (15 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:
- e03f74d
- Parents:
- c185ebb
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/spectral/mfcc.c
rc185ebb r7a84b21 1 1 /* 2 Copyright (C) 2006 Amaury Hazan 3 Ported to aubio from LibXtract 4 http://libxtract.sourceforge.net/ 5 2 Copyright (C) 2007-2009 Paul Brossier <piem@aubio.org> 3 and Amaury Hazan <ahazan@iua.upf.edu> 6 4 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 5 This file is part of Aubio. 11 6 12 This program is distributed in the hope that it will be useful,13 but WITHOUT ANY WARRANTY; without even the implied warranty of14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the15 GNU General Public License for more details.7 Aubio is free software: you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation, either version 3 of the License, or 10 (at your option) any later version. 16 11 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 12 Aubio is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with Aubio. If not, see <http://www.gnu.org/licenses/>. 20 19 21 20 */ … … 28 27 #include "spectral/mfcc.h" 29 28 30 /** Internal structure for mfcc object * */29 /** Internal structure for mfcc object */ 31 30 32 struct aubio_mfcc_t_{ 31 struct aubio_mfcc_t_ 32 { 33 33 uint_t win_s; /** grain length */ 34 34 uint_t samplerate; /** sample rate (needed?) */ 35 35 uint_t n_filters; /** number of *filters */ 36 36 uint_t n_coefs; /** number of coefficients (<= n_filters/2 +1) */ 37 aubio_filterbank_t * fb;/** filter bank */38 fvec_t * in_dct;/** input buffer for dct * [fb->n_filters] */39 fvec_t * dct_coeffs;/** DCT transform n_filters * n_coeffs */37 aubio_filterbank_t *fb; /** filter bank */ 38 fvec_t *in_dct; /** input buffer for dct * [fb->n_filters] */ 39 fvec_t *dct_coeffs; /** DCT transform n_filters * n_coeffs */ 40 40 }; 41 41 42 42 43 aubio_mfcc_t * new_aubio_mfcc (uint_t win_s, uint_t samplerate, uint_t n_filters, uint_t n_coefs){ 43 aubio_mfcc_t * 44 new_aubio_mfcc (uint_t win_s, uint_t samplerate, uint_t n_filters, 45 uint_t n_coefs) 46 { 47 48 /* allocate space for mfcc object */ 49 aubio_mfcc_t *mfcc = AUBIO_NEW (aubio_mfcc_t); 44 50 45 51 uint_t i, j; 46 52 47 /** allocating space for mfcc object */ 48 aubio_mfcc_t * mfcc = AUBIO_NEW(aubio_mfcc_t); 53 mfcc->win_s = win_s; 54 mfcc->samplerate = samplerate; 55 mfcc->n_filters = n_filters; 56 mfcc->n_coefs = n_coefs; 49 57 50 //we need (n_coefs-1)*2 filters to obtain n_coefs coefficients after dct 51 //uint_t n_filters = (n_coefs-1)*2; 52 53 mfcc->win_s=win_s; 54 mfcc->samplerate=samplerate; 55 mfcc->n_filters=n_filters; 56 mfcc->n_coefs=n_coefs; 58 /* filterbank allocation */ 59 mfcc->fb = new_aubio_filterbank (n_filters, mfcc->win_s); 60 aubio_filterbank_set_mel_coeffs_slaney (mfcc->fb, samplerate); 57 61 58 59 /** filterbank allocation */ 60 mfcc->fb = new_aubio_filterbank(n_filters, mfcc->win_s); 61 aubio_filterbank_set_mel_coeffs_slaney(mfcc->fb, samplerate); 62 /* allocating buffers */ 63 mfcc->in_dct = new_fvec (n_filters, 1); 62 64 63 /** allocating buffers */ 64 mfcc->in_dct=new_fvec(n_filters, 1); 65 66 mfcc->dct_coeffs = new_fvec(n_coefs, n_filters); 65 mfcc->dct_coeffs = new_fvec (n_coefs, n_filters); 67 66 68 69 67 /* compute DCT transform dct_coeffs[i][j] as 70 cos ( j * (i+.5) * PI / n_filters ) 71 */ 72 smpl_t scaling = 1./SQRT(n_filters/2.); 73 for (i = 0; i < n_filters; i++) { 68 cos ( j * (i+.5) * PI / n_filters ) */ 69 smpl_t scaling = 1. / SQRT (n_filters / 2.); 70 for (i = 0; i < n_filters; i++) { 74 71 for (j = 0; j < n_coefs; j++) { 75 72 mfcc->dct_coeffs->data[i][j] = 76 scaling * COS (j * (i + 0.5) * PI / n_filters);73 scaling * COS (j * (i + 0.5) * PI / n_filters); 77 74 } 78 mfcc->dct_coeffs->data[i][0] *= SQRT (2.)/2.;75 mfcc->dct_coeffs->data[i][0] *= SQRT (2.) / 2.; 79 76 } 80 77 … … 82 79 }; 83 80 84 void del_aubio_mfcc(aubio_mfcc_t *mf){ 85 /** deleting filterbank */ 86 del_aubio_filterbank(mf->fb); 87 /** deleting buffers */ 88 del_fvec(mf->in_dct); 89 90 /** deleting mfcc object */ 91 AUBIO_FREE(mf); 81 void 82 del_aubio_mfcc (aubio_mfcc_t * mf) 83 { 84 85 /* delete filterbank */ 86 del_aubio_filterbank (mf->fb); 87 88 /* delete buffers */ 89 del_fvec (mf->in_dct); 90 91 /* delete mfcc object */ 92 AUBIO_FREE (mf); 92 93 } 93 94 94 95 95 void aubio_mfcc_do(aubio_mfcc_t * mf, cvec_t *in, fvec_t *out){ 96 void 97 aubio_mfcc_do (aubio_mfcc_t * mf, cvec_t * in, fvec_t * out) 98 { 96 99 uint_t i, j; 97 / / compute filterbank98 aubio_filterbank_do (mf->fb, in, mf->in_dct);100 /* compute filterbank */ 101 aubio_filterbank_do (mf->fb, in, mf->in_dct); 99 102 100 / /extract real part of fft grain101 for (i = 0; i < mf->n_filters; i++) { 103 /* extract real part of fft grain */ 104 for (i = 0; i < mf->n_filters; i++) { 102 105 for (j = 0; j < mf->n_coefs; j++) { 103 106 out->data[0][j] += mf->in_dct->data[0][i] 104 * mf->dct_coeffs->data[i][j];107 * mf->dct_coeffs->data[i][j]; 105 108 } 106 109 }
Note: See TracChangeset
for help on using the changeset viewer.