Radar Signal Processing Graph
This demonstration shows the complete radar signal processing graph, from LFM waveform generation through to range-Doppler map creation. Each stage is visualized with interactive Plotly plots.
Processing Flow Diagram
The following diagram shows the complete signal processing flow. This is generated automatically from the graph structure without executing any operations:
Configuration
Radar system parameters and target characteristics for this simulation:
| Parameter | Value | Unit |
|---|---|---|
| Number of Pulses | 128 | pulses |
| Sample Rate | 10 | MHz |
| Pulse Duration | 10 | μs |
| Bandwidth | 5 | MHz |
| Pulse Repetition Interval (PRI) | 1 | ms |
| Pulse Repetition Frequency (PRF) | 1000 | Hz |
| Max Unambiguous Doppler | ±500 | Hz |
| Target Delay | 1.00 | μs |
| Target Range | 150 | m |
| Target Doppler | 200.0 | Hz |
| Noise Power | 0.010 | relative |
Code Example
Here's how to reproduce this processing graph using sigchain:
import staticdash as sd
from sigexec import Graph
from sigexec.blocks import LFMGenerator, StackPulses, RangeCompress, DopplerCompress
from sigexec.diagnostics import plot_timeseries, plot_pulse_matrix, plot_range_profile, plot_range_doppler_map
page = sd.Page('radar', 'Radar Processing')
page.add_header("Radar Signal Processing Graph", level=1)
result = (Graph("Radar")
.add(LFMGenerator(num_pulses=128, target_delay=1e-06,
target_doppler=200.0))
.tap(lambda s: page.add_header("Stage 1: Signal Generation", level=2))
.tap(lambda s: page.add_plot(plot_timeseries(s, title="Generated LFM Pulse")))
.add(StackPulses())
.tap(lambda s: page.add_header("Stage 2: Pulse Stacking", level=2))
.tap(lambda s: page.add_plot(plot_pulse_matrix(s, title="Stacked Pulses")))
.add(RangeCompress(window='hamming', oversample_factor=2))
.tap(lambda s: page.add_header("Stage 3: Range Compression", level=2))
.tap(lambda s: page.add_plot(plot_range_profile(s, title="Range Profile")))
.add(DopplerCompress(window='hann', oversample_factor=2))
.tap(lambda s: page.add_header("Stage 4: Doppler Compression", level=2))
.tap(lambda s: page.add_plot(plot_range_doppler_map(s, title="Range-Doppler Map")))
.run()
)
Processing Graph
Stage 1: LFM Signal Generation
Generate Linear Frequency Modulated (LFM) chirp pulses with simulated target return (delayed and Doppler shifted) plus noise.
Stage 2: Pulse Stacking
Organize the pulses into a 2D matrix (pulses × samples) for coherent processing.
Stage 3: Range Compression
Apply matched filtering using the transmitted waveform. A Hamming window is applied to reduce sidelobe levels.
Stage 4: Doppler Compression
Apply FFT along the pulse dimension to resolve Doppler frequency. This creates the final Range-Doppler Map (RDM).
Processing Summary
| Metric | Value | Unit |
|---|---|---|
| True Target Range | 0.150 | km |
| Detected Peak Range | 0.150 | km |
| Range Error | 0.0 | m |
| True Target Doppler | 200.0 | Hz |
| Detected Peak Doppler | 199.2 | Hz |
| Doppler Error | 0.8 | Hz |
| Estimated SNR | 60.0 | dB |