Thanks to HansVanEijsden (FMDX.org), who put a Pira FM broadcast analyser next to VibeServer's
RDS panel on six Dutch stations and photographed both. That turned a readout that looked plausible
into one that can be checked — and two of our three numbers were wrong.
RDS phase was reading as its own reflection
A station 8° out was displayed as 172°. 45° showed as 131°, 2° as 174°.
The estimate itself was right all along; only the range was wrong. BPSK's 180° ambiguity is real,
so folding into [0,180) is a defensible thing to do — but the quantity is an unsigned angular
distance, and that wants [0,90]. Every genuinely faulty transmitter was displayed as its own
mirror image.
Why it went unnoticed for a month: the two cases anyone checks against are the two the bug
cannot touch. A correctly-phased station at 0° reflects to 180°, which still reads as "near
nominal". A quadrature station at 90° is the fixed point where both branches coincide. So the good
cases and the textbook case both looked perfect, and only the faults in between were wrong.
Phase now agrees with the Pira to within 4° on all six stations.
RDS deviation used the wrong constant
The code scaled by √2 — a sinusoid's RMS-to-peak factor — applied to a value that is neither an RMS
nor a sinusoid. What it actually needs is the crest factor of a spec-shaped biphase envelope after
our own ±2.4 kHz baseband filter, which depends on that filter and has no tidy closed form. It is
now 1.520, measured by simulation (tools/rdsdev_cal.cpp, included) and stable to ±0.2% across
every channel rate from 192 to 320 kHz.
Known and deliberate: deviation still reads about 1.3 dB low against the Pira. That has not
been tuned away, because the evidence says it is not a scaling error — pilot deviation is exact on
six stations out of six while RDS is low on six out of six. The suspect is the WFM channel filter
clipping FM sidebands, which attenuates the top of the MPX and leaves the 19 kHz pilot alone. If
that is right, the subcarrier is arriving weak and we are losing decode margin, not just display
accuracy. Papering over it with a display constant would have hidden a reception bug.
Long PS, RT+ and PTYN — confirmed working on air
These shipped in 0.4.0 essentially unverified, because UK broadcasters barely send them. There
was no local signal to test against. Hans's screenshots settled it, and 1Zwolle on 105.0 did the
honours:
- Long PS —
1ZWOLLE. - RT+ — RadioText
Je hoort 2Pac met Changescorrectly resolved to Now Playing: 2Pac —
Changes - PTYN —
Variatie, and the programme language as Dutch - ODA —
RT+ in 12A, with Radio 10 on 102.8 announcingTMC in 8A
The RT+ result is the one that mattered most. Spotting RT+ in 12A only proves the announcement
decoded; pulling the artist and title out of a free-text string proves the tags were then applied at
the right offsets. Those are two separate things and only the second one is visible.
Hans's capture, and worth reading twice — it is running 0.4.0, so it also shows the phase bug
this release fixes. RDS↔PILOT 174° is 1Zwolle's true 2° reflected. On 0.4.1 that same station
reads 6°.
Uncompressed audio
Hans identified the Opus codec by ear within moments of first listening. Fair. The old on/off
compatibility switch is now three-way:
- Off — networked listeners get Opus; a client that cannot decode it is turned away with a
reason rather than left in silence. - Listener's choice — a switch appears in each listener's audio menu, defaulting to Opus.
- Compatibility only — the old safety net, with no control offered.
Anything on this Mac always gets uncompressed audio, whatever the setting says. Compression only
ever bought bandwidth, and a browser on 127.0.0.1 does not use any.
De-emphasis (and squelch, NR, notch, stereo) silently reverting
Reported by Hans: the panel read OFF over obviously de-emphasised audio, and any settings change put
it right. Five separate radio-start paths rebuilt the internal state and reset these to their
defaults, while the client kept displaying the listener's choice. A rate change, a USB glitch, a
resume from idle, or simply being the first to connect would all do it. The choices now live outside
that state and are re-applied on every restart.
De-emphasis is only where it was noticed — it is the one you can hear. Noise reduction silently
off just sounds like a slightly worse receiver.
Receiver name and location on the spectrum
The name and location overlay is now filled in, and there is a "Use this Mac's location" button
in Settings.
It fills in the Maidenhead locator, not your coordinates — a square roughly 4 km across, which
is all a distance, a bearing or an ITU region needs. You are publishing where your antenna is to
everyone who connects, and that should not have to mean your address.
Requires macOS 14. Notarised by Apple, so it opens without a Gatekeeper warning. RTL-SDR and
SDRplay RSP.
