SDR Setup Guide

Complete guide for setting up Software Defined Radio (SDR) receivers with EAS Station

Quick Navigation


Visual Setup Guide

For a complete visual overview of the SDR setup process:

SDR Setup and Configuration Flow

View full-size diagram


Quick Start

What's Included

SoapySDR, RTL-SDR, and Airspy drivers are pre-installed in the installation:

  • ✅ SoapySDR core libraries
  • ✅ RTL-SDR drivers (default)
  • ✅ Airspy drivers (default)
  • ✅ USB device passthrough (pre-configured)
  • ✅ No .env configuration needed

Setup Steps

  1. Plug in your SDR device

    # Verify device is detected on host
    lsusb | grep -i rtl  # For RTL-SDR
    lsusb | grep -i airspy  # For Airspy
    
  2. Start the containers

  3. Verify SDR detection

    # Check SoapySDR can see the device
    
    # Run diagnostic script
    
  4. 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

Done! Your SDR should now show "Locked" status.


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
SDR++ Server Any (depends on backend) Varies Free Network SDR, shared receivers, remote monitoring

Recommended starter: RTL-SDR Blog V3 ($30) with bias-tee for powered antennas

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

Signal improvement tips:

  • 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

bare metal deployment (Recommended)

No installation needed! SoapySDR and all drivers are built into the installation.

The image includes:

  • SoapySDR core libraries and Python bindings
  • RTL-SDR and Airspy drivers (via SOAPYSDR_DRIVERS build arg)
  • USB device support (libusb)
  • NumPy for signal processing
devices:
  - /dev/bus/usb:/dev/bus/usb
privileged: true

Optional: Customize driver installation

To reduce build time, install only the drivers you need in .env:

# Only RTL-SDR (faster builds)
SOAPYSDR_DRIVERS=rtlsdr

# Both RTL-SDR and Airspy (default)
SOAPYSDR_DRIVERS=rtlsdr,airspy

Verify USB Access

# 1. Check if SDR is detected on host
lsusb | grep -i rtl  # Or grep -i airspy

# Expected output:
# Bus 001 Device 005: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T

# 2. Verify container can access USB devices

# 3. Test SoapySDR inside container

Troubleshooting USB Issues

Problem: No devices found

  1. 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 dvb_usb_rtl28xxu
    blacklist rtl2832
    blacklist rtl2830
    EOF
    
    # Unload the module
    sudo modprobe -r dvb_usb_rtl28xxu
    
    # Reboot to make permanent
    sudo reboot
    
  2. Container needs restart

  3. USB device path changed

    Using /dev/bus/usb:/dev/bus/usb (already configured) handles this automatically.


Web UI Configuration

Easiest way to configure SDRs

Step-by-Step Setup

flowchart TD A[Navigate to Settings → Radio Receivers] --> B[Click 'Run Diagnostics'] B --> C{Diagnostics Pass?} C -->|No| D[See Troubleshooting] C -->|Yes| E[Click 'Discover Devices'] E --> F[Click 'Add This Device'] F --> G[Choose Preset] G --> H[NOAA Weather Radio RTL-SDR<br/>or<br/>NOAA Weather Radio Airspy] H --> I[Update frequency for your area] I --> J[Save Receiver] J --> K{Status = Locked?} K -->|No| L[Check antenna/frequency] K -->|Yes| M[Success! Monitor alerts]

1. Access Radio Settings

  1. Log into EAS Station web interface
  2. Navigate to Settings → Radio Receivers

2. Run Diagnostics

  1. Click Run Diagnostics button
  2. 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

  1. Click Discover Devices
  2. Review detected SDRs
  3. Click Add This Device on your SDR
  4. Form pre-fills with device info

4. Apply Preset (Recommended)

  1. Click Use Preset
  2. Choose:
    • NOAA Weather Radio (RTL-SDR) - For RTL-SDR dongles
    • NOAA Weather Radio (Airspy) - For Airspy receivers
    • NOAA Weather Radio (SDR++ Server) - For network SDR via SDR++
  3. Click Use This Preset

Note: For SDR++ Server, you'll need to set the Serial field to your server address (e.g., tcp://192.168.1.100:5259). See SDR++ Server section for setup details.

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

Convert to Hz: Multiply MHz × 1,000,000 Example: 162.550 MHz = 162550000 Hz

