6#ifdef NUMERICS_HAS_FFTW
16 return reinterpret_cast<fftw_complex*
>(v.
data());
19 return reinterpret_cast<const fftw_complex*
>(v.
data());
23 fftw_plan p = fftw_plan_dft_1d(
static_cast<int>(in.
size()),
24 const_cast<fftw_complex*
>(fc(in)), fc(out),
25 FFTW_FORWARD, FFTW_ESTIMATE);
31 fftw_plan p = fftw_plan_dft_1d(
static_cast<int>(in.
size()),
32 const_cast<fftw_complex*
>(fc(in)), fc(out),
33 FFTW_BACKWARD, FFTW_ESTIMATE);
39 fftw_plan p = fftw_plan_dft_r2c_1d(
static_cast<int>(in.
size()),
40 const_cast<double*
>(in.
data()), fc(out),
47 fftw_plan p = fftw_plan_dft_c2r_1d(n,
48 const_cast<fftw_complex*
>(fc(in)), out.
data(),
58 FFTPlanImpl(
int n_,
bool forward) : n(n_) {
61 plan = fftw_plan_dft_1d(n_, fc(tmp_in), fc(tmp_out),
62 forward ? FFTW_FORWARD : FFTW_BACKWARD,
66 ~FFTPlanImpl() { fftw_destroy_plan(plan); }
69 fftw_execute_dft(plan,
70 const_cast<fftw_complex*
>(fc(in)),
71 const_cast<fftw_complex*
>(fc(out)));
Dense vector with optional GPU storage, templated over scalar type T.
constexpr idx size() const noexcept
FFT interface with backend dispatch.
void ifft(const CVector &in, CVector &out, FFTBackend b=default_fft_backend)
Inverse complex DFT (unnormalised: result = n * true_inverse).
void fft(const CVector &in, CVector &out, FFTBackend b=default_fft_backend)
Forward complex DFT. out must be pre-allocated to in.size().
void irfft(const CVector &in, int n, Vector &out, FFTBackend b=default_fft_backend)
Complex-to-real inverse DFT (unnormalised).
constexpr FFTBackend fftw
void rfft(const Vector &in, CVector &out, FFTBackend b=default_fft_backend)
Real-to-complex forward DFT. out must be pre-allocated to n/2+1.
std::complex< real > cplx