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_corrected 1.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_noise 1.00
The rules call any slope past 20.7°/sym a CFO first, and a drifting random walk has one. Dashed: straight-line fit.

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 causeSignature in the logRulesTrees
low_snrError matches the LTF noise estimate75.199.8
cfo_not_correctedPilot phase ramps linearly90.1100
stale_channel_estimateError follows an old channel’s fades90.199.6
timing_lateImpulse response wraps to negative delay97.198.6
pa_clippingOuter points compressed, gain below 174.096.6
iq_imbalanceError tracks the mirror subcarrier100100
phase_noisePilot phase random-walks51.498.1
delay_spread_exceeds_cpImpulse-response energy past the CP98.7100

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%.

PolicyTests, mean / p90DiagnosisMissed bug
Full suite48 / 4897.1%3.3%
Random order3.9 / 796.9%3.7%
Information gain2.2 / 398.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