21#include <pffft_double.h>
25namespace jsa::cicuetea {
29 DFTImpl(
size_t fftSize) :
32 workData.resize(2 * fftSize);
33 complexSetup = pffftd_new_setup(
int(fftSize), PFFFT_COMPLEX);
34 realSetup = pffftd_new_setup(
int(fftSize), PFFFT_REAL);
35 assert(complexSetup &&
"Complex setup not initialized properly");
36 assert(realSetup &&
"Real setup not initialized properly");
41 if (complexSetup) pffftd_destroy_setup(complexSetup);
42 if (realSetup) pffftd_destroy_setup(realSetup);
45 void dft(
const dcomplex* inPtr, dcomplex* outPtr)
47 double* inPtr_ =
reinterpret_cast<double*
>(
const_cast<dcomplex*
>(inPtr));
48 double* outPtr_ =
reinterpret_cast<double*
>(outPtr);
49 pffftd_transform_ordered(complexSetup, inPtr_, outPtr_, workData.data(), PFFFT_FORWARD);
52 void idft(
const dcomplex* inPtr, dcomplex* outPtr)
54 double* inPtr_ =
reinterpret_cast<double*
>(
const_cast<dcomplex*
>(inPtr));
55 double* outPtr_ =
reinterpret_cast<double*
>(outPtr);
56 pffftd_transform_ordered(complexSetup, inPtr_, outPtr_, workData.data(), PFFFT_BACKWARD);
57 Map<ArrayXcd>(outPtr, fftSize) *= (1.0 / fftSize);
60 void rdft(
const double* inPtr, dcomplex* outPtr)
62 double* inPtr_ =
reinterpret_cast<double*
>(
const_cast<double*
>(inPtr));
63 double* outPtr_ =
reinterpret_cast<double*
>(outPtr);
64 pffftd_transform_ordered(realSetup, inPtr_, outPtr_, workData.data(), PFFFT_FORWARD);
67 void irdft(
const dcomplex* inPtr,
double* outPtr)
69 double* inPtr_ =
reinterpret_cast<double*
>(
const_cast<dcomplex*
>(inPtr));
70 double* outPtr_ =
reinterpret_cast<double*
>(outPtr);
71 pffftd_transform_ordered(realSetup, inPtr_, outPtr_, workData.data(), PFFFT_BACKWARD);
72 Map<ArrayXd>(outPtr, fftSize) *= (1.0 / fftSize);
75 static std::string getName()
82 Eigen::ArrayXd workData;
83 PFFFTD_Setup* complexSetup =
nullptr;
84 PFFFTD_Setup* realSetup =
nullptr;