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, over the network, or through SoapySDR. Recordings and generated 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:

RadioConnects overNeeds
RTL-SDRUSBNothing
KrakenSDR, KerberosSDRUSBNothing
HackRFUSBNothing
Airspy R2, Mini, HF+, HF+ DiscoveryUSBNothing
AntSDREthernet or USBNothing
ADALM-Pluto, other AD936x boardsUSB or EthernetNothing
SDRplay RSP1, RSP1A, RSP1B, RSP2, RSPduo, RSPdx, RSPdx-R2USBSDRplay API 3.15+
SDRplay on another machineNetworkSDRconnect there
KiwiSDRNetworkNothing
Dragon Labs CR-8USBVendor library, a build with cr8
bladeRF, LimeSDR, USRP, othersUSBA SoapySDR module

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

Connect a radio

USB

Plug it in: it appears on every empty Device node.

On Linux, 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.

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. The bookmark button next to Add saves it; saved radios are listed above the form on every empty Device node.

Network IQ uses a lot of bandwidth. When the link cannot keep up, the radio node shows Lost with the share of samples missing: lower the rate.

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.

Device controls

Controls mean the same thing on every radio:

ControlSets
RateSample rate
LanesHow many receive lanes stream, on radios that can choose
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

On a radio with several lanes, each lane's own controls sit under iq1, iq2, and so on, and the ones they share under All lanes. Health shows clipping, queue delay, and lost samples.

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.

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.

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. Thank you.

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. Thank you.

AntSDR

SDR-- talks to the iiod server of the AntSDR's Pluto firmware directly, with no libiio. It is tested on the E310: an AD9361 from 70 MHz to 6 GHz with up to 56 MHz of bandwidth, and two receive and two transmit lanes on one synthesizer, so both receive lanes are phase coherent. Support for the UHD firmware is planned.

USB: connect the USB 2.0 port and the board appears on its own, with no network setup. Windows needs the PlutoSDR drivers. USB 2.0 carries a few MS/s.

Ethernet, direct cable: the board sits at 192.168.1.10. Give the computer's Ethernet port a fixed address in the same range once, and leave the router empty so the internet stays on Wi-Fi:

SystemWhere
macOSSystem Settings, Network, the Ethernet adapter, Details, TCP/IP. Configure IPv4 Manually, IP 192.168.1.100, subnet mask 255.255.255.0
WindowsSettings, Network & internet, Ethernet, IP assignment, Edit. Manual, IPv4 on, IP 192.168.1.100, subnet mask 255.255.255.0
Linuxnmcli connection add type ethernet ifname <port> con-name antsdr ipv4.method manual ipv4.addresses 192.168.1.100/24

Ethernet, through your router: if your network already uses 192.168.1.x and nothing else sits at .10, plug the board into the router and it works from every computer on it. Otherwise give the board a free address in your range: connect it over USB, open the drive it shows, set ipaddr_eth and netmask_eth in config.txt, and eject. Over SSH the login is root / analog.

Search tries 192.168.1.10, ant.local and 192.168.2.1; enter any other address in the Network tab. If nothing is found, ping 192.168.1.10: no answer means the cable or the computer's address.

Gigabit Ethernet carries about 60 MB/s from the E310: 15 MS/s on one lane, or 7.5 MS/s per lane on two. Set Lanes to 1 for one wide lane. The E310 locks its antenna and TX ports in firmware, so those menus are hidden. The other controls are the AD936x ones.

Tested on hardware provided by MicroPhase. Thank you.

PlutoSDR and other AD936x boards

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

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 260 kS/s to 61.44 MS/s (30.72 on a 2×2 board); below 2.08 MS/s the FPGA decimates. The link sets the real limit. On a 2×2 board both RX lanes share a clock and are phase coherent.

ControlDoes
Lanes1 or 2 on a 2×2 board. One lane gets the whole link
TunerReceive gain per lane. The range follows the band
TXTransmit attenuation per lane
AGCPer lane: slow attack, fast attack, or hybrid
Quadrature, RF DC, baseband DC trackingHardware corrections
Antenna, TX portShown only if the board lets the port change

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. For NixOS, see Nix.

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.

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. A remote SoapySDRServer shows up in the normal radio list, through SoapyRemote.

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.

Other sources

NodeGives
RecordingPlays a SigMF recording
Signal generator44 signals, from a plain tone to DVB-T

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

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.