git-svn-id: svn://db.shs.com.ru/pip@329 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user