Mercurial > hg > qm-dsp
comparison dsp/chromagram/ConstantQ.cpp @ 3:07ac3de1e53b
* 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 | cannam |
---|---|
date | Mon, 15 May 2006 15:07:27 +0000 |
parents | d7116e3183f8 |
children | 8bdbda7fb893 |
comparison
equal
deleted
inserted
replaced
2:c539af5259da | 3:07ac3de1e53b |
---|---|
66 | 66 |
67 FFT m_FFT; | 67 FFT m_FFT; |
68 | 68 |
69 for (unsigned k = m_uK; k--; ) | 69 for (unsigned k = m_uK; k--; ) |
70 { | 70 { |
71 for (unsigned u=0; u < m_FFTLength; u++) | |
72 { | |
73 hammingWindowRe[u] = 0; | |
74 hammingWindowIm[u] = 0; | |
75 } | |
76 | |
71 // Computing a hamming window | 77 // Computing a hamming window |
72 const unsigned hammingLength = (int) ceil( m_dQ * m_FS / ( m_FMin * pow(2,((double)(k))/(double)m_BPO))); | 78 const unsigned hammingLength = (int) ceil( m_dQ * m_FS / ( m_FMin * pow(2,((double)(k))/(double)m_BPO))); |
79 | |
80 unsigned origin = m_FFTLength/2 - hammingLength/2; | |
81 | |
73 for (unsigned i=0; i<hammingLength; i++) | 82 for (unsigned i=0; i<hammingLength; i++) |
74 { | 83 { |
75 const double angle = 2*PI*m_dQ*i/hammingLength; | 84 const double angle = 2*PI*m_dQ*i/hammingLength; |
76 const double real = cos(angle); | 85 const double real = cos(angle); |
77 const double imag = sin(angle); | 86 const double imag = sin(angle); |
78 const double absol = hamming(hammingLength, i)/hammingLength; | 87 const double absol = hamming(hammingLength, i)/hammingLength; |
79 hammingWindowRe[ i ] = absol*real; | 88 hammingWindowRe[ origin + i ] = absol*real; |
80 hammingWindowIm[ i ] = absol*imag; | 89 hammingWindowIm[ origin + i ] = absol*imag; |
81 } | 90 } |
82 | 91 |
92 for (unsigned i = 0; i < m_FFTLength/2; ++i) { | |
93 double temp = hammingWindowRe[i]; | |
94 hammingWindowRe[i] = hammingWindowRe[i + m_FFTLength/2]; | |
95 hammingWindowRe[i + m_FFTLength/2] = temp; | |
96 temp = hammingWindowIm[i]; | |
97 hammingWindowIm[i] = hammingWindowIm[i + m_FFTLength/2]; | |
98 hammingWindowIm[i + m_FFTLength/2] = temp; | |
99 } | |
100 | |
83 //do fft of hammingWindow | 101 //do fft of hammingWindow |
84 m_FFT.process( m_FFTLength, 0, hammingWindowRe, hammingWindowIm, transfHammingWindowRe, transfHammingWindowIm ); | 102 m_FFT.process( m_FFTLength, 0, hammingWindowRe, hammingWindowIm, transfHammingWindowRe, transfHammingWindowIm ); |
85 | 103 |
86 | 104 |
87 for (unsigned j=0; j<( m_FFTLength ); j++) | 105 for (unsigned j=0; j<( m_FFTLength ); j++) |