27 DFTImpl(
size_t fftSize) :
30 unsigned int flags = FFTW_ESTIMATE | FFTW_PRESERVE_INPUT;
32 r2cPlan = fftw_plan_dft_r2c_1d(
int(fftSize),
nullptr,
nullptr, flags);
33 c2rPlan = fftw_plan_dft_c2r_1d(
int(fftSize),
nullptr,
nullptr, flags);
34 c2cPlan = fftw_plan_dft_1d(
int(fftSize),
nullptr,
nullptr, FFTW_FORWARD, flags);
35 ic2cPlan = fftw_plan_dft_1d(
int(fftSize),
nullptr,
nullptr, FFTW_BACKWARD, flags);
40 if (r2cPlan) fftw_destroy_plan(r2cPlan);
41 if (c2rPlan) fftw_destroy_plan(c2rPlan);
42 if (c2cPlan) fftw_destroy_plan(c2cPlan);
43 if (ic2cPlan) fftw_destroy_plan(ic2cPlan);
46 void dft(
const dcomplex* inPtr, dcomplex* outPtr)
48 fftw_complex* inPtr_ =
reinterpret_cast<fftw_complex*
>(
const_cast<dcomplex*
>(inPtr));
49 fftw_complex* outPtr_ =
reinterpret_cast<fftw_complex*
>(outPtr);
50 fftw_execute_dft(c2cPlan, inPtr_, outPtr_);
53 void idft(
const dcomplex* inPtr, dcomplex* outPtr)
55 fftw_complex* inPtr_ =
reinterpret_cast<fftw_complex*
>(
const_cast<dcomplex*
>(inPtr));
56 fftw_complex* outPtr_ =
reinterpret_cast<fftw_complex*
>(outPtr);
57 fftw_execute_dft(ic2cPlan, inPtr_, outPtr_);
58 Map<ArrayXcd>(outPtr, fftSize) *= (1.0 / fftSize);
61 void rdft(
const double* inPtr, dcomplex* outPtr)
63 double* inPtr_ =
const_cast<double*
>(inPtr);
64 fftw_complex* outPtr_ =
reinterpret_cast<fftw_complex*
>(outPtr);
65 fftw_execute_dft_r2c(r2cPlan, inPtr_, outPtr_);
68 void irdft(
const dcomplex* inPtr,
double* outPtr)
70 fftw_complex* inPtr_ =
reinterpret_cast<fftw_complex*
>(
const_cast<dcomplex*
>(inPtr));
71 fftw_execute_dft_c2r(c2rPlan, inPtr_, outPtr);
72 Map<ArrayXd>(outPtr, fftSize) *= (1.0 / fftSize);
75 static const std::string getName()
82 fftw_plan r2cPlan =
nullptr;
83 fftw_plan c2rPlan =
nullptr;
84 fftw_plan c2cPlan =
nullptr;
85 fftw_plan ic2cPlan =
nullptr;