comparison dsp/chromagram/Chromagram.cpp @ 467:1db23b9a8da4

Fix mismatch between time- and frequency-domain versions of the chromagram process method - the frequency-domain one expects fftshifted input and the kernel is set up for that, but the time-domain one wasn't doing it
author Chris Cannam <cannam@all-day-breakfast.com>
date Wed, 29 May 2019 15:56:30 +0100
parents 46375e6d1b54
children a72d98f8baa3
comparison
equal deleted inserted replaced
466:46375e6d1b54 467:1db23b9a8da4
119 src[ i ] = val; 119 src[ i ] = val;
120 } 120 }
121 } 121 }
122 122
123 123
124 double* Chromagram::process( const double *data ) 124 double *Chromagram::process(const double *data)
125 { 125 {
126 if (!m_skGenerated) { 126 if (!m_skGenerated) {
127 // Generate CQ Kernel 127 // Generate CQ Kernel
128 m_ConstantQ->sparsekernel(); 128 m_ConstantQ->sparsekernel();
129 m_skGenerated = true; 129 m_skGenerated = true;
137 for (int i = 0; i < m_frameSize; ++i) { 137 for (int i = 0; i < m_frameSize; ++i) {
138 m_windowbuf[i] = data[i]; 138 m_windowbuf[i] = data[i];
139 } 139 }
140 m_window->cut(m_windowbuf); 140 m_window->cut(m_windowbuf);
141 141
142 // The frequency-domain version expects pre-fftshifted input - so
143 // we must do the same here
144 for (int i = 0; i < m_frameSize/2; ++i) {
145 double tmp = m_windowbuf[i];
146 m_windowbuf[i] = m_windowbuf[i + m_frameSize/2];
147 m_windowbuf[i + m_frameSize/2] = tmp;
148 }
149
142 m_FFT->forward(m_windowbuf, m_FFTRe, m_FFTIm); 150 m_FFT->forward(m_windowbuf, m_FFTRe, m_FFTIm);
143 151
144 return process(m_FFTRe, m_FFTIm); 152 return process(m_FFTRe, m_FFTIm);
145 } 153 }
146 154
147 double* Chromagram::process( const double *real, const double *imag ) 155 double *Chromagram::process(const double *real, const double *imag)
148 { 156 {
149 if (!m_skGenerated) { 157 if (!m_skGenerated) {
150 // Generate CQ Kernel 158 // Generate CQ Kernel
151 m_ConstantQ->sparsekernel(); 159 m_ConstantQ->sparsekernel();
152 m_skGenerated = true; 160 m_skGenerated = true;