LUNAROPS · OPERATIONAL UPLINK 100% UPTIME 1,247d POSTS 893 JEFF.MOON@LUNAROPS.DEV UTC --:--:--

The Fourier Transform, Finally Intuitive

signal-processingmathematicspythondspradio

The Fourier transform is the mathematical bedrock underneath more of the modern world than most engineers realize. Your MP3 file, the Wi-Fi packet reaching your laptop, the spectrum analyzer display on an oscilloscope, the JPEG sitting in your browser, the 5G subcarrier slicing the airwaves outside your window — every one of them rests on a single idea, stated by Joseph Fourier in 1822 and refined into a fast algorithm by Cooley and Tukey in 1965: any signal can be decomposed into a sum of sinusoids of different frequencies, amplitudes, and phases. Everything else is engineering built on that foundation. This post works through the insight carefully — no LaTeX, math in code blocks — then follows it through the DFT, the FFT butterfly, windowing, real applications, and practical Python you can run today.


The Core Insight

Take a pure 440 Hz tone — the concert A pitch. It is a single sine wave: a smooth oscillation that completes 440 full cycles per second. Now add a 880 Hz sine wave at half the amplitude (the octave above). The sum is a waveform that looks nothing like either constituent — it has a complex, repeating shape. But if you could somehow run the mix backward through a mathematical filter, you would recover the two originals, unchanged, from the tangle.

Fourier’s claim is far stronger: this works for any periodic signal, not just nice clean sums. A square wave, a sawtooth, a piano note with its overtone cloud, a radio signal — all of them are sums of sinusoids. Specifically, the Fourier series shows that any periodic function with period T can be written as:

f(t) = a0/2
     + a1·cos(2π·t/T) + b1·sin(2π·t/T)
     + a2·cos(2·2π·t/T) + b2·sin(2·2π·t/T)
     + ...

The first term is the DC offset (average value). Each subsequent pair captures one harmonic. The Fourier transform extends this to aperiodic signals by treating them as periodic with an infinite period — the discrete sum becomes a continuous integral over all frequencies. For practical digital signal processing, we will use the discrete version, but the intuition is the same.


Time Domain vs Frequency Domain

The same signal has two equally valid representations. Neither is more “real” than the other — they contain identical information, expressed in different coordinates.

TIME DOMAIN                          FREQUENCY DOMAIN
─────────────────────────────────    ─────────────────────────────────
Amplitude on the y-axis              Amplitude (or power) on the y-axis
Time on the x-axis                   Frequency on the x-axis

What you see: the waveform itself    What you see: which frequencies
  — how the signal evolves instant     are present, and how strongly
    by instant                         each one contributes

Good for: seeing timing,             Good for: identifying tones,
  distortions, bursts,                 diagnosing interference,
  transients                           designing filters, compression

Example: audio sample buffer         Example: spectrum analyzer display

A 440 Hz + 880 Hz mix looks like a messy repeating wave in the time domain. In the frequency domain it looks like two vertical spikes at 440 and 880 Hz and nothing elsewhere. The frequency domain reveals structure the time domain hides.

The transform and its inverse are symmetric in a beautiful way: a sharp edge in time (like the click of a switch) produces a broad spread of frequencies. A perfectly pure tone in frequency produces an infinitely long sinusoid in time. This is the Heisenberg uncertainty principle of signal processing, and it has real engineering consequences we will return to when discussing windowing.


The Discrete Fourier Transform

In the real world you have a finite list of N samples taken at a fixed sample rate, not a continuous function. The Discrete Fourier Transform (DFT) maps N time-domain samples into N complex frequency-domain values. Each output bin k represents the amplitude and phase of the sinusoidal component at frequency k · fs / N, where fs is the sample rate.

The formula for bin k:

X[k] = sum over n from 0 to N-1 of:
         x[n] · exp(-j · 2π · k · n / N)

Where:
  x[n]  = the nth time-domain sample
  X[k]  = the kth frequency-domain bin (a complex number)
  N     = total number of samples
  j     = sqrt(-1)
  exp(-j·θ) = cos(θ) - j·sin(θ)   (Euler's formula)

The complex exponential exp(-j·2π·k·n/N) is a unit vector spinning around the complex plane at frequency k. Multiplying x[n] by it and summing over all n is a correlation: you are asking “how much does the signal resemble a sinusoid at this frequency?” If the signal contains that frequency strongly, the rotating vectors add up constructively and |X[k]| is large. If it does not, they cancel and |X[k]| is small.

The magnitude |X[k]| gives you the amplitude of that frequency component. The phase angle(X[k]) tells you where in its cycle the sinusoid sits at t=0. For power spectra you usually plot |X[k]|².

The Nyquist Limit

You can only represent frequencies up to fs/2 — the Nyquist frequency. Frequencies above half the sample rate alias: a 6 kHz tone sampled at 8 kHz appears in the output as a 2 kHz tone, because the samples are the same. This is why CD audio uses 44.1 kHz: it unambiguously captures everything up to 22.05 kHz, safely beyond the nominal 20 kHz ceiling of human hearing, with a guard band for the anti-aliasing filter.


Why the Naive DFT Is Impractical

The sum above has N terms for each of N output bins. Computing all N bins is therefore N² multiply-accumulate operations. This matters a lot in practice:

N (samples) Naive DFT operations (N²) FFT operations (N log₂ N) Speedup
1,024 1,048,576 10,240 ~102x
4,096 16,777,216 49,152 ~341x
65,536 4,294,967,296 1,048,576 ~4,096x
1,048,576 (1M) 10¹² 20,971,520 ~47,684x

For real-time audio processing at 48 kHz, you might want a new spectrum every 10 ms, meaning you need to process 480 samples and compute 480 bins in 10 ms. The naive DFT requires 230,400 complex multiplications; you can do that. But try to do a 65,536-point transform and the naive algorithm requires four billion operations — simply not feasible in real time on any general-purpose hardware.

The insight that breaks the quadratic barrier is the Fast Fourier Transform.


The FFT: Cooley-Tukey and the Butterfly

James Cooley and John Tukey published “An algorithm for the machine calculation of complex Fourier series” in 1965, though Carl Friedrich Gauss had discovered an equivalent approach in 1805 (handwritten in Latin, unpublished, buried in his notebooks until historians found it). The insight is divide and conquer: a DFT of length N can be expressed as two DFTs of length N/2, and those can each be split again, recursively, until you reach length-1 transforms that are trivial.

For N a power of 2, the Cooley-Tukey radix-2 DIT (Decimation in Time) FFT splits the input alternating even- and odd-indexed samples:

X[k] = DFT_even[k] + W^k · DFT_odd[k]
X[k + N/2] = DFT_even[k] - W^k · DFT_odd[k]

Where W = exp(-j·2π/N)   (the "twiddle factor")
      k ranges over 0 to N/2 - 1

This is the butterfly operation — one complex multiply and two complex adds produce two output bins from one pair of inputs. The signal flow graph for a single butterfly looks like this:

    a ──────────────(+)──── a + W·b
                ╱       ╲
               W·b        \
                ╲       ╱
    b ──(×W)────(-)──── a - W·b

Applied recursively across log₂(N) stages, each of N/2 butterflies, the total work is (N/2)·log₂(N) complex multiplications — exactly the O(N log N) figure in the table above.

Here is the 8-point butterfly diagram, showing how the computation unfolds across three stages:

STAGE 1 (N=2)   STAGE 2 (N=4)   STAGE 3 (N=8)
─────────────   ─────────────   ─────────────
x[0] ──┐
       ▶── (butterfly) ──┐
x[4] ──┘                 ▶── (butterfly) ──┐
                         │                  ▶── X[0..7]
x[2] ──┐                 ▶── (butterfly) ──┘
       ▶── (butterfly) ──┘
x[6] ──┘

x[1] ──┐
       ▶── (butterfly) ──┐
x[5] ──┘                 ▶── (butterfly) ──┐
                         │                  ▶── (combine)
x[3] ──┐                 ▶── (butterfly) ──┘
       ▶── (butterfly) ──┘
x[7] ──┘

Note: input is bit-reversed (0,4,2,6,1,5,3,7 for N=8)

The bit-reversal of inputs is a consequence of the even/odd splitting: bit-reversing the index (000→000, 001→100, 010→010, 011→110, …) arranges samples in the order the butterfly expects. Most FFT libraries handle this transparently.

The Cooley-Tukey algorithm changed everything. It enabled real-time radar processing, digital audio workstations, MRI reconstruction, the whole modern DSP industry. One paper in Mathematics of Computation, 3 pages long, and the world rearranged itself.


Windowing and Spectral Leakage

Here is a trap that catches everyone the first time they write an FFT. You take a chunk of 1024 samples from a continuous audio stream — starting and ending at arbitrary points — and feed it into numpy.fft.fft. The frequency peak that should be a clean spike looks smeared across neighboring bins. This is spectral leakage.

The reason is subtle. The DFT implicitly assumes your N samples represent exactly one period of a periodic signal. If your input signal does not complete an integer number of cycles within the window — and it usually does not, unless you arranged for it — the first and last samples don’t match, and the abrupt discontinuity at the edges behaves like a click in the signal. A click has energy at all frequencies. That energy bleeds into every bin, burying nearby weaker signals and distorting amplitude estimates.

WITHOUT WINDOWING (frequency not aligned to bin)
─────────────────────────────────────────────────
Signal completes 3.7 cycles in the window.
Amplitude spectrum:

  |X[k]|
    │
  8 │       █
  6 │      ███
  4 │     █████
  2 │   ████████
  0 └──────────────────────── k
    ← energy leaks into many bins, true peak unclear

WITH HANN WINDOW APPLIED
─────────────────────────
Same signal, same window length.
Amplitude spectrum:

  |X[k]|
    │
  8 │        █
  6 │        █
  4 │       ███
  2 │      █████
  0 └──────────────────────── k
    ← energy concentrated, neighbors suppressed

The fix is to multiply the time-domain samples by a window function before taking the FFT. A window tapers the signal smoothly to near-zero at both ends, eliminating the discontinuity. The DFT then sees a signal that gracefully fades in and out, not one that suddenly starts and stops.

Common window functions and their trade-offs:

Window Main lobe width Sidelobe level Best use
Rectangular (no window) Narrowest −13 dB Frequency exactly on a bin (coherent sampling)
Hann 2 bins −31 dB General-purpose spectral analysis
Hamming 2 bins −41 dB Speech processing, filter design
Blackman 3 bins −57 dB Low-noise spectral analysis, audio
Blackman-Harris 4 bins −92 dB Measuring small signals near large ones
Flat-top 5 bins −90 dB Amplitude-accurate measurements
Kaiser Adjustable β Adjustable Custom trade-off via β parameter

The window widens the main lobe (reducing frequency resolution — nearby tones that were resolvable may merge) in exchange for suppressing sidelobes (reducing leakage from strong tones into neighboring bins). Flat-top windows sacrifice resolution for amplitude accuracy — used in calibrated measurement instruments. Blackman-Harris is the go-to when a weak tone sits near a strong one. Hann is the default for most audio and DSP work.

The rule: you can never just FFT an arbitrary chunk of data without thinking about the window. The rectangular window (no windowing) is only correct if your signal source is synchronized to the capture length, which almost never happens outside a lab.


How It Shows Up Everywhere

Audio Codecs: MP3 and Spectral Masking

MP3 does not store waveform samples. It uses a hybrid filter bank based on the Modified Discrete Cosine Transform (MDCT), a cousin of the DFT, to decompose audio into 576 frequency coefficients per frame. The key insight is psychoacoustic masking: a loud signal at one frequency raises the threshold of audibility for quieter signals nearby. A 1 kHz tone at 80 dB masks tones within roughly 100 Hz of it — those masked tones can be quantized coarsely or discarded entirely without audible degradation. The encoder allocates bits where the ear is listening and saves bits where the ear is masked. At 128 kbps, MP3 stores roughly one-tenth the data of CD audio with most listeners unable to distinguish the difference — not because of clever compression, but because of a careful model of human perception in the frequency domain.

AAC, Ogg Vorbis, and Opus all work on the same principle with better filterbanks and more refined masking models.

JPEG: The DCT as 2D Fourier Transform

JPEG divides an image into 8×8-pixel blocks and applies the Discrete Cosine Transform (DCT) to each block. The DCT is a variant of the DFT that uses only cosine terms (appropriate for real-valued, symmetric extensions of the signal) and produces real-valued coefficients. For an 8×8 block, the DCT produces 64 coefficients: one DC component (the average brightness of the block) and 63 AC components representing increasingly fine spatial frequencies in both horizontal and vertical directions.

Human vision is less sensitive to high-spatial-frequency detail than to low-frequency structure (edges, large regions of uniform color). The JPEG quantization table exploits this: high-frequency DCT coefficients are divided by large numbers and rounded to zero. That quantization step is where JPEG is lossy and where “JPEG artifacts” come from — compressing an image hard enough zeroes out the high-frequency terms in each block, producing the characteristic 8×8 blockiness and ringing at edges. Lossless JPEG-LS and JPEG 2000 avoid this at the cost of larger files; standard JPEG sacrifices detail the eye can barely see in exchange for a 10–20× size reduction.

This is a 2D Fourier decomposition: every JPEG block is reconstructed as a sum of 2D cosine basis images, exactly analogous to a time-domain signal reconstructed as a sum of sinusoids.

OFDM: Wi-Fi and 5G

Orthogonal Frequency-Division Multiplexing is the air interface technology underlying 802.11a/g/n/ac/ax (Wi-Fi) and LTE/5G NR. The signal transmission is literally an inverse FFT. Here is what that means concretely.

OFDM divides available bandwidth into many narrow subcarriers — 64 for 802.11a/g in a 20 MHz channel, up to 3276 subcarriers for 5G NR in a 100 MHz channel. Each subcarrier is a separate sinusoid at a slightly different frequency. The transmitter loads data symbols (typically QAM constellations) onto each subcarrier — assigning an amplitude and phase to each sinusoid — then uses the IFFT to synthesize the combined waveform. The receiver samples that waveform and applies the FFT to recover the subcarrier symbols.

The mathematical property that makes this work is orthogonality. Two sinusoids at frequencies that are integer multiples of 1/T (where T is the symbol duration) are orthogonal: their product integrates to zero over T. Subcarriers can therefore overlap in frequency without interfering with each other — in the frequency domain they share the same spectrum, but each one peaks exactly where its neighbors have zeroes.

OFDM subcarriers (frequency domain view)
──────────────────────────────────────────

  |H(f)|
    │
  1 │  /\  /\  /\  /\  /\  /\
    │ /  \/  \/  \/  \/  \/  \
  0 └────────────────────────── f
     ←── each subcarrier peaks ──→
          where others are zero

The cyclic prefix solves a separate problem: multipath. In a real environment, the transmitted signal reaches the receiver via multiple paths of different lengths — a direct line of sight, reflections off walls, furniture, buildings. The receiver sees a smeared version of the transmitted symbol because early copies of the next symbol overlap with late copies of the current one. This inter-symbol interference would scramble the FFT.

The cyclic prefix fixes this by copying the last portion of each OFDM symbol and prepending it as a guard interval. As long as the maximum multipath delay spread is shorter than the cyclic prefix duration, the receiver simply discards the prefix and the FFT window captures a clean, complete symbol. In Wi-Fi 6, the cyclic prefix is 0.8 or 1.6 µs; 5G NR varies it by numerology (subcarrier spacing). The cost is overhead — the prefix carries no data — but the gain is that OFDM is essentially immune to multipath without complex time-domain equalization. See the signal-integrity story behind twisted-pair for the related physical-layer story in wired ethernet, and how cell networks evolved from 1G to 5G for how OFDM slots into LTE and 5G NR.

The IFFT at the transmitter and FFT at the receiver execute in hardware — dedicated FFT accelerators in the baseband processor, running at millions of transforms per second. Wi-Fi and 5G are, at their core, DSP algorithms expressed in silicon.

Oscilloscope FFT Mode

Modern digital oscilloscopes include an FFT display mode. You probe a signal, and the instrument applies a windowed FFT to the sampled waveform and displays the frequency spectrum in real time. This lets you immediately see power-supply noise harmonics, clock spurs on a processor rail, a resonance in a cable, or RF interference coupling into a digital circuit — things that are invisible or ambiguous in the time-domain waveform but obvious as peaks in the frequency domain. The spectrum becomes a diagnostic instrument.

The same concept appears in logic analyzers with protocol decoders, SDRs, and spectrum analyzers. In all cases the underlying operation is the same FFT algorithm described above; what differs is the front end (antenna, probe, ADC sample rate) and the display.


Practical Python with numpy.fft

Here is a complete, runnable example. We synthesize a signal containing 440 Hz and 1200 Hz tones, add noise, then recover the frequency content with numpy.fft.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import numpy as np
import matplotlib.pyplot as plt

# ── Signal parameters ──────────────────────────────────────────
fs = 8000          # Sample rate: 8 kHz
T  = 1.0           # Duration: 1 second
N  = int(fs * T)   # Total samples: 8000

# ── Synthesize signal: 440 Hz + 1200 Hz + noise ────────────────
t = np.linspace(0, T, N, endpoint=False)
signal = (
    1.0 * np.sin(2 * np.pi * 440  * t) +
    0.5 * np.sin(2 * np.pi * 1200 * t) +
    0.2 * np.random.randn(N)            # Gaussian noise
)

# ── Apply Hann window before FFT ───────────────────────────────
window   = np.hanning(N)
windowed = signal * window

# ── FFT ────────────────────────────────────────────────────────
X     = np.fft.rfft(windowed)       # rfft: real input, N//2+1 output bins
freqs = np.fft.rfftfreq(N, d=1/fs)  # bin frequencies in Hz

# Normalize amplitude: divide by N/2 to account for the one-sided spectrum,
# and correct for the Hann window's power (coherent gain = 0.5)
amplitude = np.abs(X) / (N / 2) / 0.5

# ── Print top 5 peaks ──────────────────────────────────────────
peak_indices = np.argsort(amplitude)[-10:][::-1]
print(f"{'Frequency (Hz)':>18}  {'Amplitude':>12}")
print("-" * 32)
for i in peak_indices[:5]:
    print(f"{freqs[i]:>18.1f}  {amplitude[i]:>12.4f}")

# Expected output (approximately):
#  Frequency (Hz)     Amplitude
#  --------------------------------
#           440.0        0.9987
#          1200.0        0.4991
#           441.0        0.0023     ← noise floor
#           439.0        0.0022
#          1201.0        0.0021
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# ── Spectrogram: how frequency content evolves over time ───────
# Use a shorter window and stride to get time resolution too.

from scipy.signal import spectrogram

f, t_spec, Sxx = spectrogram(
    signal,
    fs=fs,
    window='hann',
    nperseg=256,     # FFT window length
    noverlap=128,    # 50% overlap
    scaling='spectrum'
)

# Sxx shape: (frequency bins, time bins)
# Sxx[i, j] = power at frequency f[i] at time t_spec[j]
# Plot with plt.pcolormesh(t_spec, f, 10*np.log10(Sxx), shading='auto')

Key points from the code:

np.fft.rfft vs np.fft.fft: For real-valued input (almost always), use rfft. It exploits conjugate symmetry — negative frequencies are mirror images of positive ones — and returns only the first N//2 + 1 bins, halving memory and compute.

Amplitude normalization: The raw FFT output magnitudes need to be divided by N (or N/2 for the one-sided rfft). Additionally, each window function has a coherent gain — the Hann window’s coherent gain is 0.5, so you divide again to recover the true sinusoidal amplitude. Skipping normalization is a common source of mysterious amplitude discrepancies.

Zero-padding: Calling np.fft.rfft(x, n=4*N) pads the input with zeros to length 4N before the FFT. This interpolates the spectrum — the bins are more finely spaced — but does not add frequency resolution. Resolution is determined by the signal duration (T seconds → 1/T Hz per bin). Zero-padding produces a smoother-looking spectrum without extra information; it is cosmetic, not analytic.


The On-Ramp to SDR Spectrum Analysis

Software-defined radio makes the FFT visible in the most tangible way possible. An SDR receiver — a $25 RTL-SDR dongle, a $300 HackRF, a $1,000 USRP — feeds a stream of raw I/Q samples into your computer. Each sample is a complex number (in-phase and quadrature components) representing the instantaneous amplitude and phase of the RF signal. Your computer applies a windowed FFT to blocks of those samples and plots the result — and you watch the spectrum of everything from 70 MHz to 1.7 GHz update in real time.

What you see, once you know what to look for: FM broadcast stations as 200 kHz-wide bumps around 88–108 MHz. Aircraft transponders pulsing at 1090 MHz (ADS-B). The narrow spikes of amateur radio operators in the 2-meter band. The wide OFDM shoulders of LTE carriers. The chirped pulses of ships’ radar in maritime areas. The cyclic-prefix guard intervals in Wi-Fi, visible as spectral shoulders at the band edges. All of these are Fourier transforms being rendered on your screen dozens of times per second.

This is where signal processing stops being abstract. Every concept in this post — time domain vs. frequency domain, bins, windowing, OFDM subcarriers — becomes visible and manipulable with a cheap SDR and a few lines of Python. The Nyquist limit stops being a theorem and becomes a practical constraint you run into when you try to tune outside your sample rate. Spectral leakage stops being a textbook artifact and becomes the smeared peak you see when you FFT a burst that doesn’t fit neatly in your window.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Sketch of real-time SDR spectrum with rtlsdr-scanner or rtl_power,
# or manual with pyrtlsdr:

import rtlsdr          # pip install pyrtlsdr
import numpy as np

sdr = rtlsdr.RtlSdr()
sdr.sample_rate = 2.4e6    # 2.4 Msps
sdr.center_freq = 100e6    # Tune to 100 MHz (FM broadcast band)
sdr.gain = 'auto'

# Capture 256k IQ samples
samples = sdr.read_samples(256 * 1024)

# Windowed FFT
window    = np.hanning(len(samples))
X         = np.fft.fftshift(np.fft.fft(samples * window))
freqs_mhz = (np.fft.fftshift(np.fft.fftfreq(len(samples),
              d=1/sdr.sample_rate)) + sdr.center_freq) / 1e6
power_db  = 20 * np.log10(np.abs(X) + 1e-12)

# power_db vs freqs_mhz now gives you a 2.4 MHz slice of the RF spectrum
# centered at 100 MHz — FM stations visible as peaks every ~200 kHz
sdr.close()

np.fft.fftshift reorders the FFT output so that DC (0 Hz offset) is in the center and negative frequencies are on the left — the conventional spectrum display orientation.


FFT Applications Across Domains

Domain Application Transform used What the frequency axis shows
Audio codecs MP3/AAC encoding MDCT (Modified DCT) Perceptual frequency bands; masked bins discarded
Image compression JPEG 2D DCT on 8×8 blocks Spatial frequency in x and y; high-freq quantized
Wireless comms Wi-Fi (OFDM) IFFT at TX, FFT at RX Subcarrier assignment across 20/40/80/160 MHz
Cellular LTE/5G NR (OFDM) IFFT at gNB, FFT at UE Subcarriers; resource blocks allocated per UE
Test and measurement Oscilloscope FFT Windowed DFT Harmonic content, noise, EMI
Software-defined radio Real-time spectrum analyzer Windowed FFT (continuous) Raw RF spectrum; any modulation visible
Medical imaging MRI reconstruction 2D/3D DFT (k-space) Spatial frequency content of tissue slices
Vibration analysis Accelerometer data FFT Resonant frequencies, bearing fault harmonics
Astronomy Radio telescope array FFT-based correlation Spatial frequencies of the sky brightness map
Cryptography Large integer mult. Number-theoretic transform Polynomial multiplication in O(n log n)

Verdict

The Fourier transform earns its ubiquity. It is not a tool invented to solve one problem and then repurposed; it is a fundamental fact about how information can be represented, and nearly every technology that processes signals of any kind — audio, video, radio, medical — has found a path to it. The FFT made that fundamental fact practical by reducing the computation from quadratic to log-linear: an algorithm change, not a hardware change, that enabled real-time digital signal processing across an entire industry.

The intuitions to walk away with are these. First, frequency and time are dual representations of the same information — choose whichever reveals what you need to see. Second, the FFT is an algorithm for computing the DFT efficiently, not a different mathematical object; the two produce the same result. Third, windowing is not optional for arbitrary signals: every real-world FFT of a continuous stream requires a window, the choice of which is a deliberate engineering decision about the resolution-vs-leakage trade-off. And fourth, OFDM is an FFT made physical — the transform runs in the hardware of every Wi-Fi chip and 5G baseband in the world, billions of times per second, invisibly enabling the wireless infrastructure that the how-cell-networks-work-1g-to-5g post traces from 1G to 5G NR.

If you understand the butterfly and the window, you understand the signal-processing core of modern communications. The rest, from the psychoacoustics of MP3 to the massive MIMO beamforming of 5G, is detail built on that foundation.


Sources

  • Cooley, J.W. and Tukey, J.W., “An Algorithm for the Machine Calculation of Complex Fourier Series,” Mathematics of Computation, 19(90), 1965.
  • Proakis, J.G. and Manolakis, D.K., Digital Signal Processing: Principles, Algorithms, and Applications, 4th ed., Pearson, 2006.
  • Smith, Julius O., Mathematics of the Discrete Fourier Transform (DFT) with Audio Applications, W3K Publishing, 2007 — https://ccrma.stanford.edu/~jos/mdft/
  • Harris, F.J., “On the Use of Windows for Harmonic Analysis with the Discrete Fourier Transform,” Proceedings of the IEEE, 66(1), 1978.
  • NumPy FFT documentation — https://numpy.org/doc/stable/reference/routines.fft.html
  • 3Blue1Brown, “But what is the Fourier Transform? A visual introduction,” YouTube, 2018 — https://www.youtube.com/watch?v=spUNpyF58BY
  • Dahlman, E., Parkvall, S. and Sköld, J., 5G NR: The Next Generation Wireless Access Technology, 2nd ed., Academic Press, 2020.
  • RTL-SDR Blog — https://www.rtl-sdr.com/

Comments