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
|
#ifdef PIP_FFTW
|
||||||
#include <complex.h>
|
#include <complex.h>
|
||||||
#include "fftw3.h"
|
#include "fftw3.h"
|
||||||
|
#include "pimutex.h"
|
||||||
|
|
||||||
|
static PIMutex __pip_fft_plan_mutex;
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class PIP_EXPORT PIFFTW
|
class PIP_EXPORT PIFFTW
|
||||||
@@ -134,21 +137,27 @@ class PIP_EXPORT PIFFTW
|
|||||||
public:
|
public:
|
||||||
const PIVector<complex<T> > & calcFFT(const PIVector<complex<T> > &in) {
|
const PIVector<complex<T> > & calcFFT(const PIVector<complex<T> > &in) {
|
||||||
result.resize(in.size());
|
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);
|
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_execute(p);
|
||||||
fftw_destroy_plan(p);
|
fftw_destroy_plan(p);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
const PIVector<complex<T> > & calcFFT(const PIVector<T> &in) {
|
const PIVector<complex<T> > & calcFFT(const PIVector<T> &in) {
|
||||||
result.resize(in.size());
|
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);
|
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_execute(p);
|
||||||
fftw_destroy_plan(p);
|
fftw_destroy_plan(p);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
const PIVector<complex<T> > & calcFFTinverse(const PIVector<complex<T> > &in) {
|
const PIVector<complex<T> > & calcFFTinverse(const PIVector<complex<T> > &in) {
|
||||||
result.resize(in.size());
|
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);
|
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_execute(p);
|
||||||
fftw_destroy_plan(p);
|
fftw_destroy_plan(p);
|
||||||
return result;
|
return result;
|
||||||
@@ -159,6 +168,7 @@ public:
|
|||||||
void preparePlan(int size, FFT_Operation op) {
|
void preparePlan(int size, FFT_Operation op) {
|
||||||
PIVector<complex<T> > in(size), out(size);
|
PIVector<complex<T> > in(size), out(size);
|
||||||
PIVector<T> inr(size);
|
PIVector<T> inr(size);
|
||||||
|
__pip_fft_plan_mutex.lock();
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case fo_real:
|
case fo_real:
|
||||||
p = fftw_plan_dft_r2c_1d(in.size_s(), (double *)inr.data(), (fftw_complex *)out.data(), FFTW_MEASURE);
|
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);
|
p = fftw_plan_dft_1d(in.size_s(), (fftw_complex *)in.data(), (fftw_complex *)out.data(), FFTW_BACKWARD, FFTW_MEASURE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
__pip_fft_plan_mutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
Reference in New Issue
Block a user