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;
}