Logs in, root cause out.
An 802.11a-style OFDM test harness, and a model that triages its failures.
Pilot phase per symbol, two failing 16QAM packets
tc_00017 · EVM −10.41 dB, limit −16.0
- Injected
cfo_not_corrected- Slope, off-line wander
- 45.6°/sym, 3.8°
- Rules
cfo_not_corrected- Trees
cfo_not_corrected1.00
tc_00351 · EVM −12.42 dB, limit −16.0
- Injected
phase_noise- Slope, off-line wander
- −27.3°/sym, 32.4°
- Rules
cfo_not_corrected(wrong)- Trees
phase_noise1.00
Measured on a separate campaign
- Root cause named correctly by the trees
- 99.2%
- By hand-ordered rules on the same 17 features
- 84.9%
- Tests to a diagnosis, of a 48-test suite
- 2.2
- Unseen fault types flagged as new, ~5% false alarms
- 89.5%
1,554 single-cause failures from 4,000 cases, seed 1. Trained on 8,000 cases, seed 0.
Eight root causes, each with a signature in the log
| Root cause | Signature in the log | Rules | Trees |
|---|---|---|---|
low_snr | Error matches the LTF noise estimate | 75.1 | 99.8 |
cfo_not_corrected | Pilot phase ramps linearly | 90.1 | 100 |
stale_channel_estimate | Error follows an old channel’s fades | 90.1 | 99.6 |
timing_late | Impulse response wraps to negative delay | 97.1 | 98.6 |
pa_clipping | Outer points compressed, gain below 1 | 74.0 | 96.6 |
iq_imbalance | Error tracks the mirror subcarrier | 100 | 100 |
phase_noise | Pilot phase random-walks | 51.4 | 98.1 |
delay_spread_exceeds_cp | Impulse-response energy past the CP | 98.7 | 100 |
Recall, %. Ground truth is counterfactual: each failure is re-run on the same random streams with the fault removed.
A diagnosis in two tests, not 48
Run the test with the largest expected information gain, update the posterior over which bug, stop at 99%.
| Policy | Tests, mean / p90 | Diagnosis | Missed bug |
|---|---|---|---|
| Full suite | 48 / 48 | 97.1% | 3.3% |
| Random order | 3.9 / 7 | 96.9% | 3.7% |
| Information gain | 2.2 / 3 | 98.3% | 2.0% |
350 fresh builds. The full suite scores lower: 48 correlated results make the posterior overconfident.
Where it breaks
40% of failures still fail with the fault removed: the SNR was too low as well. The model never says both.
- Of those, given confidence of 0.9 or more
- 91%
- Caught by deferring the least-confident 10%
- 23%
- Clipping recall on 64QAM, held out of training
- 58%
Run it
33 tests, including simulated BER against the closed-form Gray QAM curves.
- Uncoded, single antenna, one packet; EVM is the only pass criterion.
- Textbook impairment models, not measured hardware.
git clone https://github.com/akshit9162/ofdm-phy-triage
cd ofdm-phy-triage
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python -m pytest -q
.venv/bin/python -m scripts.campaign 8000 runs/main 0
.venv/bin/python -m scripts.campaign 4000 runs/test 1
.venv/bin/python -m scripts.evaluate runs/main runs/test results