git-svn-id: svn://db.shs.com.ru/pip@329 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5

This commit is contained in:
2017-03-31 17:09:03 +00:00
parent b8f0754f88
commit 8b8ce3055e

View File

@@ -127,6 +127,9 @@ typedef PIFFT_float PIFFTf;
#ifdef PIP_FFTW
#include <complex.h>
#include "fftw3.h"
#include "pimutex.h"
static PIMutex __pip_fft_plan_mutex;
template <typename T>
class PIP_EXPORT PIFFTW
@@ -134,21 +137,27 @@ class PIP_EXPORT PIFFTW
public:
const PIVector<complex<T> > & calcFFT(const PIVector<complex<T> > &in) {
result.resize(in.size());
__pip_fft_plan_mutex.lock();
p = fftw_plan_dft_1d(in.size_s(), (fftw_complex *)in.data(), (fftw_complex *)result.data(), FFTW_FORWARD, FFTW_ESTIMATE);
__pip_fft_plan_mutex.unlock();
fftw_execute(p);
fftw_destroy_plan(p);
return result;
}
const PIVector<complex<T> > & calcFFT(const PIVector<T> &in) {
result.resize(in.size());
__pip_fft_plan_mutex.lock();
p = fftw_plan_dft_r2c_1d(in.size_s(), (double *)in.data(), (fftw_complex *)result.data(), FFTW_ESTIMATE);
__pip_fft_plan_mutex.unlock();
fftw_execute(p);
fftw_destroy_plan(p);
return result;
}
const PIVector<complex<T> > & calcFFTinverse(const PIVector<complex<T> > &in) {
result.resize(in.size());
__pip_fft_plan_mutex.lock();
p = fftw_plan_dft_1d(in.size_s(), (fftw_complex *)in.data(), (fftw_complex *)result.data(), FFTW_BACKWARD, FFTW_ESTIMATE);
__pip_fft_plan_mutex.unlock();
fftw_execute(p);
fftw_destroy_plan(p);
return result;
@@ -159,6 +168,7 @@ public:
void preparePlan(int size, FFT_Operation op) {
PIVector<complex<T> > in(size), out(size);
PIVector<T> inr(size);
__pip_fft_plan_mutex.lock();
switch (op) {
case fo_real:
p = fftw_plan_dft_r2c_1d(in.size_s(), (double *)inr.data(), (fftw_complex *)out.data(), FFTW_MEASURE);
@@ -170,6 +180,7 @@ public:
p = fftw_plan_dft_1d(in.size_s(), (fftw_complex *)in.data(), (fftw_complex *)out.data(), FFTW_BACKWARD, FFTW_MEASURE);
break;
}
__pip_fft_plan_mutex.unlock();
}
private: