d@14: /* d@14: ============================================================================== d@1: d@14: FFTW.cpp d@14: Created: 29 Oct 2014 6:30:26pm d@14: Author: david.ronan d@1: d@14: ============================================================================== d@14: */ d@0: #pragma once d@0: d@0: #include "fftw3.h" d@8: #include d@14: d@0: d@0: class FFTW d@0: { d@0: d@0: public: d@0: fftwf_plan m_plan; d@0: unsigned m_iFFTSize; d@0: d@1: FFTW(); d@0: FFTW( unsigned fftLength ) d@0: { d@0: m_iFFTSize = fftLength; d@0: d@4: std::vector tempInput = std::vector(fftLength, 0); d@4: std::vector tempReal = std::vector(fftLength, 0); d@4: std::vector tempImag = std::vector(fftLength, 0); d@4: d@4: d@0: fftwf_iodim dim; d@0: dim.n = fftLength; d@0: dim.is = 1; d@0: dim.os = 1; d@4: m_plan = fftwf_plan_guru_split_dft_r2c( 1, &dim, 0, nullptr, tempInput.data(), tempReal.data(), tempImag.data(), FFTW_ESTIMATE ); d@0: } d@0: d@0: d@0: ~FFTW() d@0: { d@3: if(m_plan != nullptr) d@0: { d@0: fftwf_destroy_plan( m_plan ); d@0: } d@0: } d@0: d@0: d@4: void process(std::vector input, std::vector &realPart, std::vector &imagPart) d@0: { d@4: d@4: fftwf_execute_split_dft_r2c( m_plan, input.data(), realPart.data(), imagPart.data()); d@0: d@0: //Multiply results by 2 to match the iOS output d@0: for(size_t i = 0; i < m_iFFTSize; i++) d@1: { d@0: realPart[i] *= 2.f; d@0: imagPart[i] *= 2.f; d@0: } d@0: } d@0: d@0: }; d@0: