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@14: #define DF_POWER (6) 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@14: bool adaptiveWhitening; // perform adaptive whitening cannam@14: double whiteningRelaxCoeff; // if < 0, a sensible default will be used cannam@14: double whiteningFloor; // if < 0, a sensible default will be used 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@14: void whiten(); 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@14: double phaseDev(unsigned int length, double *srcPhase); cannam@0: double complexSD(unsigned int length, double *srcMagnitude, double *srcPhase); cannam@14: double broadband(unsigned int length, double *srcMagnitude); cannam@14: double power(unsigned int length, double *src); 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@13: double m_stepSecs; cannam@13: unsigned int m_stepSize; cannam@12: double m_dbRise; cannam@14: bool m_whiten; cannam@14: double m_whitenRelaxCoeff; cannam@14: double m_whitenFloor; cannam@0: cannam@2: double* m_magHistory; cannam@2: double* m_phaseHistory; cannam@2: double* m_phaseHistoryOld; cannam@14: double* m_magPeaks; 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