CiCueTea v0.0.1
Loading...
Searching...
No Matches
FFT_FFTW.h
Go to the documentation of this file.
1//
2// FFT_FFTW.h
3// CQTDSP
4//
5// Created by Juan Sierra on 4/8/25.
6//
7
15
16#pragma once
17
18#include <Eigen/Core>
19#include <fftw3.h>
20
21using namespace Eigen;
22
23namespace jsa::cicuetea {
24class DFTImpl
25{
26 public:
27 DFTImpl(size_t fftSize) :
28 fftSize(fftSize)
29 {
30 unsigned int flags = FFTW_ESTIMATE | FFTW_PRESERVE_INPUT;
31
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);
36 }
37
38 ~DFTImpl()
39 {
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);
44 }
45
46 void dft(const dcomplex* inPtr, dcomplex* outPtr)
47 {
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_);
51 }
52
53 void idft(const dcomplex* inPtr, dcomplex* outPtr)
54 {
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);
59 }
60
61 void rdft(const double* inPtr, dcomplex* outPtr)
62 {
63 double* inPtr_ = const_cast<double*>(inPtr);
64 fftw_complex* outPtr_ = reinterpret_cast<fftw_complex*>(outPtr);
65 fftw_execute_dft_r2c(r2cPlan, inPtr_, outPtr_);
66 }
67
68 void irdft(const dcomplex* inPtr, double* outPtr)
69 {
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);
73 }
74
75 static const std::string getName()
76 {
77 return "FFTW";
78 }
79
80 private:
81 const size_t fftSize;
82 fftw_plan r2cPlan = nullptr;
83 fftw_plan c2rPlan = nullptr;
84 fftw_plan c2cPlan = nullptr;
85 fftw_plan ic2cPlan = nullptr;
86};
87} // namespace jsa::cicuetea