1#ifndef ISCE_FFT_FFT_ICC
2#error "FFT.icc is an implementation detail of FFT.h"
7#include "detail/ConfigureFFTLayout.h"
8#include "detail/Threads.h"
10namespace isce3 {
namespace fft {
14FwdFFTPlan<T> planfft1d(std::complex<T> * out, std::complex<T> * in,
int n)
28FwdFFTPlan<T> planfft1d(std::complex<T> * out, std::complex<T> * in,
const int (&dims)[2],
int axis)
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);
38FwdFFTPlan<T> planfft1d(std::complex<T> * out, T * in,
const int (&dims)[2],
int axis)
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);
48FwdFFTPlan<T> planfft2d(std::complex<T> * out, std::complex<T> * in,
const int (&dims)[2])
50 return FwdFFTPlan<T>(out, in, dims, 1, FFTW_MEASURE, detail::getMaxThreads());
55FwdFFTPlan<T> planfft2d(std::complex<T> * out, T * in,
const int (&dims)[2])
57 return FwdFFTPlan<T>(out, in, dims, 1, FFTW_MEASURE, detail::getMaxThreads());
62InvFFTPlan<T> planifft1d(std::complex<T> * out, std::complex<T> * in,
int n)
76InvFFTPlan<T> planifft1d(std::complex<T> * out, std::complex<T> * in,
const int (&dims)[2],
int axis)
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);
86InvFFTPlan<T> planifft1d(T * out, std::complex<T> * in,
const int (&dims)[2],
int axis)
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);
96InvFFTPlan<T> planifft2d(std::complex<T> * out, std::complex<T> * in,
const int (&dims)[2])
98 return InvFFTPlan<T>(out, in, dims, 1, FFTW_MEASURE, detail::getMaxThreads());
103InvFFTPlan<T> planifft2d(T * out, std::complex<T> * in,
const int (&dims)[2])
105 return InvFFTPlan<T>(out, in, dims, 1, FFTW_MEASURE, detail::getMaxThreads());
110void fft1d(std::complex<T> * out,
const std::complex<T> * in,
int n)
113 auto mutable_in =
const_cast<std::complex<T>*
>(in);
120void fft1d(std::complex<T> * out,
const T * in,
int n)
123 auto mutable_in =
const_cast<T*
>(in);
130void fft1d(std::complex<T> * out,
const std::complex<T> * in,
const int (&dims)[2],
int axis)
132 int n, stride, dist, batch;
133 detail::configureFFTLayout(&n, &stride, &dist, &batch, dims, axis);
134 int threads = std::min(batch, detail::getMaxThreads());
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);
143void fft1d(std::complex<T> * out,
const T * in,
const int (&dims)[2],
int axis)
145 int n, stride, dist, batch;
146 detail::configureFFTLayout(&n, &stride, &dist, &batch, dims, axis);
147 int threads = std::min(batch, detail::getMaxThreads());
149 auto mutable_in =
const_cast<T*
>(in);
150 FwdFFTPlan<T> plan(out, mutable_in, n, n, stride, dist, batch, FFTW_ESTIMATE, threads);
156void fft2d(std::complex<T> * out,
const std::complex<T> * in,
const int (&dims)[2])
159 auto mutable_in =
const_cast<std::complex<T>*
>(in);
160 FwdFFTPlan<T> plan(out, mutable_in, dims, 1, FFTW_ESTIMATE, detail::getMaxThreads());
166void fft2d(std::complex<T> * out,
const T * in,
const int (&dims)[2])
169 auto mutable_in =
const_cast<T*
>(in);
170 FwdFFTPlan<T> plan(out, mutable_in, dims, 1, FFTW_ESTIMATE, detail::getMaxThreads());
176void ifft1d(std::complex<T> * out,
const std::complex<T> * in,
int n)
179 auto mutable_in =
const_cast<std::complex<T>*
>(in);
186void ifft1d(T * out,
const std::complex<T> * in,
int n)
189 auto mutable_in =
const_cast<std::complex<T>*
>(in);
196void ifft1d(std::complex<T> * out,
const std::complex<T> * in,
const int (&dims)[2],
int axis)
198 int n, stride, dist, batch;
199 detail::configureFFTLayout(&n, &stride, &dist, &batch, dims, axis);
200 int threads = std::min(batch, detail::getMaxThreads());
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);
209void ifft1d(T * out,
const std::complex<T> * in,
const int (&dims)[2],
int axis)
211 int n, stride, dist, batch;
212 detail::configureFFTLayout(&n, &stride, &dist, &batch, dims, axis);
213 int threads = std::min(batch, detail::getMaxThreads());
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);
222void ifft2d(std::complex<T> * out,
const std::complex<T> * in,
const int (&dims)[2])
225 auto mutable_in =
const_cast<std::complex<T>*
>(in);
226 InvFFTPlan<T> plan(out, mutable_in, dims, 1, FFTW_ESTIMATE, detail::getMaxThreads());
232void ifft2d(T * out,
const std::complex<T> * in,
const int (&dims)[2])
235 auto mutable_in =
const_cast<std::complex<T>*
>(in);
236 InvFFTPlan<T> plan(out, mutable_in, dims, 1, FFTW_ESTIMATE, detail::getMaxThreads());
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