fftw clib System & Utilities

FFTW Fast Fourier Transform. FFT1D, FFT2D, IFFT, power spectrum, frequency bins.

ppm install fftw

Overview

fftw wraps FFTW3 — the fastest available FFT library, used in NumPy, SciPy, MATLAB, and scientific computing worldwide. It computes Discrete Fourier Transforms in O(N log N) and self-optimizes at runtime for your specific hardware (FFTW "plans").

CLib package

Ubuntu/Debian: sudo apt install libfftw3-dev

1-D FFT — Frequency Analysis

uses fftw;

const SampleRate = 44100;
const N = 4096;

// Generate test signal: 440 Hz + 1000 Hz sine waves
var signal: array of Double;
SetLength(signal, N);
for I := 0 to N-1 do
  signal[I] := Sin(2*Pi*440*I/SampleRate) + 0.5*Sin(2*Pi*1000*I/SampleRate);

// Apply Hann window to reduce spectral leakage
var windowed := WindowHann(signal);

// Forward FFT — get complex spectrum
var spectrum := FFT(windowed);

// Power spectrum (magnitude squared per bin)
var power := PowerSpectrum(windowed);

// Find dominant frequency
var peakK := PeakBin(power);
WriteLn('Peak frequency: ', FrequencyBin(peakK, SampleRate, N):0:1, ' Hz');

// Full frequency axis
var freqs := FrequencyAxis(SampleRate, N);
WriteLn('Bin 10 = ', freqs[10]:0:2, ' Hz');

Inverse FFT

// Round-trip: signal → FFT → IFFT → signal
var spectrum := FFT(signal);
var restored := IFFT(spectrum, Length(signal));

// Complex FFT (full complex input)
var cspec := FFTComplex(complexSignal);
var back  := IFFTComplex(cspec);

2-D FFT — Image / Matrix

// 2-D FFT on a 512×512 matrix (e.g. image processing)
var spectrum2d := FFT2D(imageData, 512, 512);
var filtered   := ApplyFilter(spectrum2d);  // your filter
var restored   := IFFT2D(filtered, 512, 512);

Reusable Plans (high throughput)

// Create plan once for N=4096 — amortizes optimization cost
var plan := PlanFFT(4096);

// Execute many times with same N
for I := 0 to Length(frames) - 1 do begin
  var spec := ExecuteFFT(plan, frames[I]);
  ProcessSpectrum(spec);
end;

DestroyPlan(plan);

// Save optimization results for next run
SaveWisdom('/data/fftw.wisdom');

Window Functions

// Apply before FFT to reduce spectral leakage
var hann     := WindowHann(signal);      // general purpose
var hamming  := WindowHamming(signal);   // similar to Hann
var blackman := WindowBlackman(signal);  // better side-lobe suppression
var flattop  := WindowFlatTop(signal);   // accurate amplitude measurement

Spectrum Helpers

var power := PowerSpectrum(signal);      // |X[k]|^2
var mag   := MagnitudeSpectrum(signal);  // |X[k]|
var phase := PhaseSpectrum(signal);      // angle(X[k]) in radians

// Good FFT sizes are powers of 2
var n := NextPow2(rawLength);  // e.g. 1000 → 1024

// Magnitude of a complex bin
var mag0 := ComplexMag(spectrum[0], spectrum[1]);

Package Info

Version1.0.0
Typeclib
C Librarylibfftw3
Authorgustavo

Functions

  • FFT / IFFT
  • FFTComplex / IFFTComplex
  • FFT2D / IFFT2D
  • PowerSpectrum
  • MagnitudeSpectrum
  • PhaseSpectrum
  • FrequencyBin / FrequencyAxis
  • PeakBin
  • WindowHann / WindowHamming
  • WindowBlackman / WindowFlatTop
  • PlanFFT / PlanIFFT
  • ExecuteFFT / ExecuteIFFT
  • DestroyPlan
  • ExportWisdom / ImportWisdom
  • SaveWisdom / LoadWisdom
  • NextPow2 / ComplexMag
  • FFTWVersion