isce3 0.25.0
Loading...
Searching...
No Matches
FFT.icc
1#ifndef ISCE_FFT_FFT_ICC
2#error "FFT.icc is an implementation detail of FFT.h"
3#endif
4
5#include <algorithm>
6
7#include "detail/ConfigureFFTLayout.h"
8#include "detail/Threads.h"
9
10namespace isce3 { namespace fft {
11
12template<typename T>
13inline
14FwdFFTPlan<T> planfft1d(std::complex<T> * out, std::complex<T> * in, int n)
15{
16 return FwdFFTPlan<T>(out, in, n);
17}
18
19template<typename T>
20inline
21FwdFFTPlan<T> planfft1d(std::complex<T> * out, T * in, int n)
22{
23 return FwdFFTPlan<T>(out, in, n);
24}
25
26template<typename T>
27inline
28FwdFFTPlan<T> planfft1d(std::complex<T> * out, std::complex<T> * in, const int (&dims)[2], int axis)
29{
30 int n, stride, dist, batch;
31 detail::configureFFTLayout(&n, &stride, &dist, &batch, dims, axis);
32 int threads = std::min(batch, detail::getMaxThreads());
33 return FwdFFTPlan<T>(out, in, n, n, stride, dist, batch, FFTW_MEASURE, threads);
34}
35
36template<typename T>
37inline
38FwdFFTPlan<T> planfft1d(std::complex<T> * out, T * in, const int (&dims)[2], int axis)
39{
40 int n, stride, dist, batch;
41 detail::configureFFTLayout(&n, &stride, &dist, &batch, dims, axis);
42 int threads = std::min(batch, detail::getMaxThreads());
43 return FwdFFTPlan<T>(out, in, n, n, stride, dist, batch, FFTW_MEASURE, threads);
44}
45
46template<typename T>
47inline
48FwdFFTPlan<T> planfft2d(std::complex<T> * out, std::complex<T> * in, const int (&dims)[2])
49{
50 return FwdFFTPlan<T>(out, in, dims, 1, FFTW_MEASURE, detail::getMaxThreads());
51}
52
53template<typename T>
54inline
55FwdFFTPlan<T> planfft2d(std::complex<T> * out, T * in, const int (&dims)[2])
56{
57 return FwdFFTPlan<T>(out, in, dims, 1, FFTW_MEASURE, detail::getMaxThreads());
58}
59
60template<typename T>
61inline
62InvFFTPlan<T> planifft1d(std::complex<T> * out, std::complex<T> * in, int n)
63{
64 return InvFFTPlan<T>(out, in, n);
65}
66
67template<typename T>
68inline
69InvFFTPlan<T> planifft1d(T * out, std::complex<T> * in, int n)
70{
71 return InvFFTPlan<T>(out, in, n);
72}
73
74template<typename T>
75inline
76InvFFTPlan<T> planifft1d(std::complex<T> * out, std::complex<T> * in, const int (&dims)[2], int axis)
77{
78 int n, stride, dist, batch;
79 detail::configureFFTLayout(&n, &stride, &dist, &batch, dims, axis);
80 int threads = std::min(batch, detail::getMaxThreads());
81 return InvFFTPlan<T>(out, in, n, n, stride, dist, batch, FFTW_MEASURE, threads);
82}
83
84template<typename T>
85inline
86InvFFTPlan<T> planifft1d(T * out, std::complex<T> * in, const int (&dims)[2], int axis)
87{
88 int n, stride, dist, batch;
89 detail::configureFFTLayout(&n, &stride, &dist, &batch, dims, axis);
90 int threads = std::min(batch, detail::getMaxThreads());
91 return InvFFTPlan<T>(out, in, n, n, stride, dist, batch, FFTW_MEASURE, threads);
92}
93
94template<typename T>
95inline
96InvFFTPlan<T> planifft2d(std::complex<T> * out, std::complex<T> * in, const int (&dims)[2])
97{
98 return InvFFTPlan<T>(out, in, dims, 1, FFTW_MEASURE, detail::getMaxThreads());
99}
100
101template<typename T>
102inline
103InvFFTPlan<T> planifft2d(T * out, std::complex<T> * in, const int (&dims)[2])
104{
105 return InvFFTPlan<T>(out, in, dims, 1, FFTW_MEASURE, detail::getMaxThreads());
106}
107
108template<typename T>
109inline
110void fft1d(std::complex<T> * out, const std::complex<T> * in, int n)
111{
112 // FFTW_ESTIMATE is a special case where the input arrays are not modified.
113 auto mutable_in = const_cast<std::complex<T>*>(in);
114 FwdFFTPlan<T> plan(out, mutable_in, n, 1, FFTW_ESTIMATE);
115 plan.execute();
116}
117
118template<typename T>
119inline
120void fft1d(std::complex<T> * out, const T * in, int n)
121{
122 // FFTW_ESTIMATE is a special case where the input arrays are not modified.
123 auto mutable_in = const_cast<T*>(in);
124 FwdFFTPlan<T> plan(out, mutable_in, n, 1, FFTW_ESTIMATE);
125 plan.execute();
126}
127
128template<typename T>
129inline
130void fft1d(std::complex<T> * out, const std::complex<T> * in, const int (&dims)[2], int axis)
131{
132 int n, stride, dist, batch;
133 detail::configureFFTLayout(&n, &stride, &dist, &batch, dims, axis);
134 int threads = std::min(batch, detail::getMaxThreads());
135 // FFTW_ESTIMATE is a special case where the input arrays are not modified.
136 auto mutable_in = const_cast<std::complex<T>*>(in);
137 FwdFFTPlan<T> plan(out, mutable_in, n, n, stride, dist, batch, FFTW_ESTIMATE, threads);
138 plan.execute();
139}
140
141template<typename T>
142inline
143void fft1d(std::complex<T> * out, const T * in, const int (&dims)[2], int axis)
144{
145 int n, stride, dist, batch;
146 detail::configureFFTLayout(&n, &stride, &dist, &batch, dims, axis);
147 int threads = std::min(batch, detail::getMaxThreads());
148 // FFTW_ESTIMATE is a special case where the input arrays are not modified.
149 auto mutable_in = const_cast<T*>(in);
150 FwdFFTPlan<T> plan(out, mutable_in, n, n, stride, dist, batch, FFTW_ESTIMATE, threads);
151 plan.execute();
152}
153
154template<typename T>
155inline
156void fft2d(std::complex<T> * out, const std::complex<T> * in, const int (&dims)[2])
157{
158 // FFTW_ESTIMATE is a special case where the input arrays are not modified.
159 auto mutable_in = const_cast<std::complex<T>*>(in);
160 FwdFFTPlan<T> plan(out, mutable_in, dims, 1, FFTW_ESTIMATE, detail::getMaxThreads());
161 plan.execute();
162}
163
164template<typename T>
165inline
166void fft2d(std::complex<T> * out, const T * in, const int (&dims)[2])
167{
168 // FFTW_ESTIMATE is a special case where the input arrays are not modified.
169 auto mutable_in = const_cast<T*>(in);
170 FwdFFTPlan<T> plan(out, mutable_in, dims, 1, FFTW_ESTIMATE, detail::getMaxThreads());
171 plan.execute();
172}
173
174template<typename T>
175inline
176void ifft1d(std::complex<T> * out, const std::complex<T> * in, int n)
177{
178 // FFTW_ESTIMATE is a special case where the input arrays are not modified.
179 auto mutable_in = const_cast<std::complex<T>*>(in);
180 InvFFTPlan<T> plan(out, mutable_in, n, 1, FFTW_ESTIMATE);
181 plan.execute();
182}
183
184template<typename T>
185inline
186void ifft1d(T * out, const std::complex<T> * in, int n)
187{
188 // FFTW_ESTIMATE is a special case where the input arrays are not modified.
189 auto mutable_in = const_cast<std::complex<T>*>(in);
190 InvFFTPlan<T> plan(out, mutable_in, n, 1, FFTW_ESTIMATE);
191 plan.execute();
192}
193
194template<typename T>
195inline
196void ifft1d(std::complex<T> * out, const std::complex<T> * in, const int (&dims)[2], int axis)
197{
198 int n, stride, dist, batch;
199 detail::configureFFTLayout(&n, &stride, &dist, &batch, dims, axis);
200 int threads = std::min(batch, detail::getMaxThreads());
201 // FFTW_ESTIMATE is a special case where the input arrays are not modified.
202 auto mutable_in = const_cast<std::complex<T>*>(in);
203 InvFFTPlan<T> plan(out, mutable_in, n, n, stride, dist, batch, FFTW_ESTIMATE, threads);
204 plan.execute();
205}
206
207template<typename T>
208inline
209void ifft1d(T * out, const std::complex<T> * in, const int (&dims)[2], int axis)
210{
211 int n, stride, dist, batch;
212 detail::configureFFTLayout(&n, &stride, &dist, &batch, dims, axis);
213 int threads = std::min(batch, detail::getMaxThreads());
214 // FFTW_ESTIMATE is a special case where the input arrays are not modified.
215 auto mutable_in = const_cast<std::complex<T>*>(in);
216 InvFFTPlan<T> plan(out, mutable_in, n, n, stride, dist, batch, FFTW_ESTIMATE, threads);
217 plan.execute();
218}
219
220template<typename T>
221inline
222void ifft2d(std::complex<T> * out, const std::complex<T> * in, const int (&dims)[2])
223{
224 // FFTW_ESTIMATE is a special case where the input arrays are not modified.
225 auto mutable_in = const_cast<std::complex<T>*>(in);
226 InvFFTPlan<T> plan(out, mutable_in, dims, 1, FFTW_ESTIMATE, detail::getMaxThreads());
227 plan.execute();
228}
229
230template<typename T>
231inline
232void ifft2d(T * out, const std::complex<T> * in, const int (&dims)[2])
233{
234 // FFTW_ESTIMATE is a special case where the input arrays are not modified.
235 auto mutable_in = const_cast<std::complex<T>*>(in);
236 InvFFTPlan<T> plan(out, mutable_in, dims, 1, FFTW_ESTIMATE, detail::getMaxThreads());
237 plan.execute();
238}
239
240}}
RAII wrapper encapsulating FFTW plan for forward FFT execution.
Definition FFTPlan.h:11
RAII wrapper encapsulating FFTW plan for inverse FFT execution.
Definition FFTPlan.h:328
base interpolator is an abstract base class
Definition BinarySearchFunc.cpp:5

Generated for ISCE3.0 by doxygen 1.13.2.