changeset 257:9619d6995b73

* Add windowing to Chromagram input * Add window option to MFCC config
author Chris Cannam <c.cannam@qmul.ac.uk>
date Fri, 18 Jan 2008 17:57:40 +0000
parents 43943a4382ef
children f49be56d3c4e
files dsp/chromagram/Chromagram.cpp dsp/chromagram/Chromagram.h dsp/chromagram/ConstantQ.cpp dsp/chromagram/ConstantQ.h dsp/mfcc/MFCC.cpp dsp/mfcc/MFCC.h dsp/rhythm/BeatSpectrum.h
diffstat 7 files changed, 37 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/dsp/chromagram/Chromagram.cpp	Fri Jan 18 14:40:20 2008 +0000
+++ b/dsp/chromagram/Chromagram.cpp	Fri Jan 18 17:57:40 2008 +0000
@@ -59,6 +59,9 @@
     m_CQRe  = new double[ m_uK ];
     m_CQIm  = new double[ m_uK ];
 
+    m_window = 0;
+    m_windowbuf = 0;
+
     // Generate CQ Kernel 
     m_ConstantQ->sparsekernel();
     return 1;
@@ -71,6 +74,9 @@
 
 int Chromagram::deInitialise()
 {
+    delete[] m_windowbuf;
+    delete m_window;
+
     delete [] m_chromadata;
 
     delete m_FFT;
@@ -111,15 +117,25 @@
 }
 
 
-double* Chromagram::process( double *data )
+double* Chromagram::process( const double *data )
 {
+    if (!m_window) {
+        m_window = new Window<double>(HammingWindow, m_frameSize);
+        m_windowbuf = new double[m_frameSize];
+    }
+
+    for (int i = 0; i < m_frameSize; ++i) {
+        m_windowbuf[i] = data[i];
+    }
+    m_window->cut(m_windowbuf);
+
     // FFT of current frame
-    m_FFT->process( m_frameSize, 0, data, NULL, m_FFTRe, m_FFTIm ); 
+    m_FFT->process(m_frameSize, 0, m_windowbuf, NULL, m_FFTRe, m_FFTIm);
 
     return process(m_FFTRe, m_FFTIm);
 }
 
-double* Chromagram::process( double *real, double *imag )
+double* Chromagram::process( const double *real, const double *imag )
 {
     // initialise chromadata to 0
     for (unsigned i = 0; i < m_BPO; i++) m_chromadata[i] = 0;
--- a/dsp/chromagram/Chromagram.h	Fri Jan 18 14:40:20 2008 +0000
+++ b/dsp/chromagram/Chromagram.h	Fri Jan 18 17:57:40 2008 +0000
@@ -12,6 +12,7 @@
 #define CHROMAGRAM_H
 
 #include "dsp/transforms/FFT.h"
+#include "base/Window.h"
 #include "ConstantQ.h"
 
 struct ChromaConfig{
@@ -30,8 +31,8 @@
     Chromagram( ChromaConfig Config );
     ~Chromagram();
 	
-    double* process( double *data ); // time domain
-    double* process( double *real, double *imag ); // frequency domain
+    double* process( const double *data ); // time domain
+    double* process( const double *real, const double *imag ); // frequency domain
     void unityNormalise( double* src );
 
     // Complex arithmetic
@@ -45,6 +46,9 @@
 private:
     int initialise( ChromaConfig Config );
     int deInitialise();
+
+    Window<double> *m_window;
+    double *m_windowbuf;
 	
     double* m_chromadata;
     double m_FMin;
--- a/dsp/chromagram/ConstantQ.cpp	Fri Jan 18 14:40:20 2008 +0000
+++ b/dsp/chromagram/ConstantQ.cpp	Fri Jan 18 17:57:40 2008 +0000
@@ -129,7 +129,7 @@
 }
 
 //-----------------------------------------------------------------------------
-double* ConstantQ::process( double* fftdata )
+double* ConstantQ::process( const double* fftdata )
 {
     for (unsigned row=0; row<2*m_uK; row++) 
     {
@@ -188,7 +188,8 @@
     delete [] m_CQdata;
 }
 
-void ConstantQ::process(double *FFTRe, double* FFTIm, double *CQRe, double *CQIm)
+void ConstantQ::process(const double *FFTRe, const double* FFTIm,
+                        double *CQRe, double *CQIm)
 {
     for (unsigned row=0; row<m_uK; row++) 
     {
--- a/dsp/chromagram/ConstantQ.h	Fri Jan 18 14:40:20 2008 +0000
+++ b/dsp/chromagram/ConstantQ.h	Fri Jan 18 17:57:40 2008 +0000
@@ -27,12 +27,13 @@
 	
 //public functions incl. sparsekernel so can keep out of loop in main
 public:
-    void process( double* FFTRe, double* FFTIm, double* CQRe, double* CQIm );
+    void process( const double* FFTRe, const double* FFTIm,
+                  double* CQRe, double* CQIm );
 
     ConstantQ( CQConfig Config );
     ~ConstantQ();
 
-    double* process( double* FFTData );
+    double* process( const double* FFTData );
 
     void sparsekernel();
 
--- a/dsp/mfcc/MFCC.cpp	Fri Jan 18 14:40:20 2008 +0000
+++ b/dsp/mfcc/MFCC.cpp	Fri Jan 18 17:57:40 2008 +0000
@@ -141,7 +141,7 @@
     }
    
     /* The analysis window */
-    window = new Window<double>(HammingWindow, fftSize);
+    window      = new Window<double>(config.window, fftSize);
 
     /* Allocate memory for the FFT */
     imagIn      = (double*)calloc(fftSize, sizeof(double));
--- a/dsp/mfcc/MFCC.h	Fri Jan 18 14:40:20 2008 +0000
+++ b/dsp/mfcc/MFCC.h	Fri Jan 18 17:57:40 2008 +0000
@@ -19,8 +19,10 @@
     int nceps;
     double logpower;
     bool want_c0;
+    WindowType window;
     MFCCConfig(int _FS) :
-        FS(_FS), fftsize(2048), nceps(19), logpower(1.0), want_c0(true) { }
+        FS(_FS), fftsize(2048), nceps(19),
+        logpower(1.0), want_c0(true), window(HammingWindow) { }
 };
 
 class MFCC
--- a/dsp/rhythm/BeatSpectrum.h	Fri Jan 18 14:40:20 2008 +0000
+++ b/dsp/rhythm/BeatSpectrum.h	Fri Jan 18 17:57:40 2008 +0000
@@ -23,8 +23,8 @@
 class BeatSpectrum
 {
 public:
-    BeatSpectrum();
-    ~BeatSpectrum();
+    BeatSpectrum() { }
+    ~BeatSpectrum() { }
 
     std::vector<double> process(const std::vector<std::vector<double> > &inmatrix);