Pulse Compression Simulator: Chirp Radar & Range Resolution

simulator advanced ~12 min
Loading simulation...
ΔR = 15 m with compression ratio 1000 (30 dB gain)

A 100 μs pulse with 10 MHz bandwidth achieves 15 m range resolution and a compression ratio (processing gain) of 1000 (30 dB). Without compression, the same pulse would have 15 km range resolution — 1000× worse.

Formula

ΔR = c / (2·B) (compressed range resolution)
CR = τ · B (compression ratio / time-bandwidth product)
SNR_gain = 10·log₁₀(τ·B) dB

The Range Resolution Dilemma

In simple pulsed radar, range resolution equals c·τ/2 — shorter pulses give finer resolution but carry less energy, reducing detection range. A 1 μs pulse resolves targets 150 m apart but carries 1/100th the energy of a 100 μs pulse. Pulse compression breaks this trade-off: by modulating a long pulse with a frequency sweep (chirp) and applying matched filtering on receive, the radar achieves the resolution of a short pulse with the energy of a long one.

The Linear Frequency Modulated Chirp

The most common waveform sweeps frequency linearly across bandwidth B during pulse duration τ. On receive, a matched filter (whose impulse response is the time-reversed transmitted waveform) compresses the energy into a spike of width ~1/B. The compression ratio τ·B can exceed 10,000 in modern systems — a 100 μs pulse with 100 MHz bandwidth compresses to 10 ns, achieving 1.5 m resolution while maintaining the full energy of the long pulse.

Matched Filter Processing

The matched filter maximizes output SNR by correlating the received signal with a replica of the transmitted waveform. For a chirp, this is efficiently implemented using the FFT: multiply the received spectrum by the conjugate of the transmitted spectrum, then inverse-FFT. The result is a compressed pulse with peak SNR improved by exactly the time-bandwidth product — a 30 dB gain for TBP = 1000.

Sidelobes and Windowing

The compressed pulse has range sidelobes at -13.3 dB (for a rectangular window) that can mask weak targets near strong ones. Window functions (Hamming, Taylor, Kaiser) reduce sidelobes to -40 dB or below at the cost of slightly broadened main lobe (~20% wider). Modern radars often use mismatched filters or nonlinear frequency modulation to achieve very low sidelobes with minimal resolution loss — critical for detecting small targets near large clutter returns.

FAQ

What is pulse compression?

Pulse compression is a radar technique that transmits a long, coded pulse (typically a linear frequency sweep or 'chirp') and processes the return with a matched filter to produce a short, high-resolution pulse. This achieves the range resolution of a short pulse with the energy (and thus detection range) of a long pulse, overcoming the fundamental pulse-width/resolution trade-off.

What is a chirp signal?

A chirp is a pulse whose frequency sweeps linearly from f₀ to f₀+B over the pulse duration τ. The instantaneous frequency increases (up-chirp) or decreases (down-chirp) linearly with time. When the reflected chirp passes through a matched filter, different frequency components are delayed by different amounts, compressing the long pulse into a narrow spike of width ~1/B.

What is the time-bandwidth product?

The time-bandwidth product TBP = τ×B is the compression ratio — the factor by which the matched filter compresses the pulse. It also equals the processing gain in SNR (in linear units). A TBP of 1000 means the compressed pulse is 1000× shorter than the transmitted pulse, with 30 dB better SNR than an unmodulated pulse of the same peak power.

What limits pulse compression performance?

Practical limits include range sidelobes (suppressed by window functions at slight resolution cost), Doppler sensitivity (fast targets shift the chirp frequency, degrading compression), hardware bandwidth limitations, and the need for high dynamic range in the receiver to handle strong clutter alongside weak targets.

Sources

Embed

<iframe src="https://homo-deus.com/lab/radar-systems/pulse-compression/embed" width="100%" height="400" frameborder="0"></iframe>
View source on GitHub