Iridium: prove + harden the wideband path at 6 MS/s#126
Conversation
Investigating why the live Iridium session decoded nothing, I found the wideband decoder had NO test above 2 MS/s — the station runs it at 6 MS/s (decim 24). Added decodes_real_burst_at_station_rates: it upsamples the real gr-iridium reference burst to 2 and 6 MS/s at several offsets (incl. near the band edge) and confirms detect + demod with clean PRBS15. The 6 MS/s path works correctly — the live silence is the antenna/signal, not the core. (A synthetic multi-rate test via modulate() is the WRONG tool: its RRC is a fixed 81 taps, which under-filters to ~half a symbol at high sps, so it generates garbage above ~2 MS/s. Upsample real bursts instead.) Also fixed a real robustness bug found en route: the per-bin noise floor was seeded from a single frame, so many bins started near a noise null and read tens of dB 'hot' for the EMA's whole settling time — a startup storm of false detections, worse at the larger FFTs of higher rates (wasted CPU; CRC rejects them so no false decodes). Now warms up a mean over the first 64 frames (~33 ms) before detecting. Real-burst detection is unaffected. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughThis PR introduces a noise-floor warmup phase to the wideband FFT burst detector. A new ChangesWideband Burst Detection Warmup Phase
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c29467ba03
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if warming { | ||
| // Incremental mean of the frames seen so far. | ||
| *f += (m - *f) / self.floor_frames as f32; | ||
| continue; |
There was a problem hiding this comment.
Preserve bursts during the warmup window
When a stream or file begins with an Iridium burst, or a burst starts within the first 64 FFT frames, this branch updates the floor and continues before setting any hot bins, so no ActiveBurst is created. At the current 6 MS/s FFT size this suppresses detection for about 44 ms, long enough to drop shorter bursts entirely or miss the preamble of longer ones, after which process can drain the samples because there is no active burst; this regresses captures that do not have an initial quiet lead-in.
Useful? React with 👍 / 👎.
Summary
Triggered by the live Iridium session decoding nothing. Conclusion: the iridium core works correctly at the station's 6 MS/s — the live silence is the antenna/signal (separately confirmed: SAWbird+IR powered and passing the band, but a full-band capture shows zero burst energy; the Maxtena PN100/M1621HCT-EXT1 passive antenna needs clear sky view).
What this PR adds:
decodes_real_burst_at_station_rates— the wideband decoder had no test above 2 MS/s, yet the station runs it at 6 MS/s (decim 24); that gap is exactly why 6 MS/s correctness was unknown. The test upsamples the real gr-iridium reference burst to 2 and 6 MS/s at several offsets (including near the band edge) and asserts detect + demod with clean PRBS15. It passes — 6 MS/s is correct.Note for future testing:
modulate()is the wrong way to synthesize high-rate test signal — its RRC is a fixed 81 taps (~half a symbol at 6 MS/s sps=240), so it produces garbage above ~2 MS/s. Upsample real bursts instead (as this test and the existing 2 MS/s test do).Bench gates unchanged.
🤖 Generated with Claude Code
Summary by CodeRabbit
Bug Fixes
Tests