annotate dsp/onsets/DetectionFunction.cpp @ 0:d7116e3183f8

* Queen Mary C++ DSP library
author cannam
date Wed, 05 Apr 2006 17:35:59 +0000
parents
children c539af5259da
rev   line source
cannam@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@0 2
cannam@0 3 /*
cannam@0 4 QM DSP Library
cannam@0 5
cannam@0 6 Centre for Digital Music, Queen Mary, University of London.
cannam@0 7 This file copyright 2005-2006 Christian Landone.
cannam@0 8 All rights reserved.
cannam@0 9 */
cannam@0 10
cannam@0 11 #include "DetectionFunction.h"
cannam@0 12
cannam@0 13 //////////////////////////////////////////////////////////////////////
cannam@0 14 // Construction/Destruction
cannam@0 15 //////////////////////////////////////////////////////////////////////
cannam@0 16
cannam@0 17 DetectionFunction::DetectionFunction( DFConfig Config ) :
cannam@0 18 m_window(0)
cannam@0 19 {
cannam@0 20 magHistory = NULL;
cannam@0 21 phaseHistory = NULL;
cannam@0 22 phaseHistoryOld = NULL;
cannam@0 23 j = ComplexData( 0, 1 );
cannam@0 24
cannam@0 25 initialise( Config );
cannam@0 26 }
cannam@0 27
cannam@0 28 DetectionFunction::~DetectionFunction()
cannam@0 29 {
cannam@0 30 deInitialise();
cannam@0 31 }
cannam@0 32
cannam@0 33
cannam@0 34 void DetectionFunction::initialise( DFConfig Config )
cannam@0 35 {
cannam@0 36 m_dataLength = Config.frameLength;
cannam@0 37 m_halfLength = m_dataLength/2;
cannam@0 38 m_DFType = Config.DFType;
cannam@0 39
cannam@0 40 magHistory = new double[ m_halfLength ];
cannam@0 41 memset(magHistory,0, m_halfLength*sizeof(double));
cannam@0 42
cannam@0 43 phaseHistory = new double[ m_halfLength ];
cannam@0 44 memset(phaseHistory,0, m_halfLength*sizeof(double));
cannam@0 45
cannam@0 46 phaseHistoryOld = new double[ m_halfLength ];
cannam@0 47 memset(phaseHistoryOld,0, m_halfLength*sizeof(double));
cannam@0 48
cannam@0 49 m_phaseVoc = new PhaseVocoder;
cannam@0 50
cannam@0 51 m_DFWindowedFrame = new double[ m_dataLength ];
cannam@0 52 m_magnitude = new double[ m_halfLength ];
cannam@0 53 m_thetaAngle = new double[ m_halfLength ];
cannam@0 54
cannam@0 55 m_window = new Window<double>(HanningWindow, m_dataLength);
cannam@0 56 }
cannam@0 57
cannam@0 58 void DetectionFunction::deInitialise()
cannam@0 59 {
cannam@0 60 delete [] magHistory ;
cannam@0 61 delete [] phaseHistory ;
cannam@0 62 delete [] phaseHistoryOld ;
cannam@0 63
cannam@0 64 delete m_phaseVoc;
cannam@0 65
cannam@0 66 delete [] m_DFWindowedFrame;
cannam@0 67 delete [] m_magnitude;
cannam@0 68 delete [] m_thetaAngle;
cannam@0 69
cannam@0 70 delete m_window;
cannam@0 71 }
cannam@0 72
cannam@0 73 double DetectionFunction::process( double *TDomain )
cannam@0 74 {
cannam@0 75 double retVal = 0;
cannam@0 76
cannam@0 77 m_window->cut( TDomain, m_DFWindowedFrame );
cannam@0 78
cannam@0 79 m_phaseVoc->process( m_dataLength, m_DFWindowedFrame, m_magnitude, m_thetaAngle );
cannam@0 80
cannam@0 81 switch( m_DFType )
cannam@0 82 {
cannam@0 83 case DF_HFC:
cannam@0 84 retVal = HFC( m_halfLength, m_magnitude);
cannam@0 85 break;
cannam@0 86
cannam@0 87 case DF_SPECDIFF:
cannam@0 88 retVal = specDiff( m_halfLength, m_magnitude);
cannam@0 89 break;
cannam@0 90
cannam@0 91 case DF_PHASEDEV:
cannam@0 92 retVal = phaseDev( m_halfLength, m_magnitude, m_thetaAngle);
cannam@0 93 break;
cannam@0 94
cannam@0 95 case DF_COMPLEXSD:
cannam@0 96 retVal = complexSD( m_halfLength, m_magnitude, m_thetaAngle);
cannam@0 97 break;
cannam@0 98 }
cannam@0 99
cannam@0 100 return retVal;
cannam@0 101 }
cannam@0 102
cannam@0 103 double DetectionFunction::HFC(unsigned int length, double *src)
cannam@0 104 {
cannam@0 105 unsigned int i;
cannam@0 106 double val = 0;
cannam@0 107
cannam@0 108 for( i = 0; i < length; i++)
cannam@0 109 {
cannam@0 110 val += src[ i ] * ( i + 1);
cannam@0 111 }
cannam@0 112 return val;
cannam@0 113 }
cannam@0 114
cannam@0 115 double DetectionFunction::specDiff(unsigned int length, double *src)
cannam@0 116 {
cannam@0 117 unsigned int i;
cannam@0 118 double val = 0.0;
cannam@0 119 double temp = 0.0;
cannam@0 120 double diff = 0.0;
cannam@0 121
cannam@0 122 for( i = 0; i < length; i++)
cannam@0 123 {
cannam@0 124 temp = fabs( (src[ i ] * src[ i ]) - (magHistory[ i ] * magHistory[ i ]) );
cannam@0 125
cannam@0 126 diff= sqrt(temp);
cannam@0 127
cannam@0 128 if( src[ i ] > 0.1)
cannam@0 129 {
cannam@0 130 val += diff;
cannam@0 131 }
cannam@0 132
cannam@0 133 magHistory[ i ] = src[ i ];
cannam@0 134 }
cannam@0 135
cannam@0 136 return val;
cannam@0 137 }
cannam@0 138
cannam@0 139
cannam@0 140 double DetectionFunction::phaseDev(unsigned int length, double *srcMagnitude, double *srcPhase)
cannam@0 141 {
cannam@0 142 unsigned int i;
cannam@0 143 double tmpPhase = 0;
cannam@0 144 double tmpVal = 0;
cannam@0 145 double val = 0;
cannam@0 146
cannam@0 147 double dev = 0;
cannam@0 148
cannam@0 149 for( i = 0; i < length; i++)
cannam@0 150 {
cannam@0 151 tmpPhase = (srcPhase[ i ]- 2*phaseHistory[ i ]+phaseHistoryOld[ i ]);
cannam@0 152 dev = MathUtilities::princarg( tmpPhase );
cannam@0 153
cannam@0 154 if( srcMagnitude[ i ] > 0.1)
cannam@0 155 {
cannam@0 156 tmpVal = fabs( dev);
cannam@0 157 val += tmpVal ;
cannam@0 158 }
cannam@0 159
cannam@0 160 phaseHistoryOld[ i ] = phaseHistory[ i ] ;
cannam@0 161 phaseHistory[ i ] = srcPhase[ i ];
cannam@0 162 }
cannam@0 163
cannam@0 164
cannam@0 165 return val;
cannam@0 166 }
cannam@0 167
cannam@0 168
cannam@0 169 double DetectionFunction::complexSD(unsigned int length, double *srcMagnitude, double *srcPhase)
cannam@0 170 {
cannam@0 171 unsigned int i;
cannam@0 172 double val = 0;
cannam@0 173 double tmpPhase = 0;
cannam@0 174 double tmpReal = 0;
cannam@0 175 double tmpImag = 0;
cannam@0 176
cannam@0 177 double dev = 0;
cannam@0 178 ComplexData meas = ComplexData( 0, 0 );
cannam@0 179
cannam@0 180 for( i = 0; i < length; i++)
cannam@0 181 {
cannam@0 182 tmpPhase = (srcPhase[ i ]- 2*phaseHistory[ i ]+phaseHistoryOld[ i ]);
cannam@0 183 dev= MathUtilities::princarg( tmpPhase );
cannam@0 184
cannam@0 185 meas = magHistory[i] - ( srcMagnitude[ i ] * exp( j * dev) );
cannam@0 186
cannam@0 187 tmpReal = real( meas );
cannam@0 188 tmpImag = imag( meas );
cannam@0 189
cannam@0 190 val += sqrt( (tmpReal * tmpReal) + (tmpImag * tmpImag) );
cannam@0 191
cannam@0 192 phaseHistoryOld[ i ] = phaseHistory[ i ] ;
cannam@0 193 phaseHistory[ i ] = srcPhase[ i ];
cannam@0 194 magHistory[ i ] = srcMagnitude[ i ];
cannam@0 195 }
cannam@0 196
cannam@0 197 return val;
cannam@0 198 }
cannam@0 199
cannam@0 200 double* DetectionFunction::getSpectrumMagnitude()
cannam@0 201 {
cannam@0 202 return m_magnitude;
cannam@0 203 }
cannam@0 204