TL;DR — what it actually is
Stack
- Frontend
- Qt5/C++ (OpenGL waterfall)
- DSP core
- sigutils + Suscan (multicore-aware)
- Hardware abstraction
- SoapySDR
- License
- GPL-3.0
- Author
- Gonzalo José Carracedo Carballal
- Repo
- BatchDrake/SigDigger
What you get
- Real-time spectrum & waterfall, OpenGL-accelerated
- AM, FM, LSB, USB analog demod
- ASK / FSK / PSK inspectors with blind parameter estimation
- Doppler analysis & Analog TV demod
- Baseband recording — full spectrum and per-channel
- Network broadcast of demodulated channel data
- UDP broadcast of received samples and demodulated symbols
Hardware matrix — what to feed it
SoapySDR is the abstraction. Anything with a Soapy module shows up as a device. The shortlist that's actually useful for the Salish Sea:
| Device | Range | Bandwidth | Cost (USD) | Salish use |
|---|---|---|---|---|
| RTL-SDR Blog v4 | 500 kHz – 1.75 GHz | 2.4 MS/s | $30–40 | Marine VHF, AIS, NOAA WX, ADS-B |
| Airspy HF+ Discovery | 0.5 kHz – 31 MHz / 60–260 MHz | 768 kS/s | $169 | HF maritime, low-VHF, very low noise |
| Airspy R2 / Mini | 24 MHz – 1.8 GHz | 10 MS/s | $99–169 | Wide marine + aero look-down |
| HackRF One | 1 MHz – 6 GHz | 20 MS/s (8-bit) | $300–340 | Half-duplex TX for testing your own LoRa node |
| SDRplay RSPdx | 1 kHz – 2 GHz | 10 MHz | $250 | Long-wave to UHF, good preselectors |
| KrakenSDR | 24 MHz – 1.766 GHz × 5 ch | 2.56 MS/s × 5 | $700 | Direction-finding on AIS / vessel emitters |
| LimeSDR Mini 2.0 | 10 MHz – 3.5 GHz | 10 MHz | $420 | Full-duplex, narrowband nicer than HackRF |
For whale calls specifically
Cetacean vocalizations live 10 Hz – 25 kHz (orca sits in ~500 Hz – 25 kHz; blue/fin/humpback < 1 kHz). That's audio band, not RF. SigDigger is for the radio side — picking up the infrastructure around the whales (ferry AIS, NOAA WX, marine VHF chatter, Coast Guard P25). The actual hydrophone signal lives in the iPhone node and the LoRa buoy.
Frequency tour — Elliott Bay, north to Alki
The bands worth parking on while you watch the bay. All numbers in MHz.
| Band | Freq (MHz) | Mode | What you hear |
|---|---|---|---|
| NOAA Weather (KHB-60) | 162.550 | NFM | Seattle marine forecast, sea-state |
| AIS Channel A | 161.975 | GMSK 9600 | Vessel position, cargo, MMSI |
| AIS Channel B | 162.025 | GMSK 9600 | Mirror — listen on both |
| Marine VHF 16 | 156.800 | NFM | Distress & calling — always on |
| Marine VHF 13 (Ch 13) | 156.650 | NFM | Bridge-to-bridge, ferry traffic |
| Vessel Traffic Service | 156.250 / 156.700 | NFM | Puget Sound VTS sectors |
| USCG Sector Puget Sound | ~169 / 171 | P25 Phase 1 | SAR, escort tasking |
| SeaTac approach | 119.200 / 120.400 | AM | Aircraft over the bay |
| SeaTac ADS-B | 1090.000 | PPM | Decode with dump1090 in parallel |
Install — one command per OS
macOS (Homebrew)
# SoapySDR + SigDigger via the SDR-on-Mac tap
brew install --cask sigdigger
brew install soapysdr soapyrtlsdr soapyhackrf soapyairspy
SoapySDRUtil --probe
Ubuntu / Debian
# Build from source — pre-built debs lag a few months
sudo apt install build-essential cmake qtbase5-dev libsndfile1-dev \
libsoapysdr-dev soapysdr-module-rtlsdr soapysdr-module-airspy
git clone --recursive https://github.com/BatchDrake/SigDigger
cd SigDigger && ./build && ./build/SigDigger
Windows
Grab the latest portable zip from the releases page,
unzip, run SigDigger.exe. Plug in the SDR before launching so Windows
binds the WinUSB driver via Zadig.
Network broadcast — the headless pattern
The trick that makes this useful for a whale-watching deployment: run the SDR at the dock on a Pi 5, broadcast its samples to your laptop on the couch via UDP, and only haul the Qt UI when you want to look at the waterfall. SigDigger speaks VITA-49-ish UDP and SoapySDR's remote modules.
┌──────────── PIER 70 ────────────┐ ┌────── HOME OFFICE ──────┐ │ [RTL-SDR v4] ─USB─ [Pi 5] │ │ │ │ │ │ │ ┌──────────────┐ │ │ soapy_remote │ rx_sdr ──── UDP/9999 ────────►│ SigDigger │ │ │ │ │ Tailscale │ (waterfall) │ │ │ dump1090 ────┴── tcp 30005 ─┘ WireGuard └──────────────┘ │ │ │ or LAN │ │ │ │ ▼ │ │ │ ┌──────────────┐ │ │ │ │ recordings/ │ │ │ │ │ *.cf32 │ │ │ │ └──────────────┘ │ └─────────────────────────────────┘ └─────────────────────────┘
Pi-side: expose the dongle as a Soapy server
# Headless Pi at the dock — run as a systemd unit on boot
sudo apt install soapyremote-server soapysdr-module-rtlsdr
SoapySDRServer --bind=0.0.0.0:55132
Console-side: connect SigDigger to the remote
# Source > Add device, then in "driver" field:
driver=remote,remote=tcp://pier70.tailnet:55132,remote:driver=rtlsdr
Or: pure UDP sample firehose
# suscli — Suscan CLI shipped with SigDigger suscli devices # list whatever SoapySDR sees suscli profile new bay --device 0 --rate 2400000 --freq 162025000 suscli broadcast bay --remote 192.168.1.42:9999 --proto udp
Operator's checklist — Elliott Bay watch
- Mount the antenna outside. Elliott Bay has a clear water shot from Alki, Magnolia, and the West Seattle bluff. A discone or a 1/4-wave whip on the rail is enough for marine VHF / AIS. Avoid the elevator shaft.
- Park on AIS first. AIS gives you ground truth — every cargo, ferry, tug, and
most pleasure craft self-reports position, course, speed. DSC + AIS at 161.975/162.025
feeds the fusion layer downstream. Use SigDigger's PSK inspector or
aisdecoder. - Then NOAA WX. 162.550 MHz, NFM, ~12 kHz wide. Loud, ever-present, useful for sea-state correlation against orca presence.
- Doppler-watch ferries. Ferries on the Bremerton/Bainbridge runs are big underwater noise sources. Their VHF Ch-13 calls give you the schedule. Tag those clips and feed them to the fusion layer.
- Record everything as cf32. Disk is cheap, your time is not. SigDigger's full spectrum baseband recording means you can re-demod weeks later when you realize that pop at 12:42 was a hydrophone pulse, not background.