FMCW Radar Build and Signal Processing

~200 min8 Steps

Build a working FMCW radar using PlutoSDR or HackRF: generate LFM chirps, process beat frequencies with FFT, implement moving target indication, and display a live range profile.

Prerequisites
Gather these before starting the workshop
  • PlutoSDR (ADALM-PLUTO) or HackRF One — PlutoSDR strongly preferred for full duplex
  • Two 2.4 GHz patch antennas with SMA connectors
  • GNU Radio 3.10+ installed
  • Python 3.10+ with NumPy, SciPy, Matplotlib, pyadi-iio
  • Metal test targets: aluminum sheet metal, cookie tin, or similar
Step 1 of 813% complete
FMCW Theory Review
25 min
Step 1

FMCW radar is fundamentally different from pulsed radar: instead of measuring time-of-flight directly, you measure the frequency difference between the transmitted and received signal. This beat frequency is proportional to range — no nanosecond timing required.

Frequency-Modulated Continuous Wave (FMCW) radar continuously transmits a chirp signal whose frequency sweeps linearly over time. The reflected echo from a target returns after a time delay τ = 2R/c. Since the transmit frequency has changed during that delay, mixing TX and RX produces a beat tone at a constant frequency — the beat frequency — which encodes range.

Core FMCW equations

Chirp rate (slope):

k = BW / T_sweep [Hz/s]

Beat frequency from a target at range R:

f_beat = (2 × R × k) / c = (2 × R × BW) / (c × T_sweep)

Range from measured beat frequency:

R = (f_beat × c × T_sweep) / (2 × BW)

Range resolution (minimum separable distance):

ΔR = c / (2 × BW)

With 100 MHz sweep bandwidth: ΔR = 1.5 m. With HackRF's 20 MHz instantaneous BW: ΔR = 7.5 m. PlutoSDR at 10 MHz BW: ΔR = 15 m.

Beat frequency is constant for a stationary target

As long as the target doesn't move, the same range produces the same beat tone — you can average many chirps to improve SNR without smearing.

Moving targets add Doppler frequency

A target at velocity v adds ±2v·fc/c to the beat frequency. This shifts the range FFT peak and can be separated with slow-time processing (Doppler FFT).

Maximum unambiguous range

R_max = fs × c × T_sweep / (2 × BW), where fs is sample rate. With 20 MHz BW and 1 ms sweep at 20 MHz sample rate: R_max ≈ 150 m.

TX-to-RX isolation

The transmit signal leaks directly into the receiver, appearing as a large DC or near-DC beat tone. This clutter must be suppressed to see close-range targets.