annotate dsp/mfcc/MFCC.h @ 30:a251fb0de594

* Make MFCC able to accept already-FFT'd input, and simplify API a bit * Add log power value to MFCC, restore windowing, and avoid some heap allocs * In HMM, bail out of iteration if loglik hits NaN
author cannam
date Fri, 18 Jan 2008 13:24:12 +0000
parents d096a79fa772
children 8bb764969d50
rev   line source
cannam@26 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@25 2
cannam@26 3 /*
cannam@26 4 QM DSP Library
cannam@25 5
cannam@26 6 Centre for Digital Music, Queen Mary, University of London.
cannam@26 7 This file copyright 2005 Nicolas Chetry, copyright 2008 QMUL.
cannam@26 8 All rights reserved.
cannam@26 9 */
cannam@25 10
cannam@26 11 #ifndef MFCC_H
cannam@26 12 #define MFCC_H
cannam@26 13
cannam@26 14 #include "base/Window.h"
cannam@26 15
cannam@26 16 struct MFCCConfig {
cannam@26 17 int FS;
cannam@26 18 int fftsize;
cannam@26 19 int nceps;
cannam@30 20 double logpower;
cannam@26 21 bool want_c0;
cannam@30 22 MFCCConfig(int _FS) :
cannam@30 23 FS(_FS), fftsize(2048), nceps(19), logpower(1.0), want_c0(true) { }
cannam@26 24 };
cannam@26 25
cannam@26 26 class MFCC
cannam@26 27 {
cannam@26 28 public:
cannam@26 29 MFCC(MFCCConfig config);
cannam@26 30 virtual ~MFCC();
cannam@26 31
cannam@30 32 /**
cannam@30 33 * Process time-domain input data. inframe must contain
cannam@30 34 * getfftlength() samples. outceps must contain space for nceps
cannam@30 35 * values, plus one if want_c0 is specified.
cannam@30 36 */
cannam@30 37 int process(const double *inframe, double *outceps);
cannam@30 38
cannam@30 39 /**
cannam@30 40 * Process time-domain input data. real and imag must contain
cannam@30 41 * getfftlength()/2+1 elements (i.e. the conjugate half of the FFT
cannam@30 42 * is not expected). outceps must contain space for nceps values,
cannam@30 43 * plus one if want_c0 is specified.
cannam@30 44 */
cannam@30 45 int process(const double *real, const double *imag, double *outceps);
cannam@26 46
cannam@26 47 int getfftlength() const { return fftSize; }
cannam@26 48
cannam@26 49 private:
cannam@26 50 /* Filter bank parameters */
cannam@26 51 double lowestFrequency;
cannam@26 52 int linearFilters;
cannam@26 53 double linearSpacing;
cannam@26 54 int logFilters;
cannam@26 55 double logSpacing;
cannam@26 56
cannam@26 57 /* FFT length */
cannam@26 58 int fftSize;
cannam@26 59
cannam@26 60 int totalFilters;
cannam@30 61 double logPower;
cannam@26 62
cannam@26 63 /* Misc. */
cannam@26 64 int samplingRate;
cannam@26 65 int nceps;
cannam@26 66
cannam@26 67 /* MFCC vector */
cannam@26 68 double *ceps;
cannam@26 69
cannam@26 70 double **mfccDCTMatrix;
cannam@26 71 double **mfccFilterWeights;
cannam@26 72
cannam@26 73 /* The analysis window */
cannam@26 74 Window<double> *window;
cannam@26 75
cannam@26 76 /* For the FFT */
cannam@30 77 double *imagIn; // always zero
cannam@30 78 double *realOut;
cannam@30 79 double *imagOut;
cannam@30 80 double *fftMag;
cannam@30 81 double *earMag;
cannam@30 82
cannam@26 83 /* Set if user want C0 */
cannam@26 84 int WANT_C0;
cannam@26 85 };
cannam@26 86
cannam@25 87
cannam@25 88 #endif
cannam@25 89