From d79392ecf3f611cf10476d9dabdf39d91097ad00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=8B=D1=87=D0=BA=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Fri, 31 Mar 2017 15:58:45 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/pip@326 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- CMakeLists.txt | 11 +++++++++ src/math/pifft.h | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index c6e8eb60..9a057cae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,7 @@ option(ICU "Unicode support" 1) option(USB "USB support" 0) option(STL "Building with STL containers" 0) option(CRYPT "Crypt support" 0) +option(FFTW "fftw3 support for PIFFT" 1) option(INTROSPECTION_CONTAINERS "Build with containers introspection" 0) option(INTROSPECTION_THREADS "Build with threads introspection" 0) option(LIB "System install" 1) @@ -142,6 +143,16 @@ else () endif () +# Check if PIP support fftw3 for PIFFT using in math module +if (FFTW) + message(STATUS "Building with fftw3 support") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DPIP_FFTW") + list(APPEND LIBS fftw3-3 fftw3f-3 fftw3l-3) +else () + message(STATUS "Building without fftw3 support") +endif () + + # Check if PIP should be built with containers introspection if (INTROSPECTION_CONTAINERS) message(STATUS "Building with containers introspection") diff --git a/src/math/pifft.h b/src/math/pifft.h index 3e91b40a..acf1ae33 100644 --- a/src/math/pifft.h +++ b/src/math/pifft.h @@ -121,4 +121,64 @@ typedef PIFFT_double PIFFT; typedef PIFFT_double PIFFTd; typedef PIFFT_float PIFFTf; + + +// fftw3 realisation +#ifdef PIP_FFTW +#include +#include "fftw3.h" + +template +class PIP_EXPORT PIFFTW +{ +public: + const PIVector > & calcFFT(const PIVector > &in) { + result.resize(in.size()); + p = fftw_plan_dft_1d(in.size_s(), (fftw_complex *)in.data(), (fftw_complex *)result.data(), FFTW_FORWARD, FFTW_ESTIMATE); + fftw_execute(p); + fftw_destroy_plan(p); + return result; + } + const PIVector > & calcFFT(const PIVector &in) { + result.resize(in.size()); + p = fftw_plan_dft_r2c_1d(in.size_s(), (double *)in.data(), (fftw_complex *)result.data(), FFTW_ESTIMATE); + fftw_execute(p); + fftw_destroy_plan(p); + return result; + } + const PIVector > & calcFFTinverse(const PIVector > &in) { + result.resize(in.size()); + p = fftw_plan_dft_1d(in.size_s(), (fftw_complex *)in.data(), (fftw_complex *)result.data(), FFTW_BACKWARD, FFTW_ESTIMATE); + fftw_execute(p); + fftw_destroy_plan(p); + return result; + } + + enum FFT_Operation {fo_real, fo_complex, fo_inverse}; + + void preparePlan(int size, FFT_Operation op) { + PIVector > in(size), out(size); + PIVector inr(size); + switch (op) { + case fo_real: + p = fftw_plan_dft_r2c_1d(in.size_s(), (double *)inr.data(), (fftw_complex *)out.data(), FFTW_MEASURE); + break; + case fo_complex: + p = fftw_plan_dft_1d(in.size_s(), (fftw_complex *)in.data(), (fftw_complex *)out.data(), FFTW_FORWARD, FFTW_MEASURE); + break; + case fo_inverse: + p = fftw_plan_dft_1d(in.size_s(), (fftw_complex *)in.data(), (fftw_complex *)out.data(), FFTW_BACKWARD, FFTW_MEASURE); + break; + } + } + +private: + PIVector > result; + fftw_plan p; +}; + +typedef PIFFTW PIFFTWd; + +#endif // PIP_FFTW + #endif // PIFFT_H