Airspy HF+ support, and a day of RDS work validated against a professional broadcast
analyser.
If you are running 0.4.2, this replaces it — see the withdrawal note at the bottom.
Airspy HF+ Discovery
Plug it in and it works. libairspyhf is BSD-licensed and links straight into the app, so
there is nothing to install — unlike the SDRplay, whose driver you still have to install
separately.
Its controls are its own, and are shown only when one is connected: an HF+ has no variable
gain stage at all, so instead of a gain slider you get the +6 dB preamp, the 0–48 dB
attenuator and the radio's own AGC. Presenting a "gain" slider for that would have described
the hardware wrongly.
Two things the hardware does that the app now knows about:
- It tunes 0.5 kHz–31 MHz and 60–260 MHz, with nothing in between. That gap is absent
hardware, not a weak spot. Tune into it and you stop at the edge with a note; tune again
the same way and you jump across. The unreachable half of the window is blacked out and
labelled rather than drawn as if it were quiet band. - Sample rates come from the radio, not from a list we guessed. A Discovery tops out
around 912 kHz where a dongle starts at 960.
Samples are taken as complex float throughout, so an 18-bit-effective radio is not quietly
quantised to 16 and back.
RDS, calibrated against a Pira analyser
Hans van Eijsden of FMDX.org put a Pira FM broadcast analyser next to
VibeServer on six Dutch stations and photographed both. That found two errors nothing inside
the software could have:
The RDS-to-pilot phase reported every station as its own reflection — 8° shown as 172°,
45° as 131°. The measurement was right; the range was wrong. It survived because the two
cases anyone tests against, a correctly-phased station and a quadrature one, are exactly the
two the fault cannot affect.
The deviation used a constant that never applied to it — a sinusoid's RMS-to-peak factor,
on a quantity that is neither an RMS nor a sinusoid.
Phase now agrees with the Pira to within a few degrees on every station he measured. He
reports being able to leave the analyser at home.
RAW mode in the RDS analyser
A new RAW button. Everything gated is normally confirmed by repetition, so one
mis-corrected block cannot poison a field. RAW shows what is arriving live instead: labels
start red and turn green as each field earns confirmation, so you watch the panel resolve.
It earns its place on marginal signals. A station whose RDS locks and drops looks broken in
confirmed mode — fields simply never appear — and diagnosable in RAW.
Also now confirmed by repetition: TA, MS and DI (four single bits, so one bad block used
to set a flag for the session), and the clock's UTC offset — the time changes every
minute and can never be confirmed, but the offset is a constant, and taking it on one sighting
is how a station reported UTC+3 and then UTC−4.5 minutes apart.
Rotation is now detected by rate, not by coherence collapsing. A station whose encoder is
not locked to its pilot rotates slowly, keeps a high "steady" figure, and used to slip past
unremarked while the angle walked round underneath it.
The deviation no longer reads a value on a dead carrier. The subcarrier band is never
empty, so with no station the estimator was turning hiss into "12.9 kHz · generous" — past the
5.6 kHz spec ceiling, and reading higher as the signal got worse.
Uncompressed audio
Hans identified the Opus codec by ear, then named why it matters: Bluetooth headphones
re-encode whatever you send them, so Opus into SBC or AAC is two generations of lossy
compression stacked.
Compression is now a three-way operator choice — off, listener's choice, or compatibility
fallback. Anything on the host machine itself always gets raw audio, whatever the setting:
the only argument for compressing is bandwidth, and a browser on localhost uses none.
★ Running a public server? "Listener's choice" lets any visitor take ~187 KB/s of your
uplink instead of ~10. "Compatibility only" keeps the safety net without advertising it.
An SDRplay RSP could freeze solid
Audio and spectrum would stop dead while the server went on reporting itself healthy, and only
quitting and relaunching brought it back. The SDRplay API can simply stop calling us while
every handle stays valid. It now detects the stall and re-initialises the stream in place,
keeping your gain, AGC and tuning — you lose a second of audio instead of the session.
Receiver name and location
A receiver's name and location now appear over the spectrum, and there is a "Fill in locator
from this Mac" button.
It fills in a Maidenhead grid square, not your address — roughly 4 km across, which is all
a distance or a bearing needs, and not enough to find you by. A receiver's position is
published to everyone who connects, and most operators would rather that not be their front
door.
Withdrawn: FM-DX
0.4.2 briefly had an FM-DX mode. It made RDS worse and has been removed.
It widened the channel filter to recover RDS subcarrier amplitude, which it did. But what
decides whether RDS decodes is subcarrier signal-to-noise, and FM's noise triangle puts noise
power up as the square of baseband frequency — so a wider filter dumps disproportionately more
noise at exactly 57 kHz. The justification measured the numerator and ignored the denominator.
Measured properly, RDS SNR at 57 kHz:
| channel filter | RTL-SDR @ 2.4 MSPS | Airspy HF+ @ 912 kHz |
|---|---|---|
| standard | +32.9 dB | +36.5 dB |
| wide (FM-DX) | +33.1 dB | +26.5 dB |
Neutral on a dongle, which is why it passed testing — and ten dB worse on a narrow-band radio.
It showed up within minutes of an Airspy being plugged in: constellation scatter 16% → 39%,
block sync lost entirely, on a station plain WFM decodes instantly.
0.4.1's notes also said the channel filter meant we were "receiving RDS weak and losing decode
margin". That was inferred from the same amplitude figure and is not true — the SNR is fine,
and is best at the standard setting. The filter costs readout accuracy, not decodability.
Also
- De-emphasis, squelch, noise reduction, auto-notch, stereo and RSP gain now survive a radio
restart. They were being reset while the panel still showed your choice. - Larger station logo under the MPX display.
- The RDS panel no longer stair-steps as fields arrive, and long explanatory text wraps
instead of running off the panel.
Requires macOS 14. Notarised by Apple, so it opens without a Gatekeeper warning. RTL-SDR,
SDRplay RSP and Airspy HF+.