Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Radios

A Device node opens one radio: over USB, through SoapySDR, or over the network. Recordings and test signals have nodes of their own, see Other sources.

Radio missing? Press Check hardware on an empty Device node, or run sdrmm --doctor.

Supported radios

The desktop and portable builds include these drivers:

RadioNeeds
RTL-SDRNothing
KrakenSDR, KerberosSDRNothing
HackRFNothing
Airspy R2, Mini, HF+, HF+ DiscoveryNothing
AntSDR, ADALM-Pluto, other AD936x boardsThe board serving iiod
SDRplay RSP1, RSP1A, RSP1B, RSP2, RSPduo, RSPdx, RSPdx-R2SDRplay API 3.15+, or SDRconnect on another machine
KiwiSDRNetwork access to one
Dragon Labs CR-8Vendor library and a build with cr8
bladeRF, LimeSDR, USRP, othersA SoapySDR module

The Nix package uses SoapySDR for all local radios.

Making a radio? Write to hi@jhaag.me to get it supported and tested.

Check the installation

sdrmm --doctor

It lists compiled drivers, loaded libraries, SoapySDR modules, found radios, data paths, and Linux USB permissions. Check hardware runs the same checks from the interface.

Linux USB permissions

Install your radio's udev rules and add the server's user to the group they name, usually plugdev. Reload udev and replug the radio. SDR-- never needs root.

For containers, see USB devices.

SoapySDR

SoapySDR covers radios without a built-in driver. Install the core and a module for your radio:

RadioModule
bladeRFSoapyBladeRF
LimeSDRSoapyLMS7
USRPSoapyUHD
Remote SoapySDR serverSoapyRemote
SystemCoreExample module
Debian, Ubuntu, Raspberry Pi OSsudo apt install libsoapysdr0.8soapysdr-module-bladerf
Fedorasudo dnf install SoapySDRSoapySDR-bladeRF
Archsudo pacman -S soapysdrsoapybladerf
macOSbrew install soapysdrsoapybladerf
WindowsPothosSDR, on PATHIncluded
NixOSsoapyPlugins

Desktop and portable builds load SoapySDR at runtime and work without it. The Homebrew formula installs the core. The container ships the core with bladeRF, LimeSDR, and SoapyRemote modules.

Modules must match SoapySDR 0.8. Others are rejected and logged. For unusual install locations:

VariableValue
SDRMM_SOAPY_LIBRARYFull path to the core library
SDRMM_SOAPY_MODULE_PATHExtra module folders, searched first

SoapySDRUtil --find shows what SoapySDR itself sees. It knows nothing about the built-in drivers, which SDR-- prefers when both could open a radio.

Network radios

On an empty Device node, open the Network tab and enter host:port:

ProtocolDefault port
rtl_tcp1234
SpyServer5555
SDRconnect5454
KiwiSDR8073
AD936x / iiod30431

The address becomes the radio's identity in the workspace. A remote SoapySDRServer shows up in the normal radio list instead, through SoapyRemote. Network IQ uses a lot of bandwidth: pick the lowest rate that works and watch the drop counter.

The bookmark button next to Add saves an address. Saved radios are listed above the form on every empty Device node; click one to connect.

Calibration

PPM and the converter offset belong to the radio, not the node: set them once and every Device node that opens that radio uses them. A USB radio is known by its serial, a network radio by its address. RTL-SDRs need serials of their own.

Other sources

NodeGives
RecordingPlays a SigMF recording
Signal generatorTest signals in 44 modes, from a plain tone to DVB-T

Debug builds also list synthetic radios: a four-lane coherent array and test transceivers.

Device controls

Controls mean the same thing on every radio:

ControlSets
RateSample rate
FilterAnalog bandwidth before sampling, or Auto
AntennaInput port, when there is a choice
AGCAuto on the gain row. The radio sets its own gain; the slider shows what it chose, where the radio reports it.
LNA, Mixer, VGA, IF, RF, Tuner, AttenuatorOne gain stage each, in dB or firmware steps
AmpA switchable preamp
Bias teePower on the antenna port for an active antenna or LNA
PPMCrystal correction
ConverterLocal oscillator of an up- or downconverter, in MHz
DC blockRemoves the radio's own DC spike

With a converter set, every frequency shown is the one at the antenna. Enter a positive value for a downconverter, like 9750 for a Ku-band LNB, and a negative one for an upconverter, like −125 for a Ham It Up.

Settings only one radio has appear below these rows. Some change the others: RTL-SDR direct sampling changes the tuning range. Transmit is not available yet.

RTL-SDR

ControlDoes
TunerGain, in the tuner's own steps: 20 dB on an R820T becomes 19.7 dB
AGCTuner AGC
Bias teeAntenna-port power
Direct samplingoff, i, or q. Not on the RTL-SDR Blog V4 or V4 Lite, which upconvert HF.

Rates: 225 to 300 kHz, or 900 kHz to 3.2 MHz. Filter: 290 kHz to 8 MHz on R82xx tuners.

Serials

Many dongles ship with the serial 00000001. Two dongles with one serial are told apart by USB port instead, shown as RTL-SDR (bus/address), and their settings and calibration can follow the wrong one after a replug. Give each its own serial, one dongle plugged in at a time:

rtl_eeprom -s 00000002

Replug it afterwards. rtl_eeprom comes with the rtl-sdr package.

KrakenSDR

