oILAB
Loading...
Searching...
No Matches
FFT.h
Go to the documentation of this file.
1//
2// Created by Nikhil Chandra Admal on 6/23/23.
3//
4
5#ifndef OILAB_FFT_H
6#define OILAB_FFT_H
7
8#include <Eigen/Dense>
9#include <unsupported/Eigen/FFT>
10#include <unsupported/Eigen/CXX11/Tensor>
11
12class FFT : public Eigen::FFT<double>
13{
14public:
15 using dcomplex= std::complex<double>;
16 // 3 dimensions
17 static void fft(const Eigen::Tensor<dcomplex,3>& in, Eigen::Tensor<dcomplex,3>& out)
18 {
19 out.setZero();
20 Eigen::FFT<double> fft;
21 for (int k = 0; k < in.dimension(0); k++)
22 {
23 for (int l = 0; l < in.dimension(1); l++)
24 {
25 Eigen::Tensor<dcomplex,1> tmpOutVector(in.dimension(2));
26 tmpOutVector.setZero();
27 FFT::fft(in.chip(k,0).chip(l,0),tmpOutVector);
28 out.chip(k,0).chip(l,0)= tmpOutVector;
29 }
30 }
31
32 for (int k = 0; k < in.dimension(1); k++)
33 {
34 for (int l = 0; l < in.dimension(2); l++)
35 {
36 Eigen::Tensor<dcomplex,1> tmpOutVector(in.dimension(0));
37 tmpOutVector.setZero();
38 FFT::fft(out.chip(k,1).chip(l,1),tmpOutVector);
39 out.chip(k,1).chip(l,1)= tmpOutVector;
40 }
41 }
42
43 for (int k = 0; k < in.dimension(0); k++)
44 {
45 for (int l = 0; l < in.dimension(2); l++)
46 {
47 Eigen::Tensor<dcomplex,1> tmpOutVector(in.dimension(0));
48 tmpOutVector.setZero();
49 FFT::fft(out.chip(k,0).chip(l,1),tmpOutVector);
50 out.chip(k,0).chip(l,1)= tmpOutVector;
51 }
52 }
53 }
54 static void ifft(const Eigen::Tensor<dcomplex,3>& in, Eigen::Tensor<dcomplex,3>& out)
55 {
56 out.setZero();
57 Eigen::FFT<double> fft;
58 for (int k = 0; k < in.dimension(0); k++)
59 {
60 for (int l = 0; l < in.dimension(1); l++)
61 {
62 Eigen::Tensor<dcomplex,1> tmpOutVector(in.dimension(2));
63 tmpOutVector.setZero();
64 FFT::ifft(in.chip(k,0).chip(l,0),tmpOutVector);
65 out.chip(k,0).chip(l,0)= tmpOutVector;
66 }
67 }
68
69 for (int k = 0; k < in.dimension(1); k++)
70 {
71 for (int l = 0; l < in.dimension(2); l++)
72 {
73 Eigen::Tensor<dcomplex,1> tmpOutVector(in.dimension(0));
74 tmpOutVector.setZero();
75 FFT::ifft(out.chip(k,1).chip(l,1),tmpOutVector);
76 out.chip(k,1).chip(l,1)= tmpOutVector;
77 }
78 }
79
80 for (int k = 0; k < in.dimension(0); k++)
81 {
82 for (int l = 0; l < in.dimension(2); l++)
83 {
84 Eigen::Tensor<dcomplex,1> tmpOutVector(in.dimension(0));
85 tmpOutVector.setZero();
86 FFT::ifft(out.chip(k,0).chip(l,1),tmpOutVector);
87 out.chip(k,0).chip(l,1)= tmpOutVector;
88 }
89 }
90 }
91
92 // 2 dimensions
93 static void fft(const Eigen::Tensor<dcomplex,2>& in, Eigen::Tensor<dcomplex,2>& out)
94 {
95 out.setZero();
96 Eigen::FFT<double> fft;
97
98 for (int k = 0; k < in.dimension(0); k++) {
99 Eigen::Tensor<dcomplex,1> tmpOutVector;
100 tmpOutVector.setZero();
101 FFT::fft(in.chip(k,0),tmpOutVector);
102 out.chip(k,0)= tmpOutVector;
103 }
104
105 for (int k = 0; k < in.dimension(1); k++) {
106 Eigen::Tensor<dcomplex,1> tmpOutVector;
107 tmpOutVector.setZero();
108 FFT::fft(out.chip(k,1),tmpOutVector);
109 out.chip(k,1)= tmpOutVector;
110 }
111 }
112 static void ifft(const Eigen::Tensor<dcomplex,2>& in, Eigen::Tensor<dcomplex,2>& out)
113 {
114 out.setZero();
115 Eigen::FFT<double> fft;
116 for (int k = 0; k < in.dimension(0); k++) {
117 Eigen::Tensor<dcomplex,1> tmpOutVector(in.dimension(1));
118 tmpOutVector.setZero();
119 FFT::ifft(in.chip(k,0),tmpOutVector);
120 out.chip(k,0)= tmpOutVector;
121 }
122
123 for (int k = 0; k < in.dimension(1); k++) {
124 Eigen::Tensor<dcomplex,1> tmpOutVector(in.dimension(0));
125 tmpOutVector.setZero();
126 FFT::ifft(out.chip(k,1),tmpOutVector);
127 out.chip(k,1)= tmpOutVector;
128 }
129 }
130
131 // 1 dimension
132 static void fft(const Eigen::Tensor<dcomplex,1>& in, Eigen::Tensor<dcomplex,1>& out)
133 {
134 out.setZero();
135 Eigen::FFT<double> fft;
136 Eigen::Map<const Eigen::VectorXcd> inMap(in.data(), in.dimension(0));
137
138 Eigen::VectorXcd tmpOut(in.dimension(0));
139 tmpOut.setZero();
140 fft.fwd(tmpOut,inMap.eval());
141
142 Eigen::TensorMap<Eigen::Tensor<dcomplex,1>> tmpOutMap(tmpOut.data(),tmpOut.size());
143 out= tmpOutMap;
144 }
145 static void ifft(const Eigen::Tensor<dcomplex,1>& in, Eigen::Tensor<dcomplex,1>& out)
146 {
147 out.setZero();
148 Eigen::FFT<double> fft;
149 Eigen::Map<const Eigen::VectorXcd> inMap(in.data(), in.dimension(0));
150
151 Eigen::VectorXcd tmpOut(in.dimension(0));
152 tmpOut.setZero();
153 fft.inv(tmpOut,inMap.eval());
154
155 Eigen::TensorMap<Eigen::Tensor<dcomplex,1>> tmpOutMap(tmpOut.data(),tmpOut.size());
156 out= tmpOutMap;
157 }
158};
159
160
161
162
163
164
165
166// need to change in to a constant type
167
168
169#endif //OILAB_FFT_H
Definition FFT.h:13
static void ifft(const Eigen::Tensor< dcomplex, 1 > &in, Eigen::Tensor< dcomplex, 1 > &out)
Definition FFT.h:145
std::complex< double > dcomplex
Definition FFT.h:15
static void ifft(const Eigen::Tensor< dcomplex, 3 > &in, Eigen::Tensor< dcomplex, 3 > &out)
Definition FFT.h:54
static void fft(const Eigen::Tensor< dcomplex, 2 > &in, Eigen::Tensor< dcomplex, 2 > &out)
Definition FFT.h:93
static void fft(const Eigen::Tensor< dcomplex, 3 > &in, Eigen::Tensor< dcomplex, 3 > &out)
Definition FFT.h:17
static void fft(const Eigen::Tensor< dcomplex, 1 > &in, Eigen::Tensor< dcomplex, 1 > &out)
Definition FFT.h:132
static void ifft(const Eigen::Tensor< dcomplex, 2 > &in, Eigen::Tensor< dcomplex, 2 > &out)
Definition FFT.h:112