include/spectral/fft.hpp provides complex FFT, inverse FFT, real-input FFT, inverse real FFT, and reusable plans.
Real Signal Spectrum
#include <cmath>
#include <numbers>
constexpr int N = 1024;
constexpr double fs = 1000.0;
constexpr double pi = std::numbers::pi;
for (int i = 0; i < N; ++i) {
double t = static_cast<double>(i) / fs;
x[i] = std::sin(2.0 * pi * 50.0 * t)
+ 0.5 * std::sin(2.0 * pi * 120.0 * t);
}
void rfft(const Vector &in, CVector &out, FFTBackend b=default_fft_backend)
Umbrella include for the numerics library.
Frequency bin \(k\) corresponds to
\[
f_k = k f_s / N .
\]
for (
num::idx k = 0; k < X.size(); ++k) {
spectrum.
store(
static_cast<double>(k) * fs / N, std::abs(X[k]));
}
void store(double x, double y)
Complex Round Trip
void ifft(const CVector &in, CVector &out, FFTBackend b=default_fft_backend)
void fft(const CVector &in, CVector &out, FFTBackend b=default_fft_backend)
The inverse routine returns the normalized inverse transform.
Reusable Plan
for (int sample = 0; sample < nsamples; ++sample) {
load_sample(sample, x);
plan.execute(x, X);
}
Precomputed complex transform plan.
constexpr FFTBackend default_fft_backend
Explicit Backend
default_fft_backend selects FFTW3 when available, otherwise the best built-in backend.