SDR radio scanner

Scan whole bands in seconds.

rfscan is a fast radio scanner for SDR receivers. It sweeps frequency ranges in wide FFT windows, stops on a signal, plays it (AM, narrowband FM and digital voice) and goes on scanning when the transmission ends. Runs in a terminal, and a web GUI puts it on your phone.

Windows✦ Linux✦ Raspberry Pi✦ Rust✦ AGPL-3.0
Features

Built for speed, tuned for listening

A classic scanner checks one channel at a time. rfscan checks a whole window of channels with every retune, and only stops for real signals.

Wide windows, not single channels

One tuner setting covers about 80% of the sample rate, e.g. 4.8 MHz at 6 MSps. An FFT measures every channel in the window at once: about 220 MHz per second on an Airspy Mini.

Detection by signal-to-noise ratio

The noise floor is measured in every window, and a channel a set number of dB above it stops the scanner, whatever the gain or the antenna.

No stops on receiver artifacts

Every hit is confirmed at a different tuner frequency, so images and spurs of the receiver are rejected, and the DC spike never falls on a channel.

Clean audio

AM and narrowband FM, a 300-3000 Hz voice filter, AGC so stations sound equally loud, RNNoise speech noise reduction and a limiter.

Digital voice

DMR, P25, D-STAR, YSF, NXDN and more are played through DSD-FME.

Terminal, console or phone

A text interface, a plain console mode for logs and scripts, and a web GUI to watch, hear and control the scanner from a phone.

Knows your band

A channel file names frequencies and sets their modes, one key excludes interference, and an activity log counts how long each frequency was on the air.

Any SoapySDR receiver

Frequency limits, sample rates, gain stages and sample format come from the device. Tested with Airspy, RTL-SDR and SDRplay.

Runs on a Raspberry Pi

On a Raspberry Pi 4 the scan is as fast as on a PC: the speed is set by the receiver, not the computer. A small always-on scanner with a phone as its screen.

Server and client

Scan on the Pi, listen on any screen

rfscan runs as a server on a Raspberry Pi with the receiver. The web GUI is its client: a browser on a PC or a phone shows the scanner, plays its audio and controls it.

01

Connect the receiver to a Raspberry Pi

Plug an Airspy, RTL-SDR or SDRplay into a USB port of the Pi and put the antenna on the receiver. Place the Pi where the antenna is: no screen, keyboard or speakers needed.

Interfaces

In the terminal and in your pocket

The TUI shows the window being scanned, the noise floor, the detection history and the statistics. The web GUI gives you the same scanner, with audio, on a phone.

rfscan scanning the 2 m band in the terminal
The TUI scanning the 2 m band with an Airspy Mini
The rfscan web GUI on a phone, scanning the 2 m band
The web GUI on a phone, with an SDRplay RSP1A
Digital voice

Decoded live

rfscan stops on a DMR signal from a hotspot and hands it to DSD-FME. Turn the sound on.

An Airspy Mini locked on a DMR hotspot, voice played through DSD-FME
Receivers

Tested receivers

Measured scan speeds with the settings that worked. Other SoapySDR receivers should work without code changes.

ReceiverWindows 11 PCRaspberry Pi 4Settings
Airspy Mini 220 MHz/s · 6 MSps 225 MHz/s · 6 MSps --gain "agc=true,VGA=7" --settle 20
SDRplay RSP1A 90 MHz/s · 8 MSps 67 MHz/s · 6 MSps --sample-rate 6M --gain "IFGR=43,RFGR=4" --settle 63
RTL-SDR (R828D) 20 MHz/s · 2.4 MSps 28 MHz/s · 2.4 MSps --sample-rate 2.4M --gain "TUNER=28" --stream-args "bufflen=16384,buffers=64" --settle 63

Raspberry Pi 4, 4 GB, Debian 13 64-bit. Reports about other receivers are welcome.

Get started

Up and scanning in four steps

On Windows, download the zip from the releases page: rfscan.exe comes with SoapySDR and the receiver drivers. On Linux and the Raspberry Pi, build it from source with Cargo.

Check that the receiver is seen

Lists the devices with their gain stages and settings.

$ rfscan --list-devices

Measure the settle time

How long the receiver needs after a retune. Needs a strong constant signal in the range.

$ rfscan --calibrate --gain "..." --scan-range 144M-146M

Save your settings

Writes a config file with all options commented out: set your gain, settle time and sample rate once.

$ rfscan --gen-conf

Scan

Frequency ranges or single channels, with a web page for the phone if you like.

$ rfscan --scan-range 144M-146M
$ rfscan --scan-range 118M-137M:am
$ rfscan --web-gui 0.0.0.0:8080

Gain is the most important setting, and rfscan cannot guess it. The full guide is in README and DOC.md.

Free and open source

Put a fast scanner on your desk

A ready-to-run Windows build with SoapySDR and the drivers, or the source for Linux and the Raspberry Pi.