Passive Bistatic Radar: Monitoring ROTHR from Home
Over-The-Horizon Radar (OTHR) stations transmit powerful HF signals that bounce off the ionosphere to detect targets far beyond the radar horizon. The US Navy’s AN/TPS-71 Relocatable Over-the-Horizon Radar (ROTHR) is one such system. What most people don’t realize is that these signals are readily receivable by anyone with a shortwave radio and a bit of signal processing know-how. This project documents my efforts to receive, process, and extract radar data from ROTHR transmissions using nothing more than web-based SDR receivers and custom software.
What is ROTHR?
The AN/TPS-71 ROTHR is a bistatic over-the-horizon radar operated by the US Navy. It uses Frequency Modulated Continuous Wave (FMCW) transmissions in the HF band (5-28 MHz) to detect aircraft, ships, and other targets at ranges of 500 to 1,600 nautical miles, well beyond the line-of-sight limit of conventional radar. The radar achieves this by bouncing its signal off the ionosphere.
ROTHR is a bistatic system, meaning the transmitter and receiver are separated by a significant distance. The system operates from several known sites including Virginia (primary target for this project), Texas, and Puerto Rico. The Virginia transmitter is located near New Kent and covers the Caribbean with a 64-degree beam wedge.
The key characteristic of ROTHR signals is their FMCW waveform: a linear frequency sweep (chirp) that repeats at a fixed rate, typically 25 to 50 sweeps per second with bandwidths of 20-100 kHz. These chirps are easily visible on a wideband waterfall display as distinctive diagonal lines.
The Concept: Passive Bistatic Radar
Passive bistatic radar exploits existing transmitters (called “illuminators of opportunity”) rather than transmitting its own signal. By receiving the radar’s transmissions with a separate receiver at a known location, it’s possible to compute a range-Doppler map that reveals targets in the radar’s coverage area.
The principle is elegant: the received signal contains both the direct path from the transmitter (via ground wave or skywave) and delayed, Doppler-shifted echoes from targets. By applying a dechirp process (mixing the received signal with a reference chirp) followed by a two-dimensional FFT, you separate returns by both range (time delay) and Doppler (velocity). The result is a range-Doppler map where aircraft appear as bright points against a background of sea clutter and ionospheric backscatter.
The Setup
The entire system runs on a PC with no dedicated radio hardware. Instead, I use publicly accessible WebSDR receivers connected via the internet:
- RX1 (WebSDR, Elizabeth City, NC) — Located approximately 100 km from the ROTHR transmitter at New Kent, VA. This close proximity means RX1 receives a strong direct-path ground wave signal, which provides the timing reference needed for dechirp processing.
- RX2 (WebSDR, Fork Union, VA) — Located approximately 130 km from the transmitter. RX2 provides a second observation angle for bistatic triangulation. Both receivers are within ground wave range of the transmitter, giving strong reference signals on both channels.
The illuminator is the US Navy AN/TPS-71 ROTHR transmitter at New Kent, VA (37.5°N, 76.9°W). This site covers the Caribbean with a 64-degree beam wedge aimed south/southeast, with a nominal range of 500 to 1,600 nautical miles.
Using two receivers at different locations enables bistatic triangulation: each receiver produces an iso-range ellipse for a given target, and the intersection of these ellipses yields a geographic bearing for the target. This is the passive radar equivalent of having your own receiver array.
Signal Processing Pipeline
1. IQ Capture
The WebSDR receivers stream raw IQ data via WebSocket connections. The tracker captures 10-20 seconds of complex baseband samples at 12 kHz, centered on the known ROTHR frequency. GPS timestamps embedded in the data stream provide precise timing for phase alignment.
2. Dechirp
The FMCW chirp is removed by mixing the captured signal with a synthetic reference chirp matched to the radar’s sweep parameters (rate, bandwidth, period). This converts each target return from a swept-frequency signal into a constant-frequency tone whose frequency is proportional to range. The direct-path signal (ground wave at both RX1 and RX2) appears as a strong reference peak near zero beat frequency.
3. Range-Doppler Map
A two-dimensional FFT is applied across the dechirped sweeps. The first FFT (per sweep) resolves range. The second FFT (across sweeps) resolves Doppler shift, which corresponds to the target’s radial velocity component. The result is a 2D map with range on one axis, Doppler frequency on the other, and signal power as intensity.
Typical resolution at 20 kHz bandwidth and 512 sweeps: 15 km range resolution and 0.10 Hz Doppler resolution (about 10 seconds of integration time).
4. Processing Modes
The tracker supports three signal processing modes, cycled with a single keystroke:
- DECHIRP — Standard FMCW dechirp processing. Best for continuous-wave (100% duty cycle) signals.
- GATED — Zeros the TX-off gaps before range FFT. Provides approximately +2.7 dB SNR improvement on pulsed (FMOP) signals.
- PCOMP (Pulse Compression) — True matched filter processing. Detects active pulse segments and cross-correlates with a transmitted pulse template. Provides approximately +3.9 dB SNR improvement on FMOP signals at the cost of fewer range bins.
This matters because the same ROTHR transmitter uses different waveforms on different frequencies. Some are continuous FMCW (100% duty cycle), while others use FMOP (Frequency Modulation on Pulse) with varying duty cycles. The adaptive processing modes ensure the best possible target extraction regardless of waveform type.
ADS-B Correlation
To validate that the returns on the range-Doppler map are real aircraft and not noise or clutter, the tracker cross-references detected targets against live ADS-B (Automatic Dependent Surveillance-Broadcast) data from the OpenSky Network.
For each target detected on the RD map, the system computes the expected bistatic range and Doppler shift for every aircraft currently in the coverage zone, then matches by proximity in range-Doppler space. A good correlation shows a detected target at the same range and Doppler as a known aircraft. The best match recorded so far: AMX423 at a range difference of 1 km and Doppler difference of 0.0 Hz, a pixel-perfect match.
Typically 100-115 aircraft are in the coverage zone during daytime hours, providing ample opportunities for correlation.
The Tracker
The main tool is a real-time Python tracker application with a full graphical interface:
Display Features:
- Dual Range-Doppler Maps — Stacked RD maps for RX1 (top) and RX2 (bottom), with a dark radar colormap and adjustable power threshold
- Coverage Map — Geographic display with coastline overlays, bistatic range ellipses, TX/RX positions, and target bearings
- Track Management — Designate targets on either RD map with Shift+Click, track them with glowing trails, and view callsign labels from ADS-B data
- Integration Control — Adjustable coherent integration from 1x to 128x, trading time resolution for SNR
- Clutter Filtering — Three modes: OFF, MTI (sweep differencing), and RD-FILT (zero-Doppler suppression preserving all sweeps)
Bearing Solver: The dual-receiver bearing solver computes the geographic intersection of two iso-range ellipses. Each ellipse represents all possible target locations at a given bistatic range from one TX-RX pair. The solver generates 720 points per curve, finds the closest intersection pairs, and plots the result as a gold star on the coverage map. The workflow is simple: designate the same target on both RD maps, and the bearing appears automatically.
Phase Relay: Each receiver’s ground wave direct-path lock establishes absolute GPS timing for each sweep boundary. This timing is computed once from the first good frame and held stable for the session. If a receiver loses its ground wave lock, the other can provide relayed timing. If RX2 is unavailable, the tracker falls back to single-receiver mode seamlessly.
Scanner
Finding active ROTHR frequencies is half the challenge. The frequencies hop with time of day and ionospheric conditions. A scanner module automates this by:
- Cycling through candidate HF frequencies using multiple SDR sources worldwide
- Applying dechirp detection (not just power detection) to identify genuine FMCW/FMOP signals
- Logging detections with sweep parameters (rate, bandwidth, SNR) for analysis
Confirmed active frequencies during this project include: 10472 kHz (evening/night), 11795 kHz (evening), 13784 kHz (daytime, strongest at 29 dB), 15146 kHz (daytime, best ADS-B correlation), and 18477 kHz (daytime, longer skip).
Ionospheric Considerations
OTHR fundamentally depends on ionospheric propagation, which introduces several challenges:
- Sea backscatter appears as a broad Doppler ridge from ocean surface currents. At 19908 kHz, a +1.4 Hz Doppler offset was observed, corresponding to radial ocean current velocities of 10-22 knots.
- Ionospheric clutter dominates at frequencies below about 12 MHz, where heavy backscatter can produce over 100 false tracks with zero ADS-B matches.
- Range extent covers approximately 1800 km (for 12 kHz capture bandwidth and a 20 kHz chirp). The Virginia ROTHR’s 500-1600 NM operational range fits comfortably within this window.
- Waveform variation is significant. The same ROTHR transmitter uses different waveforms on different frequencies: continuous FMCW (100% duty) on some, FMOP pulsed waveforms (25-55% duty) on others. The tracker’s adaptive processing modes handle this automatically.
What You Need to Try This
The beauty of this project is that it requires no dedicated radio hardware:
- A PC running Python (Windows, Linux, or macOS)
- Internet access to WebSDR receivers
- An ADS-B data source (OpenSky Network free API or similar)
- Knowledge of the illuminator’s sweep parameters (period, bandwidth)
The entire software stack is custom-built. Based on the pioneering work of Christoph Mayer (hcab14) on KiwiSDR OTHR processing.
Results
The system has been operational since May 2026. Key results:
- Consistent detection of aircraft targets on multiple ROTHR frequencies
- ADS-B correlation rates confirming the vast majority of targets are real aircraft
- Successful dual-receiver bearing triangulation with the RX1/RX2 pair
- Detection of sea surface current signatures in backscatter Doppler
- Observation of multiple ROTHR waveform modes (FMCW, FMOP) across different frequencies
- Range-Doppler SNR exceeding 30 dB on strong daytime frequencies
Second Example: Mediterranean PLUTO II OTHR
The same techniques work with other OTHR systems worldwide. Below is a capture from monitoring a different OTHR illuminator in the Mediterranean region, using WebSDR receivers in Cyprus as the dual-RX pair. The coverage map shows the transmitter and receiver positions with bistatic range ellipses overlaid on the Mediterranean. A target has been designated on both RD maps and the bearing solver has computed a geographic fix (gold star labeled “#2 BEARING”). Note the 91 ADS-B aircraft in the coverage zone and the 32.7 dB SNR on this frequency.
This is an example of a movie created from a monitoring session of the PLUTO II OTH Radar on 11111kHz. In this Range-Doppler map, the backscatter curtain can be seen at 0Hz with a strong reflection region at around 2500km bistatic range. Many targets can be seen on either side of 0Hz coming in and out of the noise floor along with natural Ionospheric structures visible as well. Non-coherent integration was used to increase SNR and to bring out weak targets.
PLUTO II with Advanced CFAR Processing
This next movie shows a recent PLUTO II monitoring session using our full suite of professional-grade CFAR (Constant False Alarm Rate) detection algorithms. These are the same techniques used in operational OTHR systems, and we are implementing them following the theory described in Giuseppe Fabrizio’s textbook “High Frequency Over-the-Horizon Radar Fundamental Principles, Signal Processing, and Practical Appliations”, the definitive reference on OTHR signal processing.
The detection layer running on this Range-Doppler map uses the below key processing techniques working together:
- CFAR (Constant False Alarm Rate) — The fundamental detection problem in radar is separating real targets from noise. A fixed threshold is useless in OTHR because the noise floor changes constantly across range and Doppler due to ionospheric conditions, sea clutter, and interference. CFAR solves this by computing the detection threshold adaptively from a local neighborhood of cells around each pixel under test. The threshold tracks the local noise floor, so it automatically rises in noisy regions and lowers in quiet ones. The result is a constant probability of false alarm (Pfa) across the entire RD map, regardless of how the background varies. Our implementation uses a cross-shaped kernel with guard cells to prevent target energy from contaminating the noise estimate.
- CFAR-GOOS (Greatest-Of Ordered Statistics) — Instead of a fixed detection threshold, GOOS-CFAR slides a cross-shaped kernel across the range-Doppler map, estimating the local noise floor separately along the range axis and the Doppler axis. Each arm computes the median of its reference cells (not the mean), making it robust against outliers from closely spaced targets or clutter discretes. The greater of the two arm estimates is used, which handles clutter edges where noise is homogeneous in one direction but varies sharply in the other (Fabrizio Eqn. 4.130). This maintains a constant false alarm rate even when the noise floor varies dramatically across the RD map due to ionospheric clutter.
- CFAR-CA (Cell Averaging with GOCA) — The alternative CFAR mode, available via the T key. Uses the same cross-shaped kernel but computes the arithmetic mean of each arm instead of the median, then takes the greatest-of the two means (Fabrizio Eqn. 4.128). CA is optimal when the background is homogeneous Gaussian noise, giving the lowest detection threshold for a given Pfa. However, it is more sensitive to clutter discretes and multi-target situations than GOOS, which is why GOOS is the default. Both methods share the same Weibull whitening and guard cell architecture.
- WHITEN (Weibull Clutter Whitening) — Standard CFAR assumes the background noise follows a Rayleigh distribution (Weibull shape parameter C=2). In practice, OTHR clutter from ionospheric scattering, sea state, and ground bounce has much heavier tails, with C as low as 0.33. If CFAR uses the Rayleigh assumption in these regions, the heavy clutter tails exceed the detection threshold and produce false alarms by the thousands. The whitening transform estimates the local Weibull shape parameter C using the Menon estimator, then applies z = y / B^(C/2) to map both noise and clutter to a common unit-Rayleigh distribution (Fabrizio Eqn. 4.131-4.132). CFAR then operates on correctly normalized data regardless of whether a given range-Doppler region is noise-dominated or clutter-dominated. The result: constant false alarm rate across the entire RD map, even where clutter characteristics change dramatically from cell to cell.
- BM (Ballistic Missile Range-Rate Detector) — Beyond conventional aircraft and ship targets, OTHR can detect ballistic missile launches by their extreme range-rate signatures. A BM traveling at Mach 7 produces approximately 242 Hz of Doppler shift at 18 MHz, which aliases into the normal Doppler band and can be mistaken for slower targets. The BM detector identifies these high-velocity targets by tracking their unique range-rate signatures across multiple CPIs, classifying them by velocity profile: plausible BM (red), fast but sub-threshold (orange), or ionospheric/meteor clutter (yellow). The wide Doppler scales (BM-1 at +/-250 Hz, BM-2 at +/-500 Hz) reveal the full aliased pattern of these extreme-velocity targets.
- TFA (Time-Frequency Analysis De-Chirp) — When a ballistic missile accelerates during boost phase, its Doppler frequency is not stationary. It sweeps across many frequency bins during one CPI, and a standard FFT spreads that energy out, losing 10+ dB of SNR. TFA computes a short-time Fourier transform (STFT) spectrogram on BM candidate range bins, extracts the Doppler frequency law (the curve of frequency vs time), then de-chirps the signal by removing that frequency modulation. The result is coherent integration gain recovered from what the standard FFT scattered. The pink TFA markers on the RD map show the processing gain in dB and the measured Doppler slope in Hz/s for each analyzed target.
- DATEX (Data Extrapolation) — OTHR Doppler resolution is directly proportional to CPI length: more sweeps means finer frequency bins and better SNR through coherent integration. But longer captures mean slower update rates and more ionospheric variability within one CPI. DATEX solves this tradeoff by predicting future slow-time samples from the dominant Doppler components already present in the captured data. After the range FFT, each range bin’s slow-time signal is decomposed into its Doppler spectrum. The dominant sinusoidal components are identified and extended forward in time, effectively doubling the sweep count (64 real sweeps become 128 effective). This delivers the Doppler resolution and coherent integration gain of a full-length capture at half the collection time (1.28s instead of 2.56s at 20ms sweep period). The extrapolation includes an SNR gate: range bins where no component rises above the noise floor are zero-padded rather than extrapolated, preventing artificial coherent gain from noise. Most effective on strong targets; weak targets near the noise floor extrapolate less reliably (Fabrizio Ch. 4.6, parametric spectral estimation for aperture extension).
- Integration (Non-Coherent RD Map Averaging) — A single RD map snapshot is often too noisy to reveal weak targets buried in the clutter floor. Non-coherent integration solves this by averaging multiple consecutive RD maps together before display and detection. Each incoming RD map is converted from dB to linear power, appended to a rolling buffer of the last N maps (configurable from 1 to 128 frames via the I key), and the buffer is averaged in linear power before converting back to dB for display. This is non-coherent integration (power-domain, not phase-domain), so it does not require phase stability between frames and works even with ionospheric path variations between CPIs. The SNR improvement follows the square-root law: averaging N frames gains approximately 5·log₁₀(N) dB of SNR. At 8 frames that is ~4.5 dB, at 32 frames ~7.5 dB, at 128 frames ~10.5 dB. The tradeoff is temporal resolution: with 128 frames integrated, the display updates much more slowly, and fast-moving targets smear across Doppler. The optimal setting depends on the target type: 4-8 frames for tracking fast aircraft, 16-32 for slow ship detection, 64-128 for pulling the weakest targets out of the noise floor. The integration buffer resets automatically on frequency change, processing mode switch, or any parameter that changes the RD map shape (Fabrizio Ch. 4.5, non-coherent integration of ambiguity surfaces).
Together, these layers transform a noisy OTHR range-Doppler map into a clean target detection stream. Each technique is implemented from first principles following Berizzi’s OTHR Measurement and Information Theory, adapted for our passive bistatic geometry. The result speaks for itself in the video above.
What started as an experiment in passive signal processing has become a fully functional bistatic radar tracker running from a home computer, using nothing but web-connected SDR receivers and some determination. The ionosphere makes a surprisingly capable radar mirror when you know how to listen.


