This began as "let me print a few numbers from my HackRF." After several hundred commits it has four lab benches, a Bluetooth decoder, an FM demodulator that refuses to make a sound, and a Friis noise figure model. Nobody asked for the Friis model. Least of all me.
Why this exists
sdrtop is my Ego's creation. I wanted to understand RF from the inside, not from a textbook diagram, but from real IQ samples flowing inside code I've written myself. So it's a somewhat philosophical work, where the question asked is as simple as it is annoying to answer: what is the maximum an SDR can measure, and how far can you trust that?
Most SDR tools answer the first part. They show you a spectrum, a waterfall and a number, and tell you to trust them. sdrtop is built upon the opposite instinct: a value modelled, uncalibrated, stale or unavailable on your radio will say so. It will not be hidden behind an attractive FFT and a confident label, and it will not pretend a 20 dollar dongle is a spectrum analyser. The dongle isn't one, either.
The goal was never to imitate a lab instrument, but to find where an SDR works, breaks and why. The 'why' is what's being sold.
The engineering philosophy
sdrtop is written in Rust, and the signal processing was done from scratch on top of rustfft. (Announcing this is mandatory. I'm told that if you write something in Rust and don't mention it, the borrow checker takes it back.) The language is not what's important, though. The point is a handful of commitments that make the honesty above technically possible:
- A modular DSP pipeline. Device read, FFT, detection and display are distinct stages. I want to be able to blame one of them if measurement is wrong, not spend hours staring at the monolith.
- The radio sits behind a common interface. Both HackRF One and RTL-SDR run on their native libraries, which are loaded at runtime. The tinySA communicates over its USB console. Any software with a SoapySDR driver will talk to it through a further backend. The measurement code does not care which one it is talking to, which is exactly what you want for a question about what can and can't be measured by different hardware.
- Failure is visible, not silent. Real-time RF is unforgiving. If your host lags behind the radio, you don't get slightly outdated data, you get corrupt data. Thus, drops are indicated, the fill level of the ring buffer is reported before the drops even start, the demodulator says when it started losing blocks, and an IQ recording can note the exact sample when that happens.
- Samples are not copied for convenience. It helps throughput, but mostly it helps correctness. Every copy is one more place for a bug to hide and bugs are world-class at hiding.
- Explicit FFT settings. Windowing, averaging and scaling are chosen on purpose, and averaging is a knob you can see and turn rather than something done to you behind the scenes.
- A non-blocking TUI. The interface never stalls the pipeline, and the pipeline never stalls the interface. A tool that lies about its own liveness cannot be trusted about anything else.
What it measures, and how it admits failure
There's a spectrum and a waterfall, of course. Then there's four lab benches for the questions a plot can't answer: is the quadrature clean, is the front end staged right, is my computer keeping up, and what is that signal. There's also a demodulator that deliberately plays no audio. Yes, a radio tool with no sound. It decodes the station name, the stereo pilot, the deviation and the squelch tone, then sits there in complete silence, like a very well-informed librarian. There's also a band sweep, a Bluetooth / BLE section, and IQ recording to SigMF.
Every one of those carries its own context:
- Stale is labelled stale. Every lab panel marks itself
[STALE]the moment RX stops, so a frozen number is never mistaken for a live one. - Noise floor comes with its spread, and as a density in dBFS/Hz, so the same receiver reads as the same...
MusiThang








diddy
Neuradock001
E/S Pronk