Mercurial > hg > qm-dsp
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) |