4#include "backends/seq/impl.hpp"
5#ifdef NUMERICS_HAS_STD_SIMD
17 throw std::invalid_argument(
"fft: in and out must have the same size");
18#ifdef NUMERICS_HAS_FFTW
20 backends::fftw::fft(in, out);
24#if defined(NUMERICS_HAS_AVX2) || defined(NUMERICS_HAS_NEON)
30#ifdef NUMERICS_HAS_STD_SIMD
32 backends::stdsimd::fft(in, out);
42 throw std::invalid_argument(
"ifft: in and out must have the same size");
44#ifdef NUMERICS_HAS_FFTW
46 backends::fftw::ifft(in, out);
50#if defined(NUMERICS_HAS_AVX2) || defined(NUMERICS_HAS_NEON)
56#ifdef NUMERICS_HAS_STD_SIMD
58 backends::stdsimd::ifft(in, out);
66 if (
static_cast<int>(out.
size()) !=
static_cast<int>(in.
size()) / 2 + 1)
67 throw std::invalid_argument(
"rfft: out must have size n/2+1");
68#ifdef NUMERICS_HAS_FFTW
70 backends::fftw::rfft(in, out);
74#if defined(NUMERICS_HAS_AVX2) || defined(NUMERICS_HAS_NEON)
80#ifdef NUMERICS_HAS_STD_SIMD
82 backends::stdsimd::rfft(in, out);
90 if (
static_cast<int>(in.
size()) != n / 2 + 1)
91 throw std::invalid_argument(
"irfft: in must have size n/2+1");
92 if (
static_cast<int>(out.
size()) != n)
93 throw std::invalid_argument(
"irfft: out must have size n");
94#ifdef NUMERICS_HAS_FFTW
96 backends::fftw::irfft(in, n, out);
100#if defined(NUMERICS_HAS_AVX2) || defined(NUMERICS_HAS_NEON)
106#ifdef NUMERICS_HAS_STD_SIMD
108 backends::stdsimd::irfft(in, n, out);
120#ifdef NUMERICS_HAS_FFTW
122 impl_ =
new backends::fftw::FFTPlanImpl(n, forward);
126#if defined(NUMERICS_HAS_AVX2) || defined(NUMERICS_HAS_NEON)
132#ifdef NUMERICS_HAS_STD_SIMD
134 impl_ =
new backends::stdsimd::FFTPlanImpl(n, !forward);
142#ifdef NUMERICS_HAS_FFTW
144 delete static_cast<backends::fftw::FFTPlanImpl*
>(impl_);
148#if defined(NUMERICS_HAS_AVX2) || defined(NUMERICS_HAS_NEON)
154#ifdef NUMERICS_HAS_STD_SIMD
156 delete static_cast<backends::stdsimd::FFTPlanImpl*
>(impl_);
164 if (
static_cast<int>(in.
size()) != n_ ||
static_cast<int>(out.
size()) != n_)
165 throw std::invalid_argument(
"FFTPlan::execute: size mismatch");
166#ifdef NUMERICS_HAS_FFTW
168 static_cast<backends::fftw::FFTPlanImpl*
>(impl_)->
execute(in, out);
172#if defined(NUMERICS_HAS_AVX2) || defined(NUMERICS_HAS_NEON)
174 for (
idx i = 0; i < static_cast<idx>(n_); ++i)
180#ifdef NUMERICS_HAS_STD_SIMD
182 for (
idx i = 0; i < static_cast<idx>(n_); ++i)
184 static_cast<backends::stdsimd::FFTPlanImpl*
>(impl_)->
execute(out);
188 for (
idx i = 0; i < static_cast<idx>(n_); ++i)
constexpr idx size() const noexcept
FFTPlan(int n, bool forward=true, FFTBackend b=default_fft_backend)
void execute(const CVector &in, CVector &out) const
FFT interface with backend dispatch.
void irfft(const num::CVector &in, int n, num::Vector &out)
void ifft(const num::CVector &in, num::CVector &out)
void fft(const num::CVector &in, num::CVector &out)
void rfft(const num::Vector &in, num::CVector &out)
void ifft(const num::CVector &in, num::CVector &out)
void rfft(const num::Vector &in, num::CVector &out)
void irfft(const num::CVector &in, int n, num::Vector &out)
void fft(const num::CVector &in, num::CVector &out)
void ifft(const CVector &in, CVector &out, FFTBackend b=default_fft_backend)
void fft(const CVector &in, CVector &out, FFTBackend b=default_fft_backend)
void irfft(const CVector &in, int n, Vector &out, FFTBackend b=default_fft_backend)
void rfft(const Vector &in, CVector &out, FFTBackend b=default_fft_backend)
FFTW3 backend wrappers. Only included by src/spectral/fft.cpp.
Handwritten AVX2 / NEON butterfly for the FFT.
std::experimental::simd butterfly for FFT.
Precomputed twiddle factors + SIMD butterfly execution.