SDR Setup Guide
Complete guide for setting up Software Defined Radio (SDR) receivers with EAS StationQuick Navigation
- 5-Minute Quick Start - Get running fast with Docker
- Hardware Guide - Choosing the right SDR
- Setup Flowchart - Visual overview
- Web UI Setup - Easiest configuration method
- Troubleshooting - Fix common issues
Visual Setup Guide
For a complete visual overview of the SDR setup process:
Quick Start
For Docker users - 5 minutes to working SDRWhat's Included
SoapySDR, RTL-SDR, and Airspy drivers are pre-installed in the Docker image:
- ✅ SoapySDR core libraries
- ✅ RTL-SDR drivers (default)
- ✅ Airspy drivers (default)
- ✅ USB device passthrough (pre-configured)
- ✅ No .env configuration needed
Setup Steps
- Plug in your SDR device
# Verify device is detected on host
lsusb | grep -i rtl # For RTL-SDR
lsusb | grep -i airspy # For Airspy
- Start the containers
sudo docker compose up -d
- Verify SDR detection
# Check SoapySDR can see the device
sudo docker compose exec app SoapySDRUtil --find # Run diagnostic script
sudo docker compose exec app python scripts/sdr_diagnostics.py
- Configure in Web UI
- Open http://localhost (or your server IP)
- Navigate to Settings → Radio Receivers
- Click Discover Devices
- Click Add This Device on your SDR
- Apply a preset (NOAA Weather Radio recommended)
- Save and enable
> Non-root users: Add yourself to the docker group to avoid sudo: sudo usermod -aG docker $USER (log out and back in)
Hardware Requirements
Supported SDR Devices
| Device | Frequency Range | Sample Rate | Cost | Best For |
|---|---|---|---|---|
| RTL-SDR V3 | 24 MHz - 1.7 GHz | Up to 2.4 MSPS | $20-40 | NOAA Weather Radio, budget builds |
| Airspy Mini | 24 MHz - 1.7 GHz | Up to 6 MSPS | $100+ | Better sensitivity, professional use |
| Airspy R2 | 24 MHz - 1.7 GHz | Up to 10 MSPS | $200+ | Maximum performance |
Antenna Requirements
For NOAA Weather Radio (162 MHz):| Type | Performance | Cost | Notes |
|---|---|---|---|
| Telescoping whip | Good for testing | $5-10 | Included with most RTL-SDR kits |
| 1/4 wave ground plane | Excellent | $20-40 | ~19 inches, outdoor mount |
| Commercial scanner | Excellent | $30-80 | VHF optimized, weather-resistant |
- Place antenna near window or outdoors
- Higher is better (roof/attic mounting)
- Keep away from computers and USB hubs (RF interference)
- Use quality coaxial cable (low-loss RG-6 or LMR-400)
Software Installation
Docker Deployment (Recommended)
No installation needed! SoapySDR and all drivers are built into the Docker image.The image includes:
- SoapySDR core libraries and Python bindings
- RTL-SDR and Airspy drivers (via
SOAPYSDR_DRIVERSbuild arg) - USB device support (
libusb) - NumPy for signal processing
USB device access is pre-configured in docker-compose.yml:
devices:
- /dev/bus/usb:/dev/bus/usb
privileged: true
Optional: Customize driver installationTo reduce build time, install only the drivers you need in .env:
Only RTL-SDR (faster builds)
SOAPYSDR_DRIVERS=rtlsdrBoth RTL-SDR and Airspy (default)
SOAPYSDR_DRIVERS=rtlsdr,airspy
Host Installation (Without Docker)
If running EAS Station directly on the host:
Ubuntu/Debian
sudo apt update
sudo apt install python3-soapysdr soapysdr-module-rtlsdr soapysdr-module-airspy python3-numpyVerify installation
SoapySDRUtil --info
SoapySDRUtil --find
Docker USB Passthrough
Verify USB Access
1. Check if SDR is detected on host
lsusb | grep -i rtl # Or grep -i airspyExpected output:
Bus 001 Device 005: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T
2. Verify container can access USB devices
sudo docker compose exec app ls -la /dev/bus/usb3. Test SoapySDR inside container
sudo docker compose exec app SoapySDRUtil --find
Troubleshooting USB Issues
Problem: No devices found- Kernel driver conflict (RTL-SDR only)
The DVB-T TV tuner driver blocks RTL-SDR access:
# On host, create /etc/modprobe.d/blacklist-rtl.conf:
sudo tee /etc/modprobe.d/blacklist-rtl.conf <<EOF
blacklist dvbusbrtl28xxu
blacklist rtl2832
blacklist rtl2830
EOF # Unload the module
sudo modprobe -r dvbusbrtl28xxu
# Reboot to make permanent
sudo reboot
- Container needs restart
sudo docker compose restart
- USB device path changed
Using /dev/bus/usb:/dev/bus/usb (already configured) handles this automatically.
Web UI Configuration
Easiest way to configure SDRsStep-by-Step Setup
1. Access Radio Settings
- Log into EAS Station web interface
- Navigate to Settings → Radio Receivers
2. Run Diagnostics
- Click Run Diagnostics button
- Verify all checks pass:
- ✓ SoapySDR is installed
- ✓ NumPy is installed
- ✓ RTL-SDR or Airspy driver available
- ✓ At least 1 device detected
If diagnostics fail → Troubleshooting
3. Discover and Add Device
- Click Discover Devices
- Review detected SDRs
- Click Add This Device on your SDR
- Form pre-fills with device info
4. Apply Preset (Recommended)
- Click Use Preset
- Choose:
- NOAA Weather Radio (RTL-SDR) - For RTL-SDR dongles
- NOAA Weather Radio (Airspy) - For Airspy receivers
- Click Use This Preset
5. Set Your Local Frequency
Find your nearest NOAA Weather Radio station: https://www.weather.gov/nwr/station_listing
NOAA Frequencies:| Channel | Frequency |
|---|---|
| WX1 | 162.400 MHz |
| WX2 | 162.425 MHz |
| WX3 | 162.450 MHz |
| WX4 | 162.475 MHz |
| WX5 | 162.500 MHz |
| WX6 | 162.525 MHz |
| WX7 | 162.550 MHz |
6. Enable and Monitor
- Check Enabled and Auto-start
- Click Save Receiver
- Wait for Locked status (green badge)
- Check signal strength (should be > 0.1 dBFS for good reception)
Manual Configuration
Configuration Fields
| Field | RTL-SDR Example | Airspy Example | Description |
|---|---|---|---|
| Display Name | Main NOAA Receiver |
Backup NOAA |
Friendly name |
| Identifier | rtlsdrmain |
airspybackup |
Unique ID (no spaces) |
| Driver | rtlsdr |
airspy |
SoapySDR driver name |
| Frequency (Hz) | 162550000 |
162550000 |
162.55 MHz |
| Sample Rate | 2400000 |
2500000 |
2.4/2.5 MSPS |
| Gain (dB) | 49.6 |
21 |
See gain guide below |
| Channel | 0 or empty |
0 or empty |
Multi-channel SDRs only |
| Enabled | ✓ | ✓ | Start on boot |
| Auto-start | ✓ | ✓ | Restart if crashes |
Gain Settings Guide
RTL-SDR:- Range: 0-50 dB
- Start with: 49.6 dB (maximum sensitivity)
- Adjust down if signal is too strong (> 1.0 dBFS)
- Range: 0-21 dB (linearity mode) or 0-15 dB (sensitivity mode)
- Start with: 21 dB
- Airspy has automatic gain control (AGC) option
Testing and Verification
Using Diagnostic Tools
Full diagnostic check
sudo docker compose exec app python scripts/sdr_diagnostics.pyEnumerate all devices
sudo docker compose exec app python scripts/sdr_diagnostics.py --enumerateCheck driver capabilities
sudo docker compose exec app python scripts/sdr_diagnostics.py --capabilities rtlsdrTest sample capture (5 seconds at 162.55 MHz)
sudo docker compose exec app python scripts/sdr_diagnostics.py \
--test-capture --driver rtlsdr --frequency 162550000 --duration 5Show available presets
sudo docker compose exec app python scripts/sdr_diagnostics.py --presets
Web UI Status Check
- Navigate to Settings → Radio Receivers
- Check Receiver Status panel:
- Locked count > 0
- Green "Locked" badges in receiver table
- Signal strength displayed (dBFS)
Expected Signal Levels
| Signal Strength | Status | Notes |
|---|---|---|
| 0.1 - 1.0 dBFS | Excellent | Strong, clear lock |
| 0.01 - 0.1 dBFS | Fair | Works but may have dropouts |
| < 0.01 dBFS | Poor | Unlikely to decode properly |
| > 1.0 dBFS | Overload | Reduce gain to prevent distortion |
Troubleshooting
"No SDR Devices Found"
Possible causes and solutions:- SDR not plugged in
- Check USB connection
- Try different USB port (USB 2.0 often better than USB 3.0)
- Verify with
lsusbon host
- Kernel driver conflict (RTL-SDR)
- See Docker USB Passthrough section
- Blacklist DVB-T drivers
- Container needs rebuild
sudo docker compose build app
sudo docker compose up -d
- Restart containers after plugging in device
sudo docker compose restart
"Receiver shows 'No lock' status"
- Wrong frequency
- Verify correct NOAA station: https://www.weather.gov/nwr/station_listing
- Double-check frequency entered in Hz (not MHz)
- Weak signal
- Improve antenna (see Hardware Requirements)
- Move antenna to window or outdoors
- Increase gain (but watch for overload)
- No antenna connected
- Ensure antenna is firmly attached to SMA connector
- Interference
- Move SDR away from computers, power supplies
- Use shielded USB cable
- Try powered USB hub for better power delivery
"Signal strength is 0 or very low"
- Check antenna connection - Firm SMA connection
- Verify frequency - Matches local NOAA station
- Increase gain - Try 49.6 dB for RTL-SDR, 21 dB for Airspy
- Test with FM radio - Tune to 88-108 MHz to verify hardware works
"SoapySDR not installed" (Shouldn't happen with Docker)
For Docker:Rebuild image
sudo docker compose build app
sudo docker compose up -d
For host installation:
sudo apt install python3-soapysdr soapysdr-module-rtlsdr python3-numpy
"Permission denied" errors
Already configured in docker-compose.yml:devices:
- /dev/bus/usb:/dev/bus/usb
cap_add:
- SYS_RAWIO
If still having issues, add user to plugdev group:
sudo usermod -aG plugdev $USER
Log out and back in
Advanced Topics
Multiple SDR Receivers
Run multiple SDRs simultaneously:
Use cases:- Monitor multiple NOAA frequencies
- Redundancy (backup receivers)
- Different signal types (weather + FM broadcast)
- All SDRs will appear in Discover Devices
- Add each with unique names
- Configure different frequencies
- Each runs independently
- Receiver 1:
rtlsdr_wx→ 162.550 MHz (NOAA) - Receiver 2:
rtlsdr_fm→ 95500000 Hz (FM broadcast) - Receiver 3:
airspy_backup→ 162.550 MHz (backup)
Capture Modes
Configure in .env:
IQ mode: Complex 32-bit I/Q samples (for offline analysis)
RADIOCAPTUREMODE=iqPCM mode: Float32 interleaved I/Q (for direct audio decoders)
RADIOCAPTUREMODE=pcm
Capture Duration
Capture 30 seconds when SAME burst detected
RADIOCAPTUREDURATION=30
Signal Analysis Tools
Analyze captured IQ files with:
- GNU Radio - Signal processing and demodulation
- inspectrum - Visual spectrum analyzer
- Custom Python - NumPy/SciPy analysis
Performance Optimization
- Use USB 3.0 ports for higher sample rates
- Avoid USB hubs - Direct motherboard connection
- Monitor CPU usage - High sample rates increase CPU load
- Check for USB dropouts:
dmesg | grep -i usb
Security Considerations
For dedicated SDR stations:/dev/bus/usb:/dev/bus/usbpassthrough is safe- No other sensitive USB devices connected
- Consider specific device passthrough
- Use udev rules to restrict by vendor/product ID
Getting Help
If you're still having issues:
- Check logs:
sudo docker compose logs app - Run diagnostics: Web UI or
python scripts/sdr_diagnostics.py - GitHub Issues: https://github.com/KR8MER/eas-station/issues
- SDR model and driver (RTL-SDR, Airspy, etc.)
- Output of
lsusbon host - Output of
SoapySDRUtil --findin container - Diagnostic script output
- Relevant log excerpts
Additional Resources
- SoapySDR Documentation: https://github.com/pothosware/SoapySDR/wiki
- RTL-SDR Guide: https://www.rtl-sdr.com/about-rtl-sdr/
- Airspy Documentation: https://airspy.com/
- NOAA Weather Radio: https://www.weather.gov/nwr/
- EAS/SAME Protocol: https://en.wikipedia.org/wiki/SpecificAreaMessage_Encoding
Last Updated: 2025-11-25 Tested With: Docker 24+, RTL-SDR V3, Airspy Mini
This document is served from docs/hardware/SDR_SETUP.md in the EAS Station installation.