A thirteen-week track, plus one applied lab, that builds Wi-Fi Channel State Information sensing from a single rotating arrow up to a people count with an interval. Every lecture is self-contained. A scenario is introduced on its own terms ("two receivers with two antennas each, 5 GHz, an office, one person walking") and never by pointing at a measurement campaign, a session or a proposal. The Slidev deck is the primary material, and each core concept in it is a live widget the student moves, reads and then breaks. The throughline: a number on a slide is a number the student reproduces by moving a control or running one workbook cell.
The 13-week arc
5 of 13 lectures published — each a self-contained read with a slide deck and runnable workbook. Start at the first published week and work forward.
| Wk | Theme & focus | Read |
|---|---|---|
| 01 | The wireless channel start here How a signal becomes a channel before any CSI: a wave as a rotating arrow, multipath as a sum of arrows, Fresnel zones around a link, Rayleigh and Rician fading, coherence time, and what changes between 2.4, 5 and 6 GHz. Widgets: PhasorSum (drag each path arrow and watch the sum), FresnelWalker (drag a person across the ellipses and watch per-tone amplitude and phase), FadingDice (the K-factor shapes the envelope histogram), CoherenceClock (walking speed and band set the coherence time). Break it: park the walker on a zone boundary and the amplitude swing vanishes. | read → slides · workbook |
| 02 | From OFDM to CSI Tones, the per-tone channel H[k], CFR and CIR as a DFT pair, bandwidth as delay resolution, and vendor tone layouts: an Intel AX210 reports 52 (legacy), 56 (HT20) or 242 (HE20) used tones on 312.5 or 78.125 kHz spacing, an ESP32-C5 reports a 53-entry legacy L-LTF block whose array starts at DC. Widgets: ToneComb (add subcarriers into one OFDM symbol), VendorToneMap (pick a device and PHY; array index, subcarrier and frequency light up together), CfrCirLab (bandwidth and window set the delay bins), IqInspector (one coefficient as a point, a length and an angle). Break it: plot the ESP32-C5 buffer in array order and watch a false band edge appear. | read → slides · workbook |
| 03 | Capturing CSI: records and bytes From radio to file: toolchains as workflows, what one record holds (header, chains, tones, two clocks, per-chain RSSI), chain-major and imaginary-first storage, the record classes an ambient channel delivers (CCK frames carry no CSI; legacy, HT, VHT and HE frames carry different grids), all-zero records, and the causality test that verifies a parse. Widgets: RecordByteWalker (step a pointer through the bytes of one synthetic record), RecordClassCensus (the class mix of a busy and a quiet channel), ParseCausality. Break it: swap I and Q; amplitude is unchanged and the impulse response runs backwards. | read → workbook |
| 04 | Sounding the channel: rate, airtime and 802.11bf Who transmits the frames you measure, and how often: packet rate as a Nyquist ceiling on motion (v_max = λ·PRR/4), delivered against commanded rate, injection against ambient traffic, CSMA deferral and dead slots, channel load against band, the 6 GHz band as bursty management traffic, and the 802.11bf sensing session that schedules sounding and prices the report. Widgets: DopplerAliaser (walker speed, band and packet rate; the torso line folds back past Nyquist), ArrivalProcess (a paced injector against bursty ambient air; slot occupancy and gap histogram), SensingSessionStepper (step setup, sounding, reporting and termination), ReportCost (tone grouping and bit depth against error and bytes). Break it: lower the rate until a walking person reads as standing still. | read → workbook |
| 05 | Preprocessing Why raw CSI lies, and the ladder that makes it usable: per-packet phase offset and slope, AGC-relative amplitude, the two-chain CSI ratio that cancels both (so two active receive chains are a capture requirement), window then threshold in the delay domain, and scoping every statistic to one record class and one transmitter. Widgets: PhaseCorruptor (add a common offset and a timing slope; the raw cloud fills the circle, the ratio stays tight), AgcDiary (the mean level follows the gain, the ratio does not), ChainDrop (switch one chain off and the ratio is undefined), DelayWindow (rectangular against Hann, tap census at −20 dB), ClassPooling (pool two record classes; a phantom band edge and a bimodal RSSI appear). | read → slides · workbook |
| 06 | Features and motion statistics From a sanitised series to features: Doppler spectrograms and the window trade-off (Δf = 1/T), Lomb–Scargle for uneven arrivals, envelope spread against level, how independent the tone groups are and what a wider channel adds, and which features survive a change of hardware. Widgets: SpectrogramWindow, UnevenSampler, ToneGroupCorrelation. | planned |
| 07 | Occupancy and counting The count-variance law from a sum of random phasors and why it saturates, a count reported as a distribution with an interval instead of a point, the resolution ladder, and the hour-of-day clock as the baseline every counter must beat. Widgets: CrowdPhasors, CountPosterior, ClockBaseline. | planned |
| 08 | Activity and gesture recognition Windowing and temporal models, velocity profiles assembled from Doppler across links, and where occupancy methods break. Widgets: WindowedClassifier, VelocityProfile. | planned |
| 09 | Localisation from CSI Geometry (Fresnel zones, angle, delay) against fingerprints, the limits of each indoors, and why a Bluetooth RSSI position misses by metres. Widgets: FresnelLocaliser, FingerprintDecay, RssiTrilateration. | planned |
| 10 | Drift as state jumps A quiet channel is not a slow ramp: quasi-static plateaus, discrete jumps, mean-reverting wander that saturates within hours, whitening before a change detector, and a magnitude gate before recalibration. Widgets: PlateauJumpGenerator, VariogramLag, WhitenedCusum. Break it: run CUSUM on the unwhitened series and count the false alarms on an empty night. | planned |
| 11 | Calibration: the open problem Mapping readings to people and keeping the map true: Bluetooth as a weak teacher (address counts are not heads, static public addresses are background), refitting the slope and not only the level, a staleness switch between modalities, re-identifying the reading-to-count map instead of resetting the state, and partial pooling across rooms. Widgets: WeakTeacher, StalenessSwitch, ShrinkageAcrossRooms. | planned |
| 12 | Reproducibility and dataset hygiene Firmware, delivered rate, record class and illumination logged as data; temporal splits; delivered rate as a covariate; stating whether a number is measured, observed or a pilot. Widgets: LeakageSplit, ConfounderTable. | planned |
| 13 | Capstone Design and run a reproducible CSI occupancy study end to end, defended with one interactive widget of your own. | planned |
Capstone
Week 13 is a self-directed study: pick a room, a piece of commodity hardware and a question; produce a notebook that someone else can re-run and one interactive widget that defends the result honestly, including what drifted, which rate was delivered and which record class was measured.