SDR Spectrum Analysis: Detect Enemy Drone RF
Use software-defined radio to detect and analyze enemy drone RF signatures. SDR hardware and signal processing.
From Raw Spectrum to Actionable Intelligence
The rtl_power utility sweeps the 140-600 MHz band in approximately 2 seconds, producing a CSV file with power measurements in 100 kHz bins. At 4,600 frequency bins per sweep, the data forms a spectrogram that reveals every active transmitter in the band. Normal background: thermal noise at -110 dBm across all bins. A narrowband jammer appears as a sharp spike (+30-50 dB above noise) at a specific frequency. A barrage jammer appears as a raised noise floor across hundreds of bins simultaneously. A MANET hopping signal appears as brief flickers across random channels — much harder to see but detectable through statistical analysis of channel occupancy patterns.
Lisa 26 processes the spectrogram automatically: any persistent signal above noise floor plus 20 dB that does not match known friendly emissions is classified as a potential threat. The system correlates detections across time — a signal that appears consistently for more than 30 seconds at the same frequency is likely a jammer or enemy radio, not transient interference. The bearing to the source is estimated from signal strength if the SDR antenna has directional characteristics, or from triangulation if two SDR stations are available.
Triangulation — Locating the Jammer
Two SDR stations separated by 500+ meters can triangulate a jammer's position. Each station measures bearing to the signal using either a directional antenna (rotate for maximum signal) or amplitude comparison between two fixed antennas. The intersection of two bearings gives a position estimate with accuracy dependent on baseline length, bearing accuracy, and geometry. At 500m baseline with ±5° bearing accuracy: jammer position accuracy of ±50-100m at 5 km range. This is sufficient for FPV engagement (the FPV pilot can search a 100m area in 10 seconds) or for artillery fire mission (100m CEP is within artillery effectiveness radius).
The jammer operator faces an unsolvable dilemma: to jam effectively, the jammer must transmit at high power. High power transmission makes the jammer trivially detectable by passive SDR. Once located, the jammer is destroyed by FPV or artillery. Replacing a jammer takes hours to days. The cost asymmetry is dramatic: a €25 SDR locates a €50,000 jammer that is then destroyed by a €270 FPV drone. This is why electronic warfare ultimately favors the defender who can detect, locate, and destroy jammers faster than the adversary can deploy replacements.
Continuous spectrum monitoring transforms the electronic warfare picture from reactive to proactive. Without spectrum analysis, the brigade discovers enemy jamming only when communications fail — by then, operational damage is done. With real-time spectrum surveillance, Lisa 26 is DESIGNED to detect jammer activation within seconds and recommend countermeasures before the jamming affects operations (design goal, not validated under field conditions). The spectrum picture is as important as the terrain picture.
Equipment — Spectrum Analysis
SDR SPECTRUM ANALYSIS KIT
What You Can See
Plug the RTL-SDR into a laptop USB port. Open GQRX. Set center frequency to 300 MHz (mil-band) (ELRS band). You see a waterfall display showing all radio activity in that band. Your own MANET radio module appears as a hopping signal. Enemy jammers appear as wide, constant noise. Enemy drone control links appear as narrow signals at their operating frequency. By monitoring the spectrum, you build a picture of the enemy's electronic order of battle — which frequencies they use, when they transmit, and from which direction (using a directional antenna).
Practical Exercises (Verified)
Implementation
# SDR Spectrum Analysis — Detect Enemy Jammers
# pip install numpy
import numpy as np
import subprocess
def scan_spectrum(freq_start_mhz=140, freq_end_mhz=600, bin_size_khz=100):
"""Scan spectrum using RTL-SDR and detect anomalies."""
# rtl_power: sweep spectrum and output CSV
cmd = f"rtl_power -f {freq_start_mhz}M:{freq_end_mhz}M:{bin_size_khz}k -1 scan.csv"
subprocess.run(cmd.split())
# Parse results
data = np.loadtxt("scan.csv", delimiter=",", usecols=[2,6])
freqs = data[:, 0]
powers = data[:, 1]
# Detect jammers: power > noise floor + 20dB
noise_floor = np.median(powers)
threshold = noise_floor + 20
jammer_bins = np.where(powers > threshold)[0]
jammers = []
for idx in jammer_bins:
jammers.append({
"freq_mhz": freqs[idx],
"power_dbm": powers[idx],
"type": "barrage" if len(jammer_bins) > 100 else "spot"
})
return jammers, noise_floor
# Deploy on Lisa 26 node with RTL-SDR (€25)
# Two SDR stations 500m apart → triangulate jammer position ±50m