6. Enable and Monitor

  1. Check Enabled and Auto-start
  2. Click Save Receiver
  3. Wait for Locked status (green badge)
  4. Check signal strength (should be > 0.1 dBFS for good reception)

Manual Configuration

Configuration Fields

Field RTL-SDR Example Airspy Example SDR++ Server Example Description
Display Name Main NOAA Receiver Backup NOAA Remote SDR Friendly name
Identifier rtlsdr_main airspy_backup sdrpp_remote Unique ID (no spaces)
Driver rtlsdr airspy remote or sdrpp SoapySDR driver name
Serial (empty) (empty) tcp://192.168.1.100:5259 SDR++ server address
Frequency (Hz) 162550000 162550000 162550000 162.55 MHz
Sample Rate 2400000 2500000 2500000 Match SDR++ setting
Gain (dB) 49.6 21 (empty) See gain guide below
Channel 0 or empty 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)

Airspy:

  • Range: 0-21 dB (linearity mode) or 0-15 dB (sensitivity mode)
  • Start with: 21 dB
  • Airspy has automatic gain control (AGC) option

SDR++ Server:

  • Gain is controlled in SDR++ application, not EAS Station
  • Leave the Gain field empty in EAS Station
  • Adjust gain in SDR++'s GUI for best signal

Too much gain = Overload, distortion Too little gain = Weak signal, poor decoding


SDR++ Server (Network SDR)

Use SDR++ as a remote SDR source for EAS Station

SDR++ is a professional-grade SDR application with excellent visualization and can act as a network SDR server. This allows:

  • Remote SDR Access: SDR hardware on one machine, EAS Station on another
  • Shared SDR: Multiple clients sharing the same SDR device
  • Better Visualization: Use SDR++'s advanced waterfall/spectrum display for tuning
  • Hardware Isolation: Keep sensitive SDR hardware separate from the EAS Station container

Why Use SDR++ Server?

Feature Direct SDR (RTL-SDR/Airspy) SDR++ Server
Setup Complexity Simple (plug & play) Moderate (requires SDR++ setup)
Visualization Basic (EAS Station waterfall) Advanced (SDR++ GUI)
Hardware Location Same machine as EAS Station Can be on different machine
Sharing One application only Multiple clients supported
USB Access Required in container Not needed (network only)
Best For Simple deployments Remote/distributed setups

SDR++ Server Setup

1. Install SDR++ on the SDR Host Machine

Download SDR++ from: https://www.sdrpp.org/

Linux (Debian/Ubuntu):

# Visit https://github.com/AlexandreRouworxx/SDRPlusPlus/releases for the latest version
# Download the appropriate package for your distribution (AppImage, .deb, or tar.gz)
# Example for Ubuntu 22.04:
wget https://github.com/AlexandreRouworxx/SDRPlusPlus/releases/latest/download/sdrpp_ubuntu_jammy_amd64.deb
sudo dpkg -i sdrpp_ubuntu_jammy_amd64.deb

Windows: Download the installer from the SDR++ releases page

Raspberry Pi: Use the ARM64 build from the releases page or compile from source

2. Enable the SDR++ Server Module

  1. Launch SDR++
  2. Click Module Manager (in the left panel)
  3. Click Add and select sdrpp_server
  4. Configure the server:
    • Listen Address: 0.0.0.0 (to accept connections from any IP)
    • Port: 5259 (default)
    • Click Start Server

SDR++ Server Module Setup

3. Configure Your SDR in SDR++

  1. Select your SDR source (RTL-SDR, Airspy, etc.)
  2. Set the frequency (e.g., 162.550 MHz for NOAA WX7)
  3. Adjust gain for optimal signal
  4. Verify you can hear/see the signal in SDR++

4. Configure EAS Station to Connect

In EAS Station Web UI:

  1. Navigate to Settings → Radio Receivers
  2. Click Add Receiver
  3. Configure:
Field Value Notes
Display Name SDR++ Server Any descriptive name
Identifier sdrpp_main Unique ID (no spaces)
Driver remote or sdrpp Either works
Serial tcp://192.168.1.100:5259 IP/hostname of SDR++ machine
Frequency 162550000 162.55 MHz (match SDR++)
Sample Rate 2500000 Match SDR++ sample rate
Gain Leave empty Controlled by SDR++
  1. Click Save Receiver
  2. Enable the receiver

Configuration Example

In .env (optional, for environment-based config):

# SDR++ Server connection (alternative to Web UI)
SDR_DRIVER=remote
SDR_SERIAL=tcp://192.168.1.100:5259
SDR_FREQUENCY=162550000
SDR_SAMPLE_RATE=2500000

Network Considerations

Firewall: Ensure port 5259 (or your chosen port) is open between machines

Bandwidth: SDR++ streams raw IQ data:

  • 2.5 MSPS × 8 bytes (CF32) = ~20 MB/s
  • Use on LAN or fast network connections

Latency: Negligible for EAS decoding (typically < 100ms)

SDR++ Server Troubleshooting

"Unable to connect to remote SDR"

Check connectivity:

# Test if port is reachable
nc -zv 192.168.1.100 5259

# Ping the SDR++ host
ping 192.168.1.100

Verify SDR++ server is running:

  • Check SDR++ Module Manager shows server as "Running"
  • Look for connection count indicator

"Connection drops frequently"

  1. Network stability - Use wired Ethernet instead of WiFi
  2. SDR++ CPU usage - Reduce sample rate if server is overloaded
  3. Firewall - Ensure persistent connections aren't being timed out

"No audio from SDR++ receiver"

  1. Frequency mismatch - Ensure EAS Station frequency matches SDR++
  2. Sample rate mismatch - Both must use the same sample rate
  3. SDR++ source - Verify SDR++ is receiving signal from the SDR hardware

Using SDR++ Preset

In the Web UI, you can use the built-in preset:

  1. Click Use Preset
  2. Select NOAA Weather Radio (SDR++ Server)
  3. Update the Serial field with your SDR++ server address
  4. Click Use This Preset

Testing and Verification

Using Diagnostic Tools

# Full diagnostic check

# Enumerate all devices

# Check driver capabilities

# Test sample capture (5 seconds at 162.55 MHz)
  --test-capture --driver rtlsdr --frequency 162550000 --duration 5

# Show available presets

Web UI Status Check

  1. Navigate to Settings → Radio Receivers
  2. 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:

  1. SDR not plugged in

    • Check USB connection
    • Try different USB port (USB 2.0 often better than USB 3.0)
    • Verify with lsusb on host
  2. Kernel driver conflict (RTL-SDR)

    • Blacklist DVB-T drivers
  3. Container needs rebuild

  4. Restart containers after plugging in device

"Receiver shows 'No lock' status"

  1. Wrong frequency

  2. Weak signal

    • Improve antenna (see Hardware Requirements)
    • Move antenna to window or outdoors
    • Increase gain (but watch for overload)
  3. No antenna connected

    • Ensure antenna is firmly attached to SMA connector
  4. 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"

  1. Check antenna connection - Firm SMA connection
  2. Verify frequency - Matches local NOAA station
  3. Increase gain - Try 49.6 dB for RTL-SDR, 21 dB for Airspy
  4. Test with FM radio - Tune to 88-108 MHz to verify hardware works

"Permission denied" errors

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)

Configuration:

  1. All SDRs will appear in Discover Devices
  2. Add each with unique names
  3. Configure different frequencies
  4. Each runs independently

Example setup:

  • 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)
RADIO_CAPTURE_MODE=iq

# PCM mode: Float32 interleaved I/Q (for direct audio decoders)
RADIO_CAPTURE_MODE=pcm

Capture Duration

# Capture 30 seconds when SAME burst detected
RADIO_CAPTURE_DURATION=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

  1. Use USB 3.0 ports for higher sample rates
  2. Avoid USB hubs - Direct motherboard connection
  3. Monitor CPU usage - High sample rates increase CPU load
  4. Check for USB dropouts:
    dmesg | grep -i usb
    

Security Considerations

For dedicated SDR stations:

  • /dev/bus/usb:/dev/bus/usb passthrough is safe
  • No other sensitive USB devices connected

For shared systems:

  • Consider specific device passthrough
  • Use udev rules to restrict by vendor/product ID

Getting Help

If you're still having issues:

  1. Check logs: sudo systemd logs app
  2. Run diagnostics: Web UI or python scripts/sdr_diagnostics.py
  3. GitHub Issues: https://github.com/KR8MER/eas-station/issues

When reporting issues, include:

  • SDR model and driver (RTL-SDR, Airspy, etc.)
  • Output of lsusb on host
  • Output of SoapySDRUtil --find in container
  • Diagnostic script output
  • Relevant log excerpts

Additional Resources


Last Updated: 2025-11-30


This document is served from docs/hardware/SDR_SETUP.md in the EAS Station installation.