SDR receiver
A software-defined radio in the browser — an RTL-SDR dongle over WebUSB, an rtl_tcp server, a recorded IQ file or a built-in test band — with a spectrum and waterfall, click-to-tune, WBFM, NBFM, AM, USB, LSB and CW, squelch, band presets, bookmarks, and audio and IQ recording.
Added
Works with
- Digital modes Radio and RFdecodes the receiver’s audio when Share audio is ticked
How to use it
Choose a Source and press ▶ Start:
-
Test band — a synthetic 1 MHz-wide band generated in the page, with one of each kind of signal (a WBFM station, an NBFM channel, an AM station, a USB two-tone and a CW beacon). It needs no hardware: use it to learn the controls.
-
RTL-SDR (USB) — plug in an RTL-SDR dongle and pick it in the browser’s list. The driver runs in the page over WebUSB (Chrome, Edge or Opera on desktop or Android). Tuners: R820T, R820T2, R828D and the RTL-SDR Blog V4 (with its HF upconverter).
-
rtl_tcp — a dongle on another computer (a Raspberry Pi in the loft) running
rtl_tcp -a 0.0.0.0. The gitwebsite app’s companion connects to it (addhost:1234to its TCP allow-list — it asks the first time); or bridge it to a WebSocket yourself (websockify 1235 pi.local:1234). -
IQ file — a recording: a two-channel WAV (SDR#, SDRuno, GQRX), or raw
.cu8(fromrtl_sdr),.cs16or.cf32. Centre frequency and sample rate are read from the WAV header, an SDR# "auxi" chunk, or a file name such as…_100300000Hz_2048000sps.cu8. It plays at real time, in a loop.
Tuning. Type a frequency (MHz, or add k/Hz), use −/+, click on the spectrum, drag the red
dial line, or use the mouse wheel and arrow keys (Shift for ×10). With hardware, the dongle retunes
when the dial leaves the band, keeping the channel a quarter of the band away from the centre spike.
Mode picks the demodulator and its usual filter; Filter bandwidth narrows or widens it (the grey
band on the spectrum). Squelch mutes the audio while the channel is below the threshold (the
dashed yellow line; the meter shows the level in dBFS).
Bands tune the hardware to FM broadcast, airband, NOAA weather radio (162.400–162.550 MHz), 2 m and 70 cm amateur, PMR446, FRS/GMRS and marine VHF, with their channels as buttons. ADS-B 1090 shows the 1090 MHz transponder band; decode the messages with the Mode S decoder and map them with the flight tracker. ★ Bookmark this keeps a frequency, mode and filter in this browser; Export/Import move them as JSON.
Record saves the audio as WAV, and the raw IQ as .cu8 with the centre and rate in the name, so it
opens again here or in SDR#, GQRX and inspectrum.
Full screen (⛶ Full screen or F; Esc leaves) gives the spectrum and waterfall the whole screen with the tuning bar above it; ◫ Panels shows the settings beside it.
Drivers
-
macOS — nothing to install: WebUSB talks to the dongle directly.
-
Windows — the dongle arrives with a DVB-T TV driver. Replace it with WinUSB using Zadig: Options → List all devices → "Bulk-In, Interface (Interface 0)" → WinUSB → Replace driver. (SDR#, SDR++ and rtl_tcp need the same.)
-
Linux — the kernel’s
dvb_usb_rtl28xxumodule claims the dongle. Unload it (sudo rmmod dvb_usb_rtl28xxu) or blacklist it (echo blacklist dvb_usb_rtl28xxu | sudo tee /etc/modprobe.d/rtl-sdr.conf), and let your user open the device with a udev rule (SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="2838", MODE="0666", or thertl-sdr.rulesfile from the rtl-sdr package). -
Android — Chrome asks for permission when you pick the dongle on a USB-OTG adapter.
-
iPhone and iPad — no WebUSB; use rtl_tcp on another computer through the gitwebsite app, or a recording.
How it works
The USB driver is a JavaScript port of Jacobo Tarrío’s
webrtlsdr (the driver behind
Radio Receiver), under the Apache License 2.0
(licence). It initialises the RTL2832U demodulator as
librtlsdr’s rtlsdr_init_baseband() does (the same FIR taps and register writes — the tests check
the sequence) and programs the R820T’s PLL, mixer and filters over the I²C repeater. Samples come as
unsigned 8-bit I/Q pairs in USB bulk transfers.
The signal processing runs in a Web Worker: the channel is mixed to 0 Hz, decimated in two FIR stages (to about 250 kHz, then about 50 kHz for the narrow modes), demodulated — FM by the phase step between samples (with 50 or 75 µs de-emphasis for broadcast), AM by the envelope, SSB and CW by the frequency-shift method with a complex low-pass so the other sideband is rejected — then squelched, levelled (AGC) and resampled to the sound card’s rate, which an AudioWorklet plays. The spectrum is a Blackman–Harris windowed FFT, averaged for the trace; levels are dBFS.
Limits
-
WebUSB only in Chromium browsers; hardware access was tested against a stand-in device, not every dongle. E4000, FC0012 and FC0013 tuners are not supported.
-
WBFM is mono (no stereo pilot decoding, no RDS).
-
Direct sampling (HF on the original V3 dongles) is not offered; the Blog V4’s upconverter is.
-
rtl_tcp at 2 MS/s is 4 MB/s over the network; use 1.024 MS/s over Wi-Fi.
-
Your browser decides the audio latency; the player drops audio to stay under 0.6 s behind.
-
Transmitting is not possible with an RTL-SDR, and listening is subject to the law where you are (in some countries it is an offence to listen to, or to reveal, some services).
Related: digital modes decodes FT8, PSK31, RTTY, CW and SSTV from audio (record the SDR’s audio and open it there), propagation & logbook has the greyline, band conditions, an ADIF log and APRS, ham radio has the band plans, antennas designs an antenna for a band, RF works out path loss, Morse code trains and decodes CW, and satellite passes says when the ISS (145.800 MHz) is overhead.
Linking to an example
Share link copies a link with the source, frequencies, mode and settings (bookmarks are never in it). Parameters:
| Parameter | Meaning |
|---|---|
|
dial frequency, Hz |
|
centre frequency, Hz (hardware and files) |
|
|
|
filter bandwidth, Hz |
|
|
|
squelch, dBFS (−120 = open) |
|
sample rate (S/s), tuner gain (dB or |
|
display: FFT size, zoom, level range |
|
rtl_tcp |
|
one of the presets below |
Feedback is a gift. Something to improve, a feature to add, or a bug? Tell me.
Runs entirely in your browser — network requests go only to the services named on this page.