Files
trx-rs/WIP.md
T
sjg ba2fbed7c3 [feat](trx-rds): improve RDS robustness with 9 DSP techniques
Tech 1: replace one-pole baseband LPF with FIR RRC matched filter
(alpha=0.75, 4-chip span) — largest single measured improvement per
empirical comparison (gr-rds RRC vs plain FIR: 32/38 vs 18/38 stations).
Tech 2: 19 kHz pilot x3 -> 57 kHz coherent carrier reference via the
triple-angle formula; fed from the WFM pilot Costas PLL when
pilot_lock_level > 0.5, clearing to NCO fallback otherwise.
Tech 3/7/8: OSD(2) soft-decision block decoder replaces hard CRC check.
Per-bit soft magnitudes accumulated in Candidate::block_soft[26].
decode_block_soft() searches Hamming distance 0/1/2 (352 trials total)
and returns the minimum Euclidean-cost valid codeword; ~2-3 dB gain.
Tech 4: 8th-order 57 kHz BPF (4 cascaded biquads at Q=5) in wfm.rs
replaces the previous single Q=10 biquad; ~6x steeper ACI stopband.
Tech 5: Costas loop with tanh soft phase detector drives the RDS carrier
NCO when no pilot reference is available (P+I, B_L ~20 Hz).
Tech 6: Block A PI field LLR accumulation — signed per-bit LLR summed
over 3 independent Block A observations before committing the PI value,
correcting weak-signal false locks without delaying strong-signal lock.
Tech 9: 8-tap complex CMA blind equalizer applied to IQ samples before
FM discrimination; constant-modulus error (|y|^2 - R^2) drives tap
adaptation without a training sequence, suppressing adjacent-channel
interference at the source.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Stan Grams <sjg@haxx.space>
2026-03-26 23:10:42 +01:00

7.0 KiB
Raw Blame History

RDS Reception Improvements — WIP

Research into improving RDS demodulation robustness for two scenarios: adjacent channel interference (ACI) and weak signal (low SNR).

Signal Pipeline

Antenna → IF filter → FM discriminator → 57 kHz BPF → Costas PLL →
  Symbol timing → Manchester decode → Biphase decode →
  Block sync → (26,16) FEC → Group assembly

Prioritized Implementation Plan

# Technique Scenario Complexity Expected Gain
1 RRC matched filter ACI Low Largest measured (32 vs 18/38 stations in empirical test)
2 19 kHz pilot ×3 → 57 kHz carrier reference Weak signal Medium 36 dB carrier phase noise reduction
3 Erasure declaration + erasure decoding Weak signal Low 13 dB
4 8th-order 57 kHz IIR bandpass filter ACI Low Pre-filters ACI energy before Costas loop
5 Costas tanh soft phase detector Weak signal Trivial ~1 dB
6 LLR accumulation across repeated groups Weak signal Low √N SNR per repetition
7 Chase-II soft-decision block decoder Both Medium 12 dB
8 OSD(2) block decoder Both Medium 23 dB over hard-decision
9 IF CMA blind equalizer (pre-demodulation) ACI High 710 dB ACI protection ratio improvement

Technique Notes

1. RRC Matched Filter

RDS uses known BPSK pulse shaping per IEC 62106. The receiver should apply a Root Raised Cosine (RRC) matched filter rather than a generic FIR lowpass. The 2024 GNU Radio demodulator comparison showed RRC-based decoders (Bloessl's gr-rds) decoded 32/38 real stations vs. 18/38 for plain FIR lowpass filter decoders — the single largest measured improvement.

  • Roll-off factor: 1.0 per standard; experiment with 0.350.8 for sharper stopband
  • Operate at 2375 Hz chip rate (Manchester doubles the symbol rate from 1187.5 baud)

2. 19 kHz Pilot ×3 Carrier Reference

Instead of running a Costas loop autonomously on the noisy 57 kHz subcarrier, multiply the clean 19 kHz stereo pilot tone by 3 to produce a phase-coherent 57 kHz reference. The pilot sits at much higher SNR than the RDS subcarrier. redsea's own issue tracker identifies this as the dominant weak-signal failure mode; patent CN113132039A addresses the same problem.

Without pilot lock, fall back to a Costas loop with a tanh soft phase detector (see #5).

3. Erasure Decoding

When |LLR| for a bit is below a confidence threshold, declare it an erasure (known-position error) rather than a hard ±1 decision. The (26,16) RDS block code corrects:

  • 5 random bit errors (hard decision)
  • 10 erasures — 2× improvement at no added decoder complexity

Requires propagating LLRs from the symbol detector to the syndrome decoder instead of hard bits. The Group 0B PI cross-check (PI appears in both Block A and Block C) gives free erasure resolution on the most critical field.

4. 8th-Order 57 kHz IIR Bandpass Filter

Hardware RDS chips (e.g. SAA6579) place an 8th-order bandpass filter at 57 kHz before the carrier recovery stage. In software, an equivalent high-order IIR or long FIR centered at 57 kHz with ±4 kHz passband and steep roll-off attenuates adjacent-channel energy that bleeds into the MPX spectrum after FM discrimination. Insert this stage immediately after FM demodulation and before the Costas loop.

5. Costas tanh Soft Phase Detector

Replace the hard-slicer phase error Re(z) * Im(z) in the Costas loop with tanh(Re(z)/σ) * Im(z). This is the ML-derived phase error estimator and approaches the Cramér-Rao bound at low SNR. Trivial code change, useful whenever the pilot reference (#2) is unavailable.

6. LLR Accumulation Across Repeated Groups

RDS transmits the same data repeatedly (PI: every group every ~87.6 ms; PS name: ≥5 groups/sec). Accumulate per-bit LLRs across N repetitions of the same field before decoding:

LLR_acc[i] += LLR_n[i]    // for known-repeated bit positions

SNR improves as √N (3 dB per 4× accumulations). With ~11 PI observations per second, 1 second of accumulation is feasible before display latency becomes noticeable.

7. Chase-II Soft-Decision Block Decoder

The Chase-II algorithm generates 2^(2t) hard-decision decoder trials by flipping the 2t least-reliable bit positions (identified by smallest |LLR|), then picks the trial with minimum Euclidean metric. For the RDS (26,16) code with t=2: only 4 trials. The 26-bit block size makes this extremely fast.

Expected gain: ~12 dB over hard-decision decoding.

8. OSD(2) Block Decoder

Ordered Statistics Decoding at order 2 approaches ML performance for short linear block codes. Procedure for the (26,16) code:

  1. Sort all 26 bit positions by |LLR| descending (most to least reliable).
  2. Gaussian-eliminate the 10×26 parity-check matrix to bring the most reliable positions into systematic form.
  3. Enumerate order-2 test patterns (all pairs from the least-reliable positions).
  4. Select the minimum Euclidean-metric codeword.

The matrix is only 10×26 — Gaussian elimination is trivial. Expected gain: ~23 dB over hard-decision decoding, ~0.51.5 dB over Chase-II.

Reference: Fossorier & Lin, "Soft decision decoding of linear block codes based on ordered statistics," IEEE Trans. Inf. Theory, 1995.

9. IF CMA Blind Equalizer

FM signals are constant-envelope, so the Constant Modulus Algorithm can equalize the IF signal without training data, driven by the cost ||s(t)|² - 1|. A 2004 JSSC paper reports 710 dB improvement in adjacent channel protection ratio using a 6th-order blind equalizer applied to the digitized IF signal before FM demodulation. This is the most powerful ACI technique but requires operating at IF sample rates and handling the full pre-demodulation signal. Implement last.


Key References