Skip to content

Wideband DDC/channelizer breaks across all taps when sample_rate raised above 2.5 MS/s (narrow-passband tradeoff at 2.5 MS/s otherwise starves off-center taps) #764

Description

@er-imagery

Summary

Following up on the multi-site wideband overload work in #749/#760 — confirmed our remaining "weak site" symptom is not RF, antenna, gain, or USB, and is not fixed by raising sdr.sample_rate. It looks like a sample-rate-dependent bug in the wideband DDC/channelizer path.

Setup

Airspy R2, role: wideband, center_freq_hz: 420900000, 4 MMR control-channel taps:

Site Freq Offset from center
Melbourne / CBD 420.01250 MHz -887.5 kHz
120 Collins St 420.03750 MHz -862.5 kHz
Mt Anakie 420.08750 MHz -812.5 kHz
Mt Blackwood 421.83750 MHz +937.5 kHz

gain: 600 (60 dB), sample_rate: 2500000 (the config file's own comment claims "GLOBAL 10 MS/s" but the value is 2.5 MS/s — possibly a stale comment from before a default changed).

Symptom at sample_rate: 2500000 (current default)

Only Mt Anakie (closest to center, -812.5 kHz) decodes. The other three sit at -82 to -86 dBFS on gophertrunk_sdr_iq_power_dbfs, with the "channel iq power very low" WARN, and never get an FSW hit.

Ruled out RF/hardware first:

  • airspy_rx tuned directly at 420.0125 MHz (Melbourne) shows a strong, unambiguous signal: -5.3 dBFS RMS. So the RF is there.
  • gophertrunk_sdr_wideband_input_clip_ratio is 0 — no front-end overload (ruled out the Multiple control channels on one wideband device are hunted sequentially, not decoded in parallel #749 overload scenario).
  • Physically reset the Airspy (unplug/replug), confirmed clean re-enumeration via airspy_info, no USB errors — no change to the symptom.
  • gophertrunk capture + gophertrunk spectrum on a 5 s wideband snapshot at the daemon's own settings (2.5 MS/s, center 420.9 MHz, gain 600) found only one carrier anywhere near our taps: Mt Anakie at -813.0 kHz, -78.0 dBFS, SNR 25.2 dB. Nothing detected at the other three offsets. This matches the live decode failures — it's not a decode-vs-RF mismatch, the energy genuinely doesn't show up at this sample rate.

What we tried: raising sample_rate to 10000000

Hypothesis: at 2.5 MS/s the channelizer's anti-alias/decimation filter has a flat passband much narrower than the full ±1.25 MHz Nyquist, rolling off hard before ±900 kHz — which would explain why only the closest-to-center site survives.

Re-ran the same capture+spectrum check at 10 MS/s: now 19 carriers detected across the band, including real carriers at all four of our offsets (Melbourne -888.7 kHz/-92.7 dBFS SNR 12.8 dB, Mt Blackwood +937.5 kHz/-83.1 dBFS SNR 22.4 dB, Mt Anakie -813.0 kHz/-69.3 dBFS SNR 36.2 dB). So the RF and bandwidth theory checks out — at 10 MS/s, all four sites' signals are genuinely present in the capture.

But running the live daemon at sample_rate: 10000000 (same 4 channels, same gain) broke decode for all four sites, including Mt Anakie, which decodes cleanly at 2.5 MS/s. All four taps reported "very low" iq power and zero tsbk decoded lines. Reverting to 2.5 MS/s immediately restored Mt Anakie's clean decode (526 tsbk decoded in the next ~2.5 min window).

Conclusion

This isn't an RF, antenna, gain, or front-end-overload problem — it's reproducible and isolated to the wideband DDC/channelizer's handling of sdr.sample_rate. At 2.5 MS/s the passband is too narrow for taps beyond ~±850 kHz from center (config's own "10 MS/s" comment suggests this rate may already be a regression from an intended default). At 10 MS/s, the RF is present per spectrum, but something in the live DDC/decimation path is apparently hardcoded to 2.5 MS/s assumptions and breaks across the board when the rate changes.

Repro steps

  1. Config: Airspy wideband, center_freq_hz: 420900000, gain: 600, 4 taps at the frequencies above.
  2. At sample_rate: 2500000: only the closest-to-center tap decodes; others sit at low iq_power with no FSW hits.
  3. gophertrunk capture -freq 420900000 -sample-rate 2500000 -gain 600 -seconds 5 -format f32 -out wide.cfile then gophertrunk spectrum -in wide.cfile -format f32 -sample-rate 2500000 -freq 420900000 — confirms only the closest tap shows as a carrier.
  4. Repeat capture/spectrum at -sample-rate 10000000 — all four taps now show as carriers.
  5. Set sample_rate: 10000000 in the daemon config and restart — all four taps fail to decode, including the previously-working one.
  6. Revert to sample_rate: 2500000 — previously-working tap (Mt Anakie) immediately recovers.

Happy to provide the raw wideband .cfile captures from steps 3/4 if useful for the matched-IQ ground truth.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions