Merge branch 'master' into feature/fastmfcc
authorPaul Brossier <piem@piem.org>
Sat, 15 Sep 2018 15:34:21 +0000 (17:34 +0200)
committerPaul Brossier <piem@piem.org>
Sat, 15 Sep 2018 15:34:21 +0000 (17:34 +0200)
src/spectral/mfcc.c

index f54799d..0ef7407 100644 (file)
 #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;
 }