From d8b116187410e34448847af9a2df9269625b4538 Mon Sep 17 00:00:00 2001 From: Paul Brossier Date: Wed, 22 Aug 2018 15:51:37 +0200 Subject: [PATCH] src/spectral/mfcc.c: use dct to compute mfcc --- src/spectral/mfcc.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/spectral/mfcc.c b/src/spectral/mfcc.c index f54799d3..0ef7407f 100644 --- a/src/spectral/mfcc.c +++ b/src/spectral/mfcc.c @@ -28,8 +28,11 @@ #include "spectral/fft.h" #include "spectral/filterbank.h" #include "spectral/filterbank_mel.h" +#include "spectral/dct.h" #include "spectral/mfcc.h" +#undef HAVE_SLOW_DCT + /** Internal structure for mfcc object */ struct _aubio_mfcc_t @@ -40,7 +43,12 @@ struct _aubio_mfcc_t uint_t n_coefs; /** number of coefficients (<= n_filters/2 +1) */ aubio_filterbank_t *fb; /** filter bank */ fvec_t *in_dct; /** input buffer for dct * [fb->n_filters] */ +#if defined(HAVE_SLOW_DCT) fmat_t *dct_coeffs; /** DCT transform n_filters * n_coeffs */ +#else + aubio_dct_t *dct; + fvec_t *output; +#endif }; @@ -51,9 +59,11 @@ new_aubio_mfcc (uint_t win_s, uint_t n_filters, uint_t n_coefs, /* allocate space for mfcc object */ aubio_mfcc_t *mfcc = AUBIO_NEW (aubio_mfcc_t); +#if defined(HAVE_SLOW_DCT) smpl_t scaling; uint_t i, j; +#endif mfcc->win_s = win_s; mfcc->samplerate = samplerate; @@ -67,6 +77,7 @@ new_aubio_mfcc (uint_t win_s, uint_t n_filters, uint_t n_coefs, /* allocating buffers */ mfcc->in_dct = new_fvec (n_filters); +#if defined(HAVE_SLOW_DCT) mfcc->dct_coeffs = new_fmat (n_coefs, n_filters); /* compute DCT transform dct_coeffs[j][i] as @@ -79,6 +90,10 @@ new_aubio_mfcc (uint_t win_s, uint_t n_filters, uint_t n_coefs, } mfcc->dct_coeffs->data[0][i] *= SQRT (2.) / 2.; } +#else + mfcc->dct = new_aubio_dct (n_filters); + mfcc->output = new_fvec (n_filters); +#endif return mfcc; } @@ -92,7 +107,12 @@ del_aubio_mfcc (aubio_mfcc_t * mf) /* delete buffers */ del_fvec (mf->in_dct); +#if defined(HAVE_SLOW_DCT) del_fmat (mf->dct_coeffs); +#else + del_aubio_dct (mf->dct); + del_fvec (mf->output); +#endif /* delete mfcc object */ AUBIO_FREE (mf); @@ -112,7 +132,17 @@ aubio_mfcc_do (aubio_mfcc_t * mf, const cvec_t * in, fvec_t * out) //fvec_pow (mf->in_dct, 3.); /* compute mfccs */ +#if defined(HAVE_SLOW_DCT) fmat_vecmul(mf->dct_coeffs, mf->in_dct, out); +#else + aubio_dct_do(mf->dct, mf->in_dct, mf->output); + // copy only first n_coeffs elements + // TODO assert mf->output->length == n_coeffs + fvec_t tmp; + tmp.data = mf->output->data; + tmp.length = out->length; + fvec_copy(&tmp, out); +#endif return; } -- 2.11.0