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
|