Mercurial > hg > svcore
diff data/fft/FFTDataServer.cpp @ 203:11e107062a2b
* Fix apparent (but not actual) failure to save session file
* Fix doofusness in FFT model (N/2 vs N/2+1) -- need to review use of
this model in spectrogram
author | Chris Cannam |
---|---|
date | Fri, 08 Dec 2006 18:17:29 +0000 |
parents | 91fdc752e540 |
children | 05154c7bb90b |
line wrap: on
line diff
--- a/data/fft/FFTDataServer.cpp Fri Nov 17 16:27:39 2006 +0000 +++ b/data/fft/FFTDataServer.cpp Fri Dec 08 18:17:29 2006 +0000 @@ -344,7 +344,7 @@ size_t end = m_model->getEndFrame(); m_width = (end - start) / m_windowIncrement + 1; - m_height = m_fftSize / 2; + m_height = m_fftSize / 2 + 1; // DC == 0, Nyquist == fftsize/2 size_t maxCacheSize = 20 * 1024 * 1024; size_t columnSize = m_height * sizeof(fftsample) * 2 + sizeof(fftsample); @@ -401,10 +401,10 @@ fftwf_malloc(fftSize * sizeof(fftsample)); m_fftOutput = (fftwf_complex *) - fftwf_malloc(fftSize * sizeof(fftwf_complex)); + fftwf_malloc((fftSize/2 + 1) * sizeof(fftwf_complex)); m_workbuffer = (float *) - fftwf_malloc(fftSize * sizeof(float)); + fftwf_malloc((fftSize+2) * sizeof(float)); m_fftPlan = fftwf_plan_dft_r2c_1d(m_fftSize, m_fftInput, @@ -784,7 +784,7 @@ fftsample factor = 0.0; - for (size_t i = 0; i < m_fftSize/2; ++i) { + for (size_t i = 0; i <= m_fftSize/2; ++i) { fftsample mag = sqrtf(m_fftOutput[i][0] * m_fftOutput[i][0] + m_fftOutput[i][1] * m_fftOutput[i][1]); @@ -796,12 +796,12 @@ phase = princargf(phase); m_workbuffer[i] = mag; - m_workbuffer[i + m_fftSize/2] = phase; + m_workbuffer[i + m_fftSize/2+1] = phase; } cache->setColumnAt(col, m_workbuffer, - m_workbuffer + m_fftSize/2, + m_workbuffer + m_fftSize/2+1, factor); if (m_suspended) {