Skip to content

Commit 0586d66

Browse files
secupclaude
andcommitted
Demote R2/3 to AWGN-only in rate selection ladder
10KB file transfer testing with 802.11n LDPC shows R2/3 and R1/2 give nearly identical throughput on good fading (1485 vs 1418 bps), but R1/2 has half the retransmissions (14% vs 33%). R2/3's higher payload per frame is negated by its higher frame loss rate. New ladder: - R3/4: AWGN + SNR >= 20 (unchanged) - R2/3: near-AWGN (fading < 0.15) + SNR >= 15 (was: good fading < 0.65) - R1/2: good/moderate fading (< 1.10) + SNR >= 15 - R1/4: everything else Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 882b0c2 commit 0586d66

File tree

2 files changed

+20
-22
lines changed

2 files changed

+20
-22
lines changed

CLAUDE.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,11 @@
139139
- OTFS: EXPERIMENTAL - See OTFS Status section below
140140
- cli_simulator: FULLY WORKING - all phases pass on AWGN and fading
141141

142-
**Auto rate selection ladder (2026-03-15, updated with CPE for differential):**
142+
**Auto rate selection ladder (2026-03-15, updated with 802.11n LDPC):**
143143
| Condition | Auto rate | Payload/frame | Throughput |
144144
|-----------|-----------|---------------|------------|
145145
| SNR >= 20, AWGN (fading < 0.15) | **R3/4** | 243 bytes | ~3900 bps |
146-
| SNR >= 15, good fading (< 0.65) | **R2/3** | 197 bytes | ~3200 bps |
146+
| SNR >= 15, near-AWGN (fading < 0.15) | **R2/3** | 197 bytes | ~3200 bps |
147147
| SNR >= 15, good/moderate fading (< 1.10) | **R1/2** | 141 bytes | ~2300 bps |
148148
| Everything else | **R1/4** | 62 bytes | ~1150 bps |
149149

src/protocol/waveform_selection.hpp

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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
4748
inline 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

Comments
 (0)