ref: 423a4272b831482a4c088fd035a16d132ab11ddc
parent: 54966f53234f1cfaf3aa8079cfdba67ce20c411b
author: Paul Brossier <piem@piem.org>
date: Tue Dec 11 10:30:49 EST 2018
[tests] improve test-mfcc (closes #219)
--- a/tests/src/spectral/test-mfcc.c
+++ b/tests/src/spectral/test-mfcc.c
@@ -1,13 +1,89 @@
#include <aubio.h>
+#include "utils_tests.h"
-int main (void)
+int test_wrong_params(void);
+
+int main (int argc, char** argv)
{
+ sint_t err = 0;
+
+ if (argc < 2) {
+ err = 2;
+ PRINT_WRN("no arguments, running tests\n");
+ err = test_wrong_params();
+ PRINT_MSG("usage: %s <input_path> [samplerate] [hop_size]\n", argv[0]);
+ return err;
+ }
+
+ uint_t win_s; // fft size
+ uint_t hop_s = 256; // block size
+ uint_t samplerate = 0; // samplerate
+ uint_t n_filters = 40; // number of filters
+ uint_t n_coeffs = 13; // number of coefficients
+ uint_t read = 0;
+
+ char_t *source_path = argv[1];
+
+ if ( argc >= 3 ) samplerate = atoi(argv[2]);
+ if ( argc >= 4 ) hop_s = atoi(argv[3]);
+
+ win_s = 2 * hop_s;
+
+ aubio_source_t *source = 0;
+ aubio_pvoc_t *pv = 0;
+ aubio_mfcc_t *mfcc = 0;
+
+ fvec_t *in = new_fvec (win_s); // input buffer
+ cvec_t *fftgrain = new_cvec (win_s); // input buffer
+ fvec_t *out = new_fvec (n_coeffs); // output coefficients
+
+ if (!in || !fftgrain || !out) { err = 1; goto failure; }
+
+ // source
+ source = new_aubio_source(source_path, samplerate, hop_s);
+ if (!source) { err = 1; goto failure; }
+ if (samplerate == 0) samplerate = aubio_source_get_samplerate(source);
+
+ // phase vocoder
+ pv = new_aubio_pvoc(win_s, hop_s);
+ if (!pv) { err = 1; goto failure; }
+
+ // mfcc object
+ mfcc = new_aubio_mfcc (win_s, n_filters, n_coeffs, samplerate);
+ if (!mfcc) { err = 1; goto failure; }
+
+ // processing loop
+ do {
+ aubio_source_do(source, in, &read);
+ aubio_pvoc_do(pv, in, fftgrain);
+ aubio_mfcc_do(mfcc, fftgrain, out);
+ fvec_print(out);
+ } while (read == hop_s);
+
+failure:
+
+ if (mfcc)
+ del_aubio_mfcc(mfcc);
+ if (pv)
+ del_aubio_pvoc(pv);
+ if (source)
+ del_aubio_source(source);
+ if (in)
+ del_fvec(in);
+ if (fftgrain)
+ del_cvec(fftgrain);
+ if (out)
+ del_fvec(out);
+ aubio_cleanup();
+ return err;
+}
+
+int test_wrong_params()
+{
uint_t win_s = 512; // fft size
uint_t n_filters = 40; // number of filters
uint_t n_coeffs = 13; // number of coefficients
smpl_t samplerate = 16000.; // samplerate
- cvec_t *in = new_cvec (win_s); // input buffer
- fvec_t *out = new_fvec (n_coeffs); // output coefficients
if (new_aubio_mfcc( 0, n_filters, n_coeffs, samplerate)) return 1;
if (new_aubio_mfcc(win_s, 0, n_coeffs, samplerate)) return 1;
@@ -14,22 +90,5 @@
if (new_aubio_mfcc(win_s, n_filters, 0, samplerate)) return 1;
if (new_aubio_mfcc(win_s, n_filters, n_coeffs, 0)) return 1;
- // create mfcc object
- aubio_mfcc_t *o = new_aubio_mfcc (win_s, n_filters, n_coeffs, samplerate);
-
- cvec_norm_set_all (in, 1.);
- aubio_mfcc_do (o, in, out);
- fvec_print (out);
-
- cvec_norm_set_all (in, .5);
- aubio_mfcc_do (o, in, out);
- fvec_print (out);
-
- // clean up
- del_aubio_mfcc (o);
- del_cvec (in);
- del_fvec (out);
- aubio_cleanup ();
-
- return 0;
+ return run_on_default_source(main);
}