summaryrefslogtreecommitdiff
path: root/libs/qm-dsp/dsp/mfcc/MFCC.h
blob: c162664b793baec5b811d6e777d68cd4563fcf90 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */

/*
    QM DSP Library

    Centre for Digital Music, Queen Mary, University of London.
    This file copyright 2005 Nicolas Chetry, copyright 2008 QMUL.

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation; either version 2 of the
    License, or (at your option) any later version.  See the file
    COPYING included with this distribution for more information.
*/

#ifndef MFCC_H
#define MFCC_H

#include "base/Window.h"

class FFTReal;

struct MFCCConfig {
    int FS;
    int fftsize;
    int nceps;
    double logpower;
    bool want_c0;
    WindowType window;
    MFCCConfig(int _FS) :
        FS(_FS), fftsize(2048), nceps(19),
        logpower(1.0), want_c0(true), window(HammingWindow) { }
};

class MFCC
{
public:
    MFCC(MFCCConfig config);
    virtual ~MFCC();

    /**
     * Process time-domain input data.  inframe must contain
     * getfftlength() samples.  outceps must contain space for nceps
     * values, plus one if want_c0 is specified.
     */
    int process(const double *inframe, double *outceps);

    /**
     * Process time-domain input data.  real and imag must contain
     * getfftlength()/2+1 elements (i.e. the conjugate half of the FFT
     * is not expected).  outceps must contain space for nceps values,
     * plus one if want_c0 is specified.
     */
    int process(const double *real, const double *imag, double *outceps);

    int getfftlength() const { return fftSize; }

private:
    /* Filter bank parameters */
    double  lowestFrequency;
    int     linearFilters;
    double  linearSpacing;
    int     logFilters;
    double  logSpacing;

    /* FFT length */
    int     fftSize;

    int     totalFilters;
    double  logPower;

    /* Misc. */
    int     samplingRate;
    int     nceps;

    /* MFCC vector */
    double  *ceps;

    double  **mfccDCTMatrix;
    double  **mfccFilterWeights;

    /* The analysis window */
    Window<double> *window;

    /* For the FFT */
    double *realOut;
    double *imagOut;
    double *fftMag;
    double *earMag;
    FFTReal *fft;

    /* Set if user want C0 */
    int WANT_C0;
};


#endif