Skip to content

v0.5.0

Choose a tag to compare

@ragb ragb released this 23 Feb 20:37
· 68 commits to master since this release

What's new in v0.5.0

RDS decoder overhaul

Major improvements to the RDS (Radio Data System) decoder for WFM broadcast:

  • FIR bandpass filter: 501-tap Kaiser window (β=8) at 55.5–58.5 kHz provides 97 dB rejection of L-R stereo subcarrier — previously a 4th-order IIR with only ~10 dB rejection
  • Pilot delay compensation: compensates FIR group delay so the derived 57 kHz carrier stays phase-aligned
  • Narrower lowpass: 1.2 kHz cutoff (was 2.4 kHz) reduces noise by ~3 dB
  • CRC single-bit error correction: pre-computed syndrome lookup table corrects single-bit block errors
  • Gardner TED clock recovery: replaces zero-crossing detector with Gardner timing error detector + PLL for more robust bit timing
  • Partial group decode: extracts PS/PTY/RT from partial groups (A+B blocks sufficient), improving decode rate on marginal signals
  • PTY confirmation: requires same programme type code seen twice before reporting, filtering CRC false positives
  • Improved sync tolerance: survives up to 50 consecutive bad blocks without losing sync (was 10)
  • Debug diagnostics: SNR measurement (peak-bin FFT), bimodality, sign-change rate, ones/zeros ratio

Test suite

  • 54 unit tests covering CRC-10, block sync, PS/RT/PTY decode, DSP chain integrity, and end-to-end BPSK demodulation
  • Hardware benchmark scripts for testing with real RTL-SDR hardware:
    • python -m tests.rds_scan — scan FM band for pilot/RDS signal strength
    • python -m tests.rds_hw_bench --freq 104.3 --time 120 — full RDS decode test

Known limitation

RDS decode requires sufficient signal-to-noise ratio (~10+ dB in-band). With small indoor antennas, the RDS subcarrier is typically below the noise floor. An outdoor antenna or LNA is recommended for reliable RDS reception. See #28 for details.

Other changes

  • RF settings dialog improvements
  • Build workflow and installer updates
  • i18n regeneration