Asking the fleet what it is doing…
monad-knowledge Wi-Fi sensing lab · FIIT STU
Campaign

exp-csi-calibration — fit the CSI impairment profile from a month of empty room

c-csi-impairment-fit · exp-csi-static

Archive snapshot, as of 17 h ago — the run corpus is rebuilt once a day, so this page is not a live reading. The fleet panel is the live one; it refreshes every 30 s.

Sessions

state
Session State Runs Synthesis Criticism Figures Verdict
RZ4N272W 2026-08-28T16:33 finished 16 2 POSITIVE and consequential. Three of six impairment terms are identifiable on a single link and ALL THREE land outside the shipped prior: cfo_hz 62,258 Hz [60,970, 63,545] against a prior of 0.0 (11.9 ppm at 5240 MHz — a real oscillator), sto_samples 6.74 [6.35, 7.21] against 0.5, snr_db 8.57 [7.43, 9.61] against 30.0. At the measured profile the occupancy signature collapses: residual_occupancy_snr_db falls from +20.83 dB (prior) to -0.60 dB (fitted), attenuation retains 44.0% of the clean oracle against 60.5% at the prior (paired diff -4.07 dB, CI [-4.86, -3.36], 8 seeds), and the Rician-K slope SIGN-FLIPS in BOTH arms (+3.88 clean to -3.74 prior / -2.83 fitted). The three I/Q and phase-noise terms are channel-confounded on a single link and are reported as upper bounds, never scored against the prior.

Brief

Question

The simulator's measurement model is a literature prior that its own docstring flags as unproven. What is it actually, on our NIC? And does the occupancy signal the whole in-silico programme rests on survive at the measured value?

exp_csi_static/schema.py:131, unchanged since IP-101:

Parameters are a prior grounded in the commodity-NIC literature (Atheros / Intel CSI-tool conventions); they are flagged unproven until the first exp-csi-calibration session checks them against real capture.

exp-csi-calibration was never written, because it needed a real capture. This is that session, eighteen months of proposal text later.

What we already know

  • The corpus exists. EXP-F2: 86 sessions, 2,641,389,896 declared records, 2026-07-27 → 2026-08-28, ten AX210/Pi5 nodes, useful_yield 0.927–0.976. The room was empty or near-empty for the whole window, which is exactly the condition an impairment fit wants.
  • The impairment grid already found the cliff. IP-101's sweep established that mild NIC impairments halve the occupancy attenuation signature and sign-flip the Rician-K slope. So the fitted operating point is not a cosmetic detail. It decides whether the published in-silico occupancy numbers describe a regime the hardware is in.
  • The lake is the wrong instrument for this. Its packets table carries chain_amp_rms, ratio_amp_db, ratio_phase_rad. The last two are inter-chain ratios inside one NIC, so a common CFO cancels exactly. The one column that looks like phase is the one where the parameter of interest is invisible. Read the csiq containers through the csi package.
  • The lake cannot tell you which container to read. Measured today: 985 of EXP-F2's 1,027 segments have csiq_form NULL and 402 have derived_from NULL, while S3 holds 2,626 re-derived containers. lake sync is incremental and skips segments it already holds, so those columns were never backfilled. A null is not a zero. Resolve the container per segment against the bucket, or the fit runs on superseded envelopes and nothing errors.
  • n_bits is not a fit. The container format states it. Fitting a known constant is a way to produce a confident wrong answer.

What the supervisor should plan

Step 0 — establish the corpus and the spread. lake sync --apply first: 63 sealed segments are not ingested, 593 await decode, and 1,232 were decoded from original containers although re-derived ones exist. Then measure the between-host spread of at least snr_db on a small subsample, and power-size the rest against it. pilot_sigma is deliberately null in this brief.

Step 1 — per-host estimation. One estimator per parameter, each with a stated identifiability condition:

Parameter Read from Fails when
snr_db per-link amplitude variance against RSSI AGC changes mid-session
cfo_hz packet-to-packet common phase rotation across tones the chain-ratio path is used by mistake
sto_samples linear phase-ramp slope across subcarriers the tone grid is grouped and index-only
iq_amp_imbalance_db / iq_phase_imbalance_deg mirror-tone conjugate correlation 802.11 nulls the FFT centre, so the mirror pairing must respect the used-tone set
phase_noise_deg_rms residual per-tone phase RMS after CFO and STO removal CFO and STO were not removed first

Scope every estimate to one record class. session_classes gives the shape — legacy_ofdm 52×2, ht 56×4, he 242×2 at 78.125 kHz spacing — and pooling classes mixes two different tone grids.

Step 2 — the decisive comparison. Re-run exp-csi-static on one fixed scene under the shipped prior and under the fitted profile, and report the paired per-link difference in occupancy attenuation signature with a CI. This is the primary. The seven parameter values are the method.

Step 3 — the honesty pass. List the in-silico occupancy results whose impairment setting now sits outside the measured region. If the list is empty, say so — that is the good outcome and it is worth as much as the bad one.

Out of scope

  • Fitting the diffuse term. OccupancyDiffuse.from_real_anchor wants labelled (count, Rician-K) pairs, and the fleet has no labelled occupancy. Named in the card, deliberately not attempted here.
  • Thermal drift. ImpairmentProfile has no thermal term. That the fleet's phase drift is temperature-ordered is a measured fact and a model gap, not a parameter to fit into a model that cannot hold it. It belongs in a proposal, not this session.
  • Anything about delivery, contention or channel loading. Sionna RT has no MAC.