/*
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