@@ -26,31 +26,31 @@ struct WaveformRecommendation {
2626// Both recommendWaveformAndRate() and recommendDataMode() use this.
2727//
2828// Fading index now combines freq_cv + temporal_cv (Doppler measurement).
29- // Thresholds (2026-02-10 ) - Full rate ladder:
29+ // Thresholds (2026-03-15 ) - Full rate ladder:
3030// AWGN only (< 0.15): R3/4 @ SNR >= 20 (10/10 seeds, 0 retx)
31- // Good fading or better (< 0.65 ): R2/3 @ SNR >= 20 (30/30 seeds, 0 retx)
32- // Good fading or better (< 0.65): R1/2 @ SNR >= 15 (5/5 seeds, 0 retx)
33- // Moderate fading (< 1.10): R1/2 @ SNR >= 15 (6/6 seeds, 100% delivery )
31+ // Near-AWGN (< 0.15 ): R2/3 @ SNR >= 15
32+ // Good fading (< 0.65): R1/2 @ SNR >= 15 (5/5 seeds, 14% retx)
33+ // Moderate fading (< 1.10): R1/2 @ SNR >= 15 (100% delivery, 52% retx )
3434// Heavy+ (>= 1.10): R1/4 only
3535//
3636// R3/4 verified (2026-02-10):
3737// DQPSK R3/4 AWGN SNR=20: 10/10 seeds PASS, 0 retransmissions
3838// DQPSK R3/4 Good fading: FAILS (23 retx / 5 seeds) — AWGN only!
39- // Payload: 243 bytes/frame — 23% gain over R2/3
40- // R2/3 verified (2026-03-15, CPE correction for differential modes):
41- // DQPSK R2/3 Good fading SNR=15: 10/10 seeds PASS, avg 1.5 retx
42- // DQPSK R2/3 Good fading SNR=20: 30/30 seeds PASS, 0 retransmissions
43- // Payload: 197 bytes/frame — 40% gain over R1/2
44- // R1/2 verified (2026-03-15):
45- // DQPSK R1/2 Moderate fading SNR=15: 5/5 seeds PASS, avg 2.4 retx
46- // DQPSK R1/2 Good fading SNR=15: 5/5 seeds PASS, 0 retransmissions
39+ // R2/3 verified (2026-03-15, 802.11n LDPC + CPE correction):
40+ // 10KB file transfer good fading SNR=15: 1485 bps, 33% retx
41+ // 10KB file transfer AWGN SNR=15: near-ideal (low retx)
42+ // Demoted from good fading: R1/2 gives similar throughput (1418 bps)
43+ // with half the retransmissions (14% vs 33%) — more reliable.
44+ // R1/2 verified (2026-03-15, 802.11n LDPC):
45+ // 10KB file transfer good fading SNR=15: 1418 bps, 14% retx, 100% frame success
46+ // 10KB file transfer moderate fading SNR=15: 1055 bps, 52% retx, 99% frame success
47+ // 10KB file transfer AWGN SNR=15: 1636 bps, 3% retx, 100% frame success
4748inline CodeRate selectOFDMCodeRate (float snr_db, float fading_index) {
4849 // AWGN only: R3/4 at SNR >= 20 (too many retx on fading)
4950 if (fading_index < 0 .15f && snr_db >= 20 .0f ) return CodeRate::R3_4;
5051
51- // Good fading or better: R2/3 at SNR >= 15
52- // CPE correction for differential modes enables this (was SNR >= 20 before 2026-03-15)
53- if (fading_index < 0 .65f && snr_db >= 15 .0f ) return CodeRate::R2_3;
52+ // Near-AWGN: R2/3 at SNR >= 15 (too many retx on real fading channels)
53+ if (fading_index < 0 .15f && snr_db >= 15 .0f ) return CodeRate::R2_3;
5454
5555 // Good-to-moderate fading: R1/2 at SNR >= 15
5656 if (fading_index < 1 .10f && snr_db >= 15 .0f ) return CodeRate::R1_2;
@@ -71,11 +71,9 @@ inline CodeRate capInitialOFDMRate(float snr_db, float fading_index, CodeRate ca
7171 }
7272
7373 if (candidate == CodeRate::R2_3) {
74- // Conservative bootstrap: cap to R1/2 on moderate+ fading or low SNR.
75- // R2/3 verified at SNR=15 good fading (10/10 seeds PASS, avg 1.5 retx).
76- // Good fading measures ~0.49-0.62, so use 0.60 as bootstrap gate
77- // (slightly below steady-state 0.65 for margin on first post-connect frame).
78- if (fading_index >= 0 .60f || snr_db < 15 .0f ) {
74+ // R2/3 is now AWGN-only (fading < 0.15). At bootstrap, chirp-era fading
75+ // can read slightly high, so cap to R1/2 if any fading detected.
76+ if (fading_index >= 0 .10f || snr_db < 15 .0f ) {
7977 return CodeRate::R1_2;
8078 }
8179 }
0 commit comments