comparison dsp/onsets/DetectionFunction.cpp @ 344:5eb9c2387108

Phase vocoder: provide time-domain and freq-domain inputs separately; update tests etc
author Chris Cannam <c.cannam@qmul.ac.uk>
date Thu, 03 Oct 2013 12:58:36 +0100
parents c99d83236f0d
children b0e98fcfacd7
comparison
equal deleted inserted replaced
343:24d8ea972643 344:5eb9c2387108
61 memset(m_phaseHistoryOld,0, m_halfLength*sizeof(double)); 61 memset(m_phaseHistoryOld,0, m_halfLength*sizeof(double));
62 62
63 m_magPeaks = new double[ m_halfLength ]; 63 m_magPeaks = new double[ m_halfLength ];
64 memset(m_magPeaks,0, m_halfLength*sizeof(double)); 64 memset(m_magPeaks,0, m_halfLength*sizeof(double));
65 65
66 // See note in process(const double *) below 66 // See note in processTimeDomain below
67 int actualLength = MathUtilities::previousPowerOfTwo(m_dataLength); 67 int actualLength = MathUtilities::previousPowerOfTwo(m_dataLength);
68 m_phaseVoc = new PhaseVocoder(actualLength, m_stepSize); 68 m_phaseVoc = new PhaseVocoder(actualLength, m_stepSize);
69 69
70 m_DFWindowedFrame = new double[ m_dataLength ];
71 m_magnitude = new double[ m_halfLength ]; 70 m_magnitude = new double[ m_halfLength ];
72 m_thetaAngle = new double[ m_halfLength ]; 71 m_thetaAngle = new double[ m_halfLength ];
73 m_unwrapped = new double[ m_halfLength ]; 72 m_unwrapped = new double[ m_halfLength ];
74 73
75 m_window = new Window<double>(HanningWindow, m_dataLength); 74 m_window = new Window<double>(HanningWindow, m_dataLength);
75 m_windowed = new double[ m_dataLength ];
76 } 76 }
77 77
78 void DetectionFunction::deInitialise() 78 void DetectionFunction::deInitialise()
79 { 79 {
80 delete [] m_magHistory ; 80 delete [] m_magHistory ;
82 delete [] m_phaseHistoryOld ; 82 delete [] m_phaseHistoryOld ;
83 delete [] m_magPeaks ; 83 delete [] m_magPeaks ;
84 84
85 delete m_phaseVoc; 85 delete m_phaseVoc;
86 86
87 delete [] m_DFWindowedFrame;
88 delete [] m_magnitude; 87 delete [] m_magnitude;
89 delete [] m_thetaAngle; 88 delete [] m_thetaAngle;
89 delete [] m_windowed;
90 delete [] m_unwrapped;
90 91
91 delete m_window; 92 delete m_window;
92 } 93 }
93 94
94 double DetectionFunction::process( const double *TDomain ) 95 double DetectionFunction::processTimeDomain(const double *samples)
95 { 96 {
96 m_window->cut( TDomain, m_DFWindowedFrame ); 97 m_window->cut(samples, m_windowed);
97 98
98 // Our own FFT implementation supports power-of-two sizes only. 99 // Our own FFT implementation supports power-of-two sizes only.
99 // If we have to use this implementation (as opposed to the 100 // If we have to use this implementation (as opposed to the
100 // version of process() below that operates on frequency domain 101 // version of process() below that operates on frequency domain
101 // data directly), we will have to use the next smallest power of 102 // data directly), we will have to use the next smallest power of
110 m_magnitude[i] = 0; 111 m_magnitude[i] = 0;
111 m_thetaAngle[0] = 0; 112 m_thetaAngle[0] = 0;
112 } 113 }
113 } 114 }
114 115
115 m_phaseVoc->process(m_DFWindowedFrame, m_magnitude, 116 m_phaseVoc->processTimeDomain(m_windowed,
116 m_thetaAngle, m_unwrapped); 117 m_magnitude, m_thetaAngle, m_unwrapped);
117 118
118 if (m_whiten) whiten(); 119 if (m_whiten) whiten();
119 120
120 return runDF(); 121 return runDF();
121 } 122 }
122 123
123 double DetectionFunction::process( const double *magnitudes, const double *phases ) 124 double DetectionFunction::processFrequencyDomain(const double *reals,
124 { 125 const double *imags)
125 for (size_t i = 0; i < m_halfLength; ++i) { 126 {
126 m_magnitude[i] = magnitudes[i]; 127 m_phaseVoc->processFrequencyDomain(reals, imags,
127 m_thetaAngle[i] = phases[i]; 128 m_magnitude, m_thetaAngle, m_unwrapped);
128 }
129 129
130 if (m_whiten) whiten(); 130 if (m_whiten) whiten();
131 131
132 return runDF(); 132 return runDF();
133 } 133 }
238 238
239 m_phaseHistoryOld[ i ] = m_phaseHistory[ i ] ; 239 m_phaseHistoryOld[ i ] = m_phaseHistory[ i ] ;
240 m_phaseHistory[ i ] = srcPhase[ i ]; 240 m_phaseHistory[ i ] = srcPhase[ i ];
241 } 241 }
242 242
243
244 return val; 243 return val;
245 } 244 }
246 245
247 246
248 double DetectionFunction::complexSD(unsigned int length, double *srcMagnitude, double *srcPhase) 247 double DetectionFunction::complexSD(unsigned int length, double *srcMagnitude, double *srcPhase)