Skip to content

Commit 4feceea

Browse files
secupclaude
andcommitted
fix(snr): noise reference = max(inter-chirp gap, min-stat idle floor) — F231 measured the IONOS gap 3-6 dB QUIETER than idle with 2x frame swing
The IONOS S:N-tracking noise BREATHES around bursts (gap 0.021-0.035 vs idle floor 0.044) — the gap-only reference was unstable there in both directions. A noise estimate can read falsely LOW (tracker decay in silence); the min-statistics idle floor bounds it from below. Max of the two independent measurements: no-op on constant-noise channels (real radio, OTASim — verified awgn@10 channel~9.5/9.9), stabilized on IONOS. Closes the handoff §2 bench experiment with measured numbers. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019btwFxDt7D19SZSqPYvZnk
1 parent 0710d78 commit 4feceea

1 file changed

Lines changed: 16 additions & 1 deletion

File tree

src/gui/modem/streaming_sync_acquisition.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -657,8 +657,23 @@ void StreamingDecoder::searchForSync() {
657657
// Handoff §2: hand THIS frame's burst-time noise reference to
658658
// the waveform so its training-span decode computes the
659659
// physical channel SNR (per-frame — no stale latch).
660+
// ROBUSTIFIED (F231, measured on the IONOS bench): that box's
661+
// S:N-tracking noise BREATHES around bursts — the inter-chirp
662+
// gap measured 0.021-0.035 vs a steady idle floor of 0.044
663+
// (up to 6 dB quieter, 2x frame-to-frame swing), which made
664+
// the physical readout unstable there. A noise estimate can
665+
// read falsely LOW (tracker decay in silence) but the
666+
// min-statistics idle floor bounds it from below, so the
667+
// reference is the MAX of the two independent measurements.
668+
// On constant-noise channels (real radios, OTASim) gap == floor
669+
// and this is a no-op.
660670
if (waveform_) {
661-
waveform_->setNoiseReferenceRMS(sync_noise_ref_rms_);
671+
float ref = sync_noise_ref_rms_;
672+
const auto ns = idle_noise_snr_estimator_.snapshot();
673+
if (ns.valid && ns.floor_noise_rms > ref) {
674+
ref = ns.floor_noise_rms;
675+
}
676+
waveform_->setNoiseReferenceRMS(ref);
662677
}
663678
LOG_MODEM(INFO,
664679
"[%s] burst-noise ref: rms=%.4f gap=[%zu+%zu..%zu) of buf=%zu",

0 commit comments

Comments
 (0)