ref: 8c4918aeede6ca3a73d61c5a8aa49c4c12f25c9b
parent: ad3770fa5f1372e5908805f6024ef3c4541d13ed
parent: 3aa60b218f34d609937738910ec3a08b8e1105de
author: Paul Brossier <piem@piem.org>
date: Sat Sep 15 14:27:35 EDT 2018
Merge branch 'feature/fastmfcc'
--- 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);
@@ -102,6 +122,9 @@
void
aubio_mfcc_do (aubio_mfcc_t * mf, const cvec_t * in, fvec_t * out)
{
+#ifndef HAVE_SLOW_DCT
+ fvec_t tmp;
+#endif
/* compute filterbank */
aubio_filterbank_do (mf->fb, in, mf->in_dct);
@@ -112,7 +135,16 @@
//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
+ tmp.data = mf->output->data;
+ tmp.length = out->length;
+ fvec_copy(&tmp, out);
+#endif
return;
}