CiCueTea v0.0.1
Loading...
Searching...
No Matches
FFT_PFFFT.h
Go to the documentation of this file.
1//
2// FFT_PFFFT.h
3// CQTDSP
4//
5// Created by Juan Sierra on 4/8/25.
6//
7
15
16#pragma once
17
18#include <cassert>
19
20#include <Eigen/Core>
21#include <pffft_double.h>
22
23using namespace Eigen;
24
25namespace jsa::cicuetea {
26class DFTImpl
27{
28 public:
29 DFTImpl(size_t fftSize) :
30 fftSize(fftSize)
31 {
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");
37 }
38
39 ~DFTImpl()
40 {
41 if (complexSetup) pffftd_destroy_setup(complexSetup);
42 if (realSetup) pffftd_destroy_setup(realSetup);
43 }
44
45 void dft(const dcomplex* inPtr, dcomplex* outPtr)
46 {
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);
50 }
51
52 void idft(const dcomplex* inPtr, dcomplex* outPtr)
53 {
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);
58 }
59
60 void rdft(const double* inPtr, dcomplex* outPtr)
61 {
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);
65 }
66
67 void irdft(const dcomplex* inPtr, double* outPtr)
68 {
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);
73 }
74
75 static std::string getName()
76 {
77 return "PFFFT";
78 }
79
80 private:
81 const size_t fftSize;
82 Eigen::ArrayXd workData;
83 PFFFTD_Setup* complexSetup = nullptr;
84 PFFFTD_Setup* realSetup = nullptr;
85};
86} // namespace jsa::cicuetea
Definition FFT_FFTW.h:25