shithub: aubio

Download patch

ref: d8b116187410e34448847af9a2df9269625b4538
parent: 3beacb38cc3ea159fb66bcc2c2bd675d5678996c
author: Paul Brossier <piem@piem.org>
date: Wed Aug 22 11:51:37 EDT 2018

src/spectral/mfcc.c: use dct to compute mfcc

--- 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 @@
   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 @@
 
   /* 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 @@
   /* 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 @@
     }
     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 @@
 
   /* 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 @@
   //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;
 }