diff dsp/chromagram/ConstantQ.cpp @ 228:b7f01ab7045e

* Give the chromagram an alternative entry point passing in frequency domain data * Centre the Hamming windows and do an fftshift when calculating sparse kernel
author Chris Cannam <c.cannam@qmul.ac.uk>
date Mon, 15 May 2006 15:07:27 +0000
parents 49844bc8a895
children 8bdbda7fb893
line wrap: on
line diff
--- a/dsp/chromagram/ConstantQ.cpp	Mon May 15 11:21:47 2006 +0000
+++ b/dsp/chromagram/ConstantQ.cpp	Mon May 15 15:07:27 2006 +0000
@@ -68,18 +68,36 @@
 	
     for (unsigned k = m_uK; k--; ) 
     {
+        for (unsigned u=0; u < m_FFTLength; u++) 
+        {
+            hammingWindowRe[u] = 0;
+            hammingWindowIm[u] = 0;
+        }
+        
 	// Computing a hamming window
 	const unsigned hammingLength = (int) ceil( m_dQ * m_FS / ( m_FMin * pow(2,((double)(k))/(double)m_BPO)));
+
+        unsigned origin = m_FFTLength/2 - hammingLength/2;
+
 	for (unsigned i=0; i<hammingLength; i++) 
 	{
 	    const double angle = 2*PI*m_dQ*i/hammingLength;
 	    const double real = cos(angle);
 	    const double imag = sin(angle);
 	    const double absol = hamming(hammingLength, i)/hammingLength;
-	    hammingWindowRe[ i ] = absol*real;
-	    hammingWindowIm[ i ] = absol*imag;
+	    hammingWindowRe[ origin + i ] = absol*real;
+	    hammingWindowIm[ origin + i ] = absol*imag;
 	}
 
+        for (unsigned i = 0; i < m_FFTLength/2; ++i) {
+            double temp = hammingWindowRe[i];
+            hammingWindowRe[i] = hammingWindowRe[i + m_FFTLength/2];
+            hammingWindowRe[i + m_FFTLength/2] = temp;
+            temp = hammingWindowIm[i];
+            hammingWindowIm[i] = hammingWindowIm[i + m_FFTLength/2];
+            hammingWindowIm[i + m_FFTLength/2] = temp;
+        }
+    
 	//do fft of hammingWindow
 	m_FFT.process( m_FFTLength, 0, hammingWindowRe, hammingWindowIm, transfHammingWindowRe, transfHammingWindowIm );