Mercurial > hg > qm-dsp
diff dsp/transforms/FFT.cpp @ 84:e5907ae6de17
* Add GPL and README; some tidying
author | Chris Cannam |
---|---|
date | Mon, 13 Dec 2010 14:55:28 +0000 |
parents | 769da847732b |
children | f6ccde089491 |
line wrap: on
line diff
--- a/dsp/transforms/FFT.cpp Wed Dec 01 14:05:25 2010 +0000 +++ b/dsp/transforms/FFT.cpp Mon Dec 13 14:55:28 2010 +0000 @@ -15,10 +15,6 @@ #include <iostream> -//#define USE_BUILTIN_FFT 1 - -#ifdef USE_BUILTIN_FFT - FFT::FFT(unsigned int n) : m_n(n), m_private(0) @@ -183,135 +179,3 @@ } } -#else - -#include "kissfft/kiss_fft.h" -#include "kissfft/kiss_fftr.h" - -struct KissFFTRec { - kiss_fft_cfg forward; - kiss_fft_cfg inverse; - kiss_fft_cpx *in; - kiss_fft_cpx *out; -}; - -FFT::FFT(unsigned int n) : - m_n(n), - m_private(0) -{ - if (m_n & 1) { - std::cerr << "Error: Odd FFT size " << m_n - << " not supported in this implementation" - << std::endl; - return; - } - KissFFTRec *rec = new KissFFTRec; - rec->forward = kiss_fft_alloc(m_n, 0, 0, 0); - rec->inverse = kiss_fft_alloc(m_n, 1, 0, 0); - rec->in = new kiss_fft_cpx[m_n]; - rec->out = new kiss_fft_cpx[m_n]; - m_private = rec; -} - -FFT::~FFT() -{ - if (!m_private) return; - KissFFTRec *rec = (KissFFTRec *)m_private; - kiss_fft_free(rec->forward); - kiss_fft_free(rec->inverse); - delete[] rec->in; - delete[] rec->out; -} - -void -FFT::process(bool inverse, - const double *rin, const double *iin, - double *rout, double *iout) -{ - if (!m_private) return; - KissFFTRec *rec = (KissFFTRec *)m_private; - for (int i = 0; i < m_n; ++i) { - rec->in[i].r = rin[i]; - } - if (iin) { - for (int i = 0; i < m_n; ++i) { - rec->in[i].i = iin[i]; - } - } else { - for (int i = 0; i < m_n; ++i) { - rec->in[i].i = 0.0; - } - } - if (inverse) { - kiss_fft(rec->inverse, rec->in, rec->out); - } else { - kiss_fft(rec->forward, rec->in, rec->out); - } - for (int i = 0; i < m_n; ++i) { - rout[i] = rec->out[i].r; - iout[i] = rec->out[i].i; - } -} - -struct KissFFTRealRec { - kiss_fftr_cfg forward; - kiss_fftr_cfg inverse; - kiss_fft_cpx *out; -}; - -FFTReal::FFTReal(unsigned int n) : - m_n(n), - m_private(0) -{ - if (m_n & 1) { - std::cerr << "Error: Odd FFT size " << m_n - << " not supported in this implementation" - << std::endl; - return; - } - KissFFTRealRec *rec = new KissFFTRealRec; - rec->forward = kiss_fftr_alloc(m_n, 0, 0, 0); - rec->inverse = kiss_fftr_alloc(m_n, 1, 0, 0); - rec->out = new kiss_fft_cpx[m_n]; - m_private = rec; -} - -FFTReal::~FFTReal() -{ - if (!m_private) return; - KissFFTRealRec *rec = (KissFFTRealRec *)m_private; - kiss_fftr_free(rec->forward); - kiss_fftr_free(rec->inverse); - delete[] rec->out; -} - -void -FFTReal::process(bool inverse, - const double *rin, - double *rout, double *iout) -{ - if (!m_private) return; - KissFFTRealRec *rec = (KissFFTRealRec *)m_private; - if (inverse) { - kiss_fftr(rec->inverse, rin, rec->out); - for (int i = 0; i < m_n; ++i) { - rout[i] = rec->out[i].r; - iout[i] = rec->out[i].i; - } - } else { - kiss_fftr(rec->forward, rin, rec->out); - rout[0] = rec->out[0].r; - iout[0] = rec->out[0].i; - for (int i = 1; i < m_n/2; ++i) { - rout[m_n-i] = rout[i] = rec->out[i].r; - } - for (int i = 1; i < m_n/2; ++i) { - iout[i] = rec->out[i].i; - iout[m_n-i] = -iout[i]; - } - rout[m_n/2] = rec->out[m_n/2].r; - iout[m_n/2] = rec->out[m_n/2].i; - } -} - -#endif