Fourier Transforms (np.fft)

The Fast Fourier Transform decomposes a signal sampled in time into the frequencies it contains, turning a wiggly waveform into a clear list of which frequencies are present and how strong each one is.

Learn Fourier Transforms (np.fft) in our free NumPy course — a beginner-friendly interactive lesson with worked examples, a practice exercise and a quick…

Part of the free Numpy course at LearnCodingFast — hands-on lessons with examples you run in your browser, plus practice exercises and a quick quiz.

You'll run np.fft.fft and its inverse, map output bins to real frequencies with fftfreq , read a magnitude spectrum, and use the faster rfft for real-valued signals.

What You'll Learn in This Lesson

1 Forward and Inverse FFT

np.fft.fft(x) takes a 1D array of samples and returns an array of complex numbers , one per frequency bin. np.fft.ifft runs the transform backwards and returns the original samples (to floating-point precision). The pair is lossless: ifft(fft(x)) equals x .

The very first output element (bin 0) is always the sum of the inputs — the DC component , or average level. Here is a clean example where a pure oscillation makes the structure obvious.

2 Frequencies and the Magnitude Spectrum

A bare FFT result is hard to read until you know which frequency each bin represents. np.fft.fftfreq(n, d) returns those frequencies, where n is the sample count and d is the time between samples. Taking np.abs of the FFT gives the magnitude spectrum — peaks appear at exactly the frequencies present in the signal.

The peaks at bins 1 and 2 (and their mirror images at the negative frequencies) confirm both cosines, and bin 1 is twice as tall as bin 2 because the first cosine had twice the amplitude.

3 rfft: The Real-Signal Shortcut

The spectrum of a real-valued signal is mirror-symmetric, so the negative-frequency half is redundant. np.fft.rfft returns only the unique first half — n/2 + 1 values — which is faster and cleaner to plot. Use np.fft.rfftfreq for the matching frequencies and np.fft.irfft to invert.

🎯 YOUR TURN: Fill in the Blanks

Replace each ___ so the program transforms a signal, prints its magnitude, and reconstructs it.

Expected output: the magnitude is [0. 2. 0. 2.] and the inverse recovers [ 1. 0. -1. 0.] . (Answers: fft , abs , ifft .)

⚠️ Common Errors & Quick Reference

fft returns complex numbers; printing them directly or comparing to floats is confusing.

✅ Fix: take np.abs(spec) for magnitude and np.angle(spec) for phase, and use .real after ifft .

❌ Plotting magnitude against bin index instead of frequency

Bin numbers are meaningless without the sample spacing.

✅ Fix: pair the spectrum with np.fft.fftfreq(n, d) (or rfftfreq for rfft) to get real frequency units.

Task

Code

Forward transform

np.fft.fft(x)

Inverse transform

np.fft.ifft(X)

Bin frequencies

np.fft.fftfreq(n, d)

Magnitude spectrum

np.abs(X)

Real-input transform

np.fft.rfft(x)

🎯 Mini Challenge: Find the Dominant Frequency

Build a pure sine that completes 3 cycles over 16 samples, take its rfft magnitude, and use argmax to find which frequency bin dominates.

❓ Frequently Asked Questions

Lesson complete — Fourier transforms unlocked!

You can now run a forward and inverse FFT, label bins with fftfreq , read a magnitude spectrum to find the frequencies in a signal, and reach for rfft when your data is real-valued.

🚀 Up next: Interpolation (np.interp) — estimate values between known data points.

Practice quiz

What does np.fft.fft return for a 1D signal?

  • An array of complex numbers, one per frequency bin
  • A single real number
  • A sorted copy of the input
  • The signal's mean

Answer: An array of complex numbers, one per frequency bin. The FFT gives complex values describing the signal's frequency content.

Which function is the exact inverse of np.fft.fft?

  • np.fft.fftfreq
  • np.fft.rfft
  • np.fft.ifft
  • np.fft.fftshift

Answer: np.fft.ifft. ifft runs the transform backwards, so ifft(fft(x)) recovers x.

What does the first FFT output element (bin 0, the DC component) equal?

  • The maximum sample
  • The sum of the input samples
  • Always zero
  • The first sample

Answer: The sum of the input samples. Bin 0 is the sum of the inputs, i.e. the average level scaled by N.

What does np.fft.fftfreq(n, d) return?

  • The magnitude spectrum
  • The inverse transform
  • The phase of each bin
  • The frequency value for each FFT bin

Answer: The frequency value for each FFT bin. fftfreq maps each bin to a real frequency given sample count n and spacing d.

How do you get the magnitude spectrum from an FFT result spec?

  • np.abs(spec)
  • spec.real
  • np.sum(spec)
  • np.sort(spec)

Answer: np.abs(spec). np.abs gives the magnitude of each complex bin; peaks mark the frequencies present.

How many values does np.fft.rfft return for a real signal of length 8?

  • 8
  • 4
  • 5
  • 16

Answer: 5. rfft returns n/2 + 1 = 5 values, the non-redundant half of the spectrum.

When should you prefer np.fft.rfft over np.fft.fft?

  • When the input is real-valued
  • When the input is complex
  • When you need the inverse
  • Only for 2D arrays

Answer: When the input is real-valued. Real signals have a symmetric spectrum, so rfft returns just the unique half, faster.

After ifft, why do you usually take .real of the result?

  • To sort it
  • ifft returns complex values with tiny imaginary round-off
  • To normalize it
  • To make it an integer

Answer: ifft returns complex values with tiny imaginary round-off. Reconstructing a real signal leaves negligible imaginary parts; .real drops them.

Which function gives the frequencies that match an rfft result?

  • np.fft.fftfreq
  • np.fft.ifft
  • np.fft.rfftfreq
  • np.angle

Answer: np.fft.rfftfreq. rfftfreq returns the frequencies for the half-spectrum produced by rfft.

For x = [1, 0, -1, 0], what is np.abs(np.fft.fft(x))?

The magnitude spectrum is [0, 2, 0, 2], energy in the frequency-1 bins.

Continue this course