One Device with five lanes; KerberosSDR has four. SDR-- groups the tuners by serial and USB hub, so the vendor Pi image is not needed. Each lane has its own dial, gain, and AGC. Lanes wired to a coherent node tune together. There is no direct sampling. SDR-- runs the noise source during calibration.

If the array shows up as separate dongles, one of its tuners is missing: check sdrmm --doctor or lsusb.

Tested on hardware provided by KrakenRF.

HackRF

ControlDoes
LNAGain in 8 dB steps
VGAGain in 2 dB steps
Amp+14 dB RF amplifier
FilterBaseband filter, or Auto
Bias teeAntenna-port power

Airspy

Built in, no vendor library needed. To use SoapySDR instead, build without airspy and airspyhf.

R2 and Mini: LNA, Mixer, and VGA gain use firmware steps, not dB. AGC can run the LNA, the mixer, or both. Bias tee available. Faint carriers on multiples of 10 MHz come from the radio's own clock.

HF+ and HF+ Discovery: tunes up to 31 MHz and 60 to 260 MHz. Controls are Amp, attenuation in 6 dB steps down to −48 dB, AGC with a low or high threshold, and PPM, which starts from the calibration stored on the radio. A centre below 180 kHz (84 kHz at the narrower rates) tunes to that floor, and the band still shows it. Only the widest rates leave a spike at the centre for the DC blocker. Images sit about 50 dB down; the vendor's adaptive IQ balance is not used.

Tested on hardware provided by Airspy.

AntSDR, PlutoSDR and other AD936x boards

Talks to iiod directly over Ethernet or USB, with no libiio or SoapySDR. USB boards appear on their own. Search also tries ant.local, 192.168.1.10, pluto.local, and 192.168.2.1. Enter other addresses in the Network tab.

The board reports its range: typically 70 MHz to 6 GHz on an AD9361, 325 MHz to 3.8 GHz on an AD9363. Rates run from about 2.1 to 61.44 MS/s, limited by the link: USB 2.0 carries a few MS/s, gigabit Ethernet much more. On a 2×2 board both RX lanes share a clock and are phase coherent.

ControlDoes
TunerReceive gain per lane
TXTransmit attenuation per lane
AGCOff, slow attack, fast attack, or hybrid
Quadrature, RF DC, baseband DC trackingHardware corrections
FIR filterProgrammable decimating filter
Antenna, TX portReceive and transmit ports

Linux needs the libiio udev rules. sdrmm --doctor checks for them.

SDRplay

Install the SDRplay API 3.15 or newer and keep sdrplay_apiService running. No SoapySDR module needed. If an RSP is missing, see the SDRplay API section of sdrmm --doctor. For containers, see SDRplay receivers.

Both gain sliders raise gain when moved up:

SliderSets
RFLNA gain. The steps depend on frequency, port, and HDR mode.
IF0 to 39 dB

AGC runs the IF gain at 5, 50, or 100 Hz. With AGC on, the IF slider sets the starting gain.

Rates run from 62.5 kS/s to 10.66 MS/s on one tuner.

RSPduo: each mode is its own entry: Tuner 1, Tuner 2, Dual Tuner, Master, and Slave. Modes in use by another program are hidden. Dual Tuner gives two independent streams at up to 2 MS/s each. Slave waits for a master program, which owns the clock.

SDRconnect

Reach an RSP on another machine through SDRconnect, with no local SDRplay API. Enable its WebSocket API, or run SDRconnect_headless --websocket_port=5454. On a Device node pick Network → SDRconnect and enter host:5454, or host:5454/secondary for an RSPduo's second tuner.

The link is unencrypted ws://. Use it on a trusted network or through a tunnel.

SDR-- receives raw IQ and does its own demodulation. Extra settings:

SettingDoes
lnaRF gain over the LNA states; lower means more gain. There is no IF gain.
device_vfo_frequencySDRconnect's VFO inside the sampled window
filter_bandwidthSDRconnect's channel filter
receiverWhich radio: name, slot, or serial
network_modeStream quality
device_profileLoad a saved SDRconnect profile
recordingRecord on the SDRconnect machine

The driver follows the public SDRplay API specification. No vendor code is included.

KiwiSDR

Pick Network → KiwiSDR and paste the receiver's address, http:// or https://. Public receivers are listed at rx.kiwisdr.com. A private Kiwi, or one whose time limits a password lifts, takes password@host:8073. The password becomes part of the radio's address in the workspace.

A Kiwi streams 12 or 20 kHz of IQ anywhere in 0 to 30 MHz: enough for SSB, CW, AM and the narrowband decoders. Wider channels show out of band. Gain is the Kiwi's AGC or a manual RF gain.

Public Kiwis are shared. When one is full, kicks you, or hits its time limit, SDR-- stops and does not reconnect. A dropped connection is retried.

Dragon Labs CR-8

Eight phase_coherent lanes on one Device, iq1 to iq8, for calibration, direction finding, beamforming, and passive radar. All lanes tune together at a fixed 12.5 MS/s, with LNA, mixer, and VGA gain per lane. The clock is internal or an external 10 MHz reference.

The packaged builds leave CR-8 out. Build the server with cr8, install the vendor library, and check it with sdrmm --doctor. Set SDRMM_DLCR_LIBRARY if the library is somewhere unusual.

How radios are found

SDR-- looks for radios when USB devices change, and for network radios once a minute. SoapySDR probing runs in a child process, so a crashing module cannot take SDR-- down. Set SDRMM_SOAPY_PROBE=in-process to turn that off while debugging.