cannam@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ cannam@0: cannam@0: /* cannam@0: QM DSP Library cannam@0: cannam@0: Centre for Digital Music, Queen Mary, University of London. cannam@0: This file copyright 2005-2006 Christian Landone. cannam@0: All rights reserved. cannam@0: */ cannam@0: cannam@0: #ifndef DETECTIONFUNCTION_H cannam@0: #define DETECTIONFUNCTION_H cannam@0: cannam@0: #include "dsp/maths/MathUtilities.h" cannam@0: #include "dsp/maths/MathAliases.h" cannam@0: #include "dsp/phasevocoder/PhaseVocoder.h" cannam@0: #include "base/Window.h" cannam@0: cannam@0: #define DF_HFC (1) cannam@0: #define DF_SPECDIFF (2) cannam@0: #define DF_PHASEDEV (3) cannam@0: #define DF_COMPLEXSD (4) cannam@12: #define DF_BROADBAND (5) cannam@0: cannam@0: struct DFConfig{ cannam@0: double stepSecs; // DF step in seconds cannam@0: unsigned int stepSize; // DF step in samples cannam@0: unsigned int frameLength; // DF analysis window - usually 2*step cannam@0: int DFType; // type of detection function ( see defines ) cannam@12: double dbRise; // only used for broadband df (and required for it) cannam@0: }; cannam@0: cannam@0: class DetectionFunction cannam@0: { cannam@0: public: cannam@0: double* getSpectrumMagnitude(); cannam@0: DetectionFunction( DFConfig Config ); cannam@0: virtual ~DetectionFunction(); cannam@0: double process( double* TDomain ); cannam@2: double process( double* magnitudes, double* phases ); cannam@0: cannam@0: private: cannam@2: double runDF(); cannam@2: cannam@0: double HFC( unsigned int length, double* src); cannam@0: double specDiff( unsigned int length, double* src); cannam@0: double phaseDev(unsigned int length, double *srcMagnitude, double *srcPhase); cannam@0: double complexSD(unsigned int length, double *srcMagnitude, double *srcPhase); cannam@12: double broadband(unsigned int length, double *srcMagnitude, double *srcPhase); cannam@0: cannam@0: private: cannam@0: void initialise( DFConfig Config ); cannam@0: void deInitialise(); cannam@0: cannam@0: int m_DFType; cannam@0: unsigned int m_dataLength; cannam@0: unsigned int m_halfLength; cannam@12: double m_dbRise; cannam@0: cannam@2: double* m_magHistory; cannam@2: double* m_phaseHistory; cannam@2: double* m_phaseHistoryOld; cannam@0: cannam@0: double* m_DFWindowedFrame; // Array for windowed analysis frame cannam@0: double* m_magnitude; // Magnitude of analysis frame ( frequency domain ) cannam@0: double* m_thetaAngle;// Phase of analysis frame ( frequency domain ) cannam@0: cannam@0: Window *m_window; cannam@2: PhaseVocoder* m_phaseVoc; // Phase Vocoder cannam@0: }; cannam@0: cannam@0: #endif