Mercurial > hg > svcore
diff data/fft/FFTapi.h @ 1126:39019ce29178 tony-2.0-integration
Merge through to branch for Tony 2.0
author | Chris Cannam |
---|---|
date | Thu, 20 Aug 2015 14:54:21 +0100 |
parents | b66734b5f806 |
children | db946591a391 |
line wrap: on
line diff
--- a/data/fft/FFTapi.h Fri Aug 14 18:16:14 2015 +0100 +++ b/data/fft/FFTapi.h Thu Aug 20 14:54:21 2015 +0100 @@ -50,5 +50,48 @@ #endif +#include <vector> +#include <complex> + +class FFTForward // with fft shift but not window +{ +public: + FFTForward(int size) : + m_size(size), + m_input((float *)fftf_malloc(size * sizeof(float))), + m_output((fftf_complex *)fftf_malloc((size/2 + 1) * sizeof(fftf_complex))), + m_plan(fftf_plan_dft_r2c_1d(size, m_input, m_output, FFTW_MEASURE)) + { } + + ~FFTForward() { + fftf_destroy_plan(m_plan); + fftf_free(m_input); + fftf_free(m_output); + } + + std::vector<std::complex<float> > process(std::vector<float> in) const { + const int hs = m_size/2; + for (int i = 0; i < hs; ++i) { + m_input[i] = in[i + hs]; + } + for (int i = 0; i < hs; ++i) { + m_input[i + hs] = in[i]; + } + fftf_execute(m_plan); + std::vector<std::complex<float> > result; + result.reserve(hs + 1); + for (int i = 0; i <= hs; ++i) { + result.push_back({ m_output[i][0], m_output[i][1] }); + } + return result; + } + +private: + int m_size; + float *m_input; + fftf_complex *m_output; + fftf_plan m_plan; +}; + #endif