/* PIP - Platform Independent Primitives Class for FFT, IFFT and Hilbert transformations Andrey Bychkov work.a.b@yandex.ru, Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #include "pifft.h" #ifdef PIP_HAS_FFT # define POCKETFFT_NO_MULTITHREADING # define POCKETFFT_CACHE_SIZE 32 # include "3rd/pocketfft/pocketfft_hdronly.h" // FFT with PocketFFT template class PocketFFT { public: PocketFFT() { stride_out[0] = sizeof(complex); } void c2c(const PIVector> & in, PIVector> & out, bool direction) { stride_in[0] = sizeof(complex); shape[0] = in.size(); out.resize(in.size()); pocketfft::c2c(shape, stride_in, stride_out, axes, direction, in.data(), out.data(), 1.); } void r2c(const PIVector & in, PIVector> & out, bool direction) { stride_in[0] = sizeof(T); shape[0] = in.size(); out.resize(in.size()); pocketfft::r2c(shape, stride_in, stride_out, axes, direction, in.data(), out.data(), 1.); } pocketfft::shape_t shape{1}, axes{0}; pocketfft::stride_t stride_in{0}, stride_out{0}; }; PRIVATE_DEFINITION_START(PIFFT) PocketFFT pfft; PRIVATE_DEFINITION_END(PIFFT) PRIVATE_DEFINITION_START(PIFFT) PocketFFT pfft; PRIVATE_DEFINITION_END(PIFFT) PRIVATE_DEFINITION_START(PIFFT) PocketFFT pfft; PRIVATE_DEFINITION_END(PIFFT) const PIVector> & PIFFT::calcFFT(const PIVector> & in) { PRIVATE->pfft.c2c(in, m_result, pocketfft::FORWARD); return m_result; } const PIVector> & PIFFT::calcFFT(const PIVector & in) { PRIVATE->pfft.r2c(in, m_result, pocketfft::FORWARD); return m_result; } const PIVector> & PIFFT::calcFFTinverse(const PIVector> & in) { PRIVATE->pfft.c2c(in, m_result, pocketfft::BACKWARD); return m_result; } const PIVector> & PIFFT::calcFFT(const PIVector> & in) { PRIVATE->pfft.c2c(in, m_result, pocketfft::FORWARD); return m_result; } const PIVector> & PIFFT::calcFFT(const PIVector & in) { PRIVATE->pfft.r2c(in, m_result, pocketfft::FORWARD); return m_result; } const PIVector> & PIFFT::calcFFTinverse(const PIVector> & in) { PRIVATE->pfft.c2c(in, m_result, pocketfft::BACKWARD); return m_result; } const PIVector> & PIFFT::calcFFT(const PIVector> & in) { PRIVATE->pfft.c2c(in, m_result, pocketfft::FORWARD); return m_result; } const PIVector> & PIFFT::calcFFT(const PIVector & in) { PRIVATE->pfft.r2c(in, m_result, pocketfft::FORWARD); return m_result; } const PIVector> & PIFFT::calcFFTinverse(const PIVector> & in) { PRIVATE->pfft.c2c(in, m_result, pocketfft::BACKWARD); return m_result; } #endif // PIP_HAS_FFT