Build a software-defined radio receiver from 500 kHz to 1.7 GHz using RTL-SDR hardware, GNU Radio signal processing, and custom antenna design.
RFSDRRTL-SDRGNU RadioAntennaSoftware Defined Radio
DifficultyAdvanced
Duration5–6 weeks
Components10 items
Steps5 steps
📖
Introduction
Build a software-defined radio receiver from 500 kHz to 1.7 GHz using RTL-SDR hardware, GNU Radio signal processing, and custom antenna design. This comprehensive guide covers everything from design through implementation, testing, and deployment.
🧪
Theory & Background
Software-Defined Radio: hardware digitizes a wide slice of spectrum, software processes the digital data to demodulate specific signals. RTL-SDR: RF input → bandpass filter → LNA → mixer (downconversion to IF) → IF amplifier → ADC (28.8 MHz sample rate, 8-bit) → USB → PC. PC software: GNU Radio implements digital tuning (NCO + mixer shifts desired frequency to baseband), demodulation (FM, AM, SSB), decoding. Frequency range: 500 kHz–1.7 GHz. 2.4 MHz bandwidth viewable simultaneously. Useful for: listening to FM radio, tracking aircraft (ADS-B), weather satellite images (NOAA), marine AIS, pager decoding (POCSAG).
Advertisement
🔨
Components & Requirements
10 components required for this project.
#
Component
Purpose
Qty
1
RTL-SDR V3 Dongle (RTL2832U + R820T2)
Wideband SDR receiver
x1
2
HackRF One (optional, TX+RX)
Transmit and receive SDR (licensed bands)
x1
3
Low Noise Amplifier (LNA4ALL)
Weak signal amplification
x1
4
Band-pass filters (FM, ADS-B, weather)
Interference rejection
x3
5
Dipole antenna kit (adjustable)
General-purpose reception
x1
6
ADS-B antenna (1090 MHz vertical)
Aircraft tracking
x1
7
Raspberry Pi 4 (headless SDR server)
SDR host computer
x1
8
GNU Radio 3.10 (open source)
Signal processing flowgraph software
x1
9
SDR# (Windows SDR software)
General-purpose SDR receiver app
x1
10
SMA adapters and coaxial cable (RG-174)
RF connectivity
x1
📋
Step-by-Step Implementation
Follow these 5 steps carefully.
1
SDR Architecture and Radio Fundamentals
Software-Defined Radio: hardware digitizes a wide slice of spectrum, software processes the digital data to demodulate specific signals. RTL-SDR: RF input → bandpass filter → LNA → mixer (downconversion to IF) → IF amplifier → ADC (28.8 MHz sample rate, 8-bit) → USB → PC. PC software: GNU Radio implements digital tuning (NCO + mixer shifts desired frequency to baseband), demodulation (FM, AM, SSB), decoding. Frequency range: 500 kHz–1.7 GHz. 2.4 MHz bandwidth viewable simultaneously. Useful for: listening to FM radio, tracking aircraft (ADS-B), weather satellite images (NOAA), marine AIS, pager decoding (POCSAG).
2
GNU Radio Flowgraph Construction
GNU Radio uses a flowgraph: signal sources → signal processing blocks → sinks. FM Broadcast receiver flowgraph: RTL-SDR Source (center_freq=100.1e6, sample_rate=2.4e6) → Low Pass Filter (cutoff 75kHz) → FM Demodulator (deviation=75kHz) → Audio Sink (sample_rate=48000). Parameters in Python: blocks connect via ports. Spectrum analyzer: Waterfall Sink (shows frequency vs time as color) and FFT Sink (shows frequency spectrum). IQ data: each sample has two components (In-phase and Quadrature) — preserves full frequency information including sign (positive/negative frequency).
3
ADS-B Aircraft Tracking
ADS-B: Aircraft broadcast their GPS position, altitude, speed, and call sign at 1090 MHz. Antenna: quarter-wave monopole for 1090 MHz = 69mm wire from center conductor, counterpoise radials. Install dump1090-fa (Flightaware's ADS-B decoder). Run: dump1090 --net. Connects at 127.0.0.1:8080 for web map showing all nearby aircraft (50–300 km range). Increase range: add LNA (20dB+ amplification) and coaxial cable with low loss (LMR-400 or Aircell-7). Enhance antenna: build a 1/4 wave radial antenna on SMA plug.
4
NOAA Weather Satellite Reception
NOAA-15/18/19 transmit analog APT weather satellite images at 137 MHz. Pass duration: 12–15 minutes (LEO orbit). Predict passes: Heavens-Above.com or Gpredict software (knows satellite orbital elements). Antenna: turnstile antenna (two crossed dipoles, 90° phase offset) for circular polarization — satellite transmits RHC polarization. Record: wide FM demodulation (deviation 34kHz). Decode APT image: WXtoIMG or noaa-apt decoder. Result: visible + infrared image of Earth from 800km altitude — location visible if correct local time and cloud cover.
5
Signal Analysis and Spectrum Scanning
rtl_power: scan 24 MHz to 1.7 GHz in steps, generate spectrum heatmap. Identify signals: CW morse code (narrow spike), FM broadcast (200kHz wide), TETRA (trunked radio, 25kHz carrier), LTE cellular (wide), ISM bands (433, 868, 915 MHz — remote controls, LoRa, Sigfox). Signal identification tool: sigidwiki.com (community database of 500+ signal types by waterfall appearance). Measure: RSSI (signal strength), bandwidth, modulation type. Record IQ samples to disk for later analysis.
💻
Code & Implementation
Core code for fm_receiver.py:
fm_receiver.pyPython
#!/usr/bin/env python3 # Simple FM Receiver using GNU Radio and RTL-SDR # pip install gnuradio (or install from package manager) from gnuradio import gr, audio, analog, filter, blocks from gnuradio.filter import firdes import osmosdr class FMReceiver(gr.top_block): def __init__(self, freq=100.1e6): super().__init__() # Sample rate and channel config samp_rate = 2400000 # 2.4 MSPS from RTL-SDR audio_rate = 48000 # Audio output sample rate fm_dev = 75000 # FM deviation ±75 kHz # Source: RTL-SDR hardware self.src = osmosdr.source() self.src.set_sample_rate(samp_rate) self.src.set_center_freq(freq) self.src.set_gain(30) # RF gain in dB self.src.set_if_gain(20) self.src.set_bb_gain(20) # Low-pass filter: pass ±100 kHz around center (FM broadcast bandwidth) lp_taps = firdes.low_pass(1, samp_rate, 100000, 25000) self.lpf = filter.fir_filter_ccf(1, lp_taps) # Rational resampler: 2400000 → 240000 (decimate ×10) self.resamp = filter.rational_resampler_ccc(1, 10) # FM demodulator self.fm_demod = analog.fm_demod_cf( channel_rate=240000, audio_decim=5, deviation=fm_dev, audio_pass=15000, audio_stop=16000, gain=1.0, tau=75e-6) # Audio output self.audio_sink = audio.sink(audio_rate, "", True) # Connect flowgraph self.connect(self.src, self.lpf, self.resamp, self.fm_demod, self.audio_sink) if __name__ == '__main__': freq = float(input("Enter FM frequency (MHz): ")) * 1e6 receiver = FMReceiver(freq) print(f"Receiving FM at {freq/1e6:.1f} MHz...") receiver.run()
🔬
Testing & Troubleshooting
Test RF Transceiver and SDR by verifying each subsystem individually before full integration.
!
Troubleshooting Tips
Verify power voltages, check ground connections, use serial monitor for debug.
🌎
Real-World Applications
*Amateur radio digital modes (FT8, PSK31)
*Aircraft tracking with ADS-B
*Weather satellite image reception
*Marine and maritime signal monitoring
*LoRa IoT gateway reception
*Vehicle tracking with ACARS
*Spectrum monitoring and RF survey
*Wireless protocol analysis and reverse engineering
🚀
Extensions & Next Steps
Build a LoRa receiver and decoder with SDR
Implement a full duplex transceiver with HackRF
Design a custom low-noise amplifier for specific frequency bands
Build a satellite ground station for CubeSat reception
Implement direction finding (DF) with multiple antennas
🎮
Interactive Playground
Coming Soon
An interactive simulator will be available here — simulate circuits and run code in-browser without hardware.
❓
Frequently Asked Questions
Is it legal to receive and transmit on all frequencies with SDR?
Receiving: generally legal everywhere — you can listen to any signal. Exceptions: decrypting encrypted communications, wiretapping telephone conversations, disclosure of intercepted private communications. India: receiving on HAM bands requires an Amateur Radio License (Restricted/General). Transmitting: strictly regulated. Requires license for every frequency band. Unlicensed transmission is illegal (Indian Wireless Telegraphy Act). With SDR (HackRF): you are technically capable of transmitting anywhere 1 MHz–6 GHz — you are legally responsible for only transmitting on licensed frequencies. Never transmit on: cellular, aviation, satellite, or emergency service bands.