Executive summary
Wi-Fi crowd- and motion-sensing works by watching how a walking person disturbs the radio channel. That disturbance shows up as a Doppler shift — a small frequency wobble whose size is set by how fast the person moves. But you can only see a wobble if you sample the channel fast enough: this is the same Nyquist rule that says a CD must sample audio at least twice per sound wave. If Wi-Fi packets arrive too slowly, a walking person's Doppler signature folds away into noise before any model runs — no amount of clever processing gets it back.
Week 3 of the WS501 course derived the exact bound. A packet stream sampling at rate PRR can represent Doppler shifts only up to f_max = PRR/2; the maximum Doppler for walking along the dominant reflection path is f_D = 2v/λ; equate them and you get a speed ceiling v_max = λ·PRR/4. At 5.32 GHz this puts a normal walk (~1.4 m/s) at exactly PRR = 100 Hz, and a 20 Hz passive trickle at 0.28 m/s. EXP-007 asks whether that clean textbook bound survives contact with physically-modelled multipath — where the real bistatic Doppler factor is cos α + cos β, not a clean 2 — and produces a citable "capture at ≥ X Hz" rule for the lab's carrier.
Honest status (updated 2026-08-16): the real-hardware leg has run; the simulation has not. On 2026-08-16 the fleet walked the commanded rate 5→100→5 Hz through ten five-minute steps in the empty library, under one continuous hour-long observer session on five nodes, and followed it with a twelve-hour 100 Hz overnight. What that settles is the transmitter: both 100 Hz steps put 30,008 frames on the air in five minutes — 100.03 Hz, zero skipped, zero errors — so the injector holds cadence at the rate the participant session needs.
What it does not yet settle is everything downstream. The sentinel-scoped per-step delivery and inter-arrival-CV curve — the actual deliverable of a rate ladder — has not been computed; the twelve-hour endurance verdict waits on the sealed sidecar; and the ray-traced PRR sweep that this card was written for remains entirely unrun, so the closed-form bound is still confirmed only in a synthetic workbook. Sessions are listed in Hardware Capture Ledger.
One consequence is already legible without any analysis: delivery ran 93–99 Hz against 100 commanded, because broadcast frames carry no ACK and no retry. A pre-registration gate written as "delivered ≥ 100 Hz" therefore cannot be satisfied by commanding 100 Hz — the ladder exists to say what to command instead.
The problem, in plain words
Think of a movie camera filming a spinning wagon wheel. If the camera's frame rate is too low, the wheel appears to spin slowly, stop, or even turn backwards — the famous "wagon-wheel effect." The wheel didn't change; the sampling was too slow to represent its true speed, so the fast motion got mistaken for a slow one. That misrepresentation is called aliasing, and it is not fixable in editing — the information is simply gone.
Wi-Fi motion sensing has exactly this camera. Each received packet is one "frame" of the radio channel. A person walking through the link imprints a Doppler frequency; capture packets fast enough and you see the true frequency, too slowly and it aliases down to a lower one — or vanishes into the clutter. The packet reception rate (PRR) is the frame rate. It matters enormously for the thesis because the deployable stance the lab favours is passive: instead of flooding the air with your own probe packets, you piggyback on whatever traffic the environment already produces (sharma2024_c8a2 ↗; koo2026_a08d ↗). Passive means you inherit whatever rate the environment gives you — sometimes a healthy hundreds-of-Hz, sometimes a 20 Hz trickle. If the true breakpoint sits well above 100 Hz, passive capture is unviable for motion and the thesis must say so; if it sits at or below the closed-form bound, the bound is a usable design rule.
No vault campaign has ever swept PRR as an independent variable, and capture-rate under-reporting is itself a documented reproducibility failure in the field (guarino2026_e72c ↗). This experiment is designed to fill that gap.
What we are trying to prove
- Hypothesis (falsifiable): the empirical PRR at which a downstream motion-detection metric collapses (e.g. AUC < 0.7) matches the closed-form floor
PRR_min = 4v/λwithin a stated tolerance, per speed and per carrier. Concretely: the measured/theoretical ratio is near 1. - What a null (or a large ratio) means: if the measured floor sits well above
4v/λ, the clean bound over-promises — real multipath and the bistatic geometry factor (cos α + cos β ≤ 2) demand a higher rate than theory says, and passive low-rate capture is quantifiably penalised. If the floor sits at or below the bound, the design rule holds and the lab can quote it. Either outcome is publishable; the experiment is built so it cannot merely confirm itself (see the guardrails). - The second, subtler claim: below the floor, walking Doppler energy should not just weaken but fold into the low-frequency band — the aliasing signature. Absence of that fold would mean the collapse is caused by something other than under-sampling (e.g. SNR), which would undermine the whole Nyquist framing.
How the experiment works (plain method)
- One high-rate master run per scene. Launch the coupled walk→CSI chain (sionna-csi-runner with the IP-110 Doppler-CFR upgrade; JuPedSim → emitter trajectory → ray-traced CSI, as in the c-multifloor / c-ip110-showcase lineage) at the highest feasible CSI frame rate. This is the "ground-truth" sampling.
- Decimate, don't re-simulate. Drop frames uniformly from that one physically-consistent master run to hit each target PRR — {1000, 500, 200, 100, 50, 20} Hz. Decimating a single run isolates PRR as the only varied factor: no re-simulation noise creeps in between rates.
- Per (PRR, carrier, speed): compute the Doppler spectrum (STFT over packets), read off the maximum recoverable Doppler and the aliasing onset, and run a downstream motion-detection metric (AUC/F1 of "is a person walking through this link right now?" vs the simulator's motion ground truth) using a deliberately dumb detector — a variance-of-Doppler-energy threshold — so the metric reflects the data's information content, not a tuned model's capacity.
- Locate the breakpoint — the PRR where the metric crosses the fixed degradation threshold — per speed and carrier, and compare it against
4v/λ. - Test the λ dependence: run both 2.4 GHz and 5.32 GHz, so the longer wavelength's higher ceiling-per-Hz is itself a prediction to confirm (~2.2× lower PRR floor at 2.4 GHz for the same speed).
Results (real-hardware leg, 2026-08-16)
Sessions in Hardware Capture Ledger under rate-ladder-sweep, illum-rate-*,
drift-overnight-100 and illum-overnight-100.
Settled — the transmitter. Ten five-minute steps walked the commanded rate
5 → 10 → 25 → 50 → 100 → 100 → 50 → 25 → 10 → 5 Hz under one continuous 60-minute
observer session on five nodes. Both 100 Hz steps put 30,008 frames on the air
in five minutes — 100.03 Hz, skipped 0, errors 0, in both sweep directions.
csid holds absolute-deadline cadence at the rate the participant session needs;
the pacer is not the bottleneck.
Settled — delivery loses to the air, and G1 cannot be met as written. During the twelve-hour 100 Hz overnight, steady-state delivery read 93–99 Hz across the five observers against 100 commanded. Broadcast frames carry no ACK and no retry, so 1–7 % is simply lost. A gate requiring a delivered-rate CI lower bound of ≥ 100 Hz is therefore unsatisfiable at a commanded 100 Hz — it has to be commanded higher, and the ladder is the measurement that says how much higher.
Not yet done. The sentinel-scoped per-step delivery and inter-arrival-CV curve — the actual deliverable — has not been computed. Neither has the endurance verdict on the overnight, nor the simulated PRR sweep this card was written for.
Room state during the 100 Hz overnight (checked in flight, 2026-08-16)
Two additional Wi-Fi transmitters appeared on ch11 between 11:30 and 14:00 UTC
(plus a second record class, 56t-ht, at 0.3% share). Before that, ten
consecutive 30-minute windows from 08:05 onward are 100% one class from one
transmitter. So the RF environment changed partway through a run whose value
depends on being quiet.
It does not follow that anybody moved, and the channel says nobody did.
- Doppler spectrograms of a quiet window (08:10–08:20) and a late one (14:10–14:20) are both flat noise with no coherent structure, rendered undecimated at ±49 Hz / ±3.0 m/s unambiguous, inter-arrival CV 0.28–0.37 so the axis is quantitative. Walking (~1.34 m/s) would be in range and is not there.
csi_motion, calibrating the late window against the quiet morning: 0 excursions past 4σ. Level-crossing rate is identical to three digits (19.11 → 19.12 Hz). Doppler-band energy fraction is elevated 0.0308 → 0.0368, which is 1.9σ — sub-threshold, and worth re-checking once the run seals.- Amplitude temporal CV does not step: across ten windows it wanders 0.0295–0.0395 with no trend, including in the definitely-quiet morning. An earlier reading of "+26% monotone rise" came from three points inside that band and was wrong.
There is no independent ground truth. drift-overnight-100 enables no BLE,
and the capture archive holds zero BLE artefacts, so nothing here can be checked
against occupancy. The most defensible statement is that two devices joined the
channel without producing a detectable perturbation on the monad01→monad06 link —
entirely consistent with a device outside that Fresnel corridor.
Consequence for the quiet-σ this run is meant to supply: none established. The channel statistics are stationary across the whole span measured so far, so the whole run remains usable as the quiet reference. If the sealed-session analysis finds the Doppler-fraction elevation persisting, restrict quiet-σ to before 11:30 UTC and say so.
Next — the ceiling probe (authored 2026-08-16, not yet run)
The ladder stopped at 100 Hz, so the pacer's ceiling is unmeasured, and the 2026-08-16 motion analysis hit a wall that more rate would move: the decorrelation-time statistic saturated, because the CSI-ratio envelope decorrelates within one sample at 100 Hz. It returned exactly 1/fs on both a quiet and a busy window, so the speed derived from it was the sampling floor rather than a channel property. At 608 Hz that floor drops from 10 ms to 1.6 ms, which is where a Clarke/Jakes fit can resolve a correlation time and return a speed instead of a yes/no.
Two profiles are authored in the inventory and deliberately not claimed above,
because a capture_profiles entry for an arm that has never run is a claim on
data that may never exist:
illum-rate-608— a 5-minute step, the ladder's missing top end. The gate issummary.inject.skipped: non-zero means the pacer could not hold 608 Hz and every delivery figure computed against it is wrong.illum-ceiling-608+ceiling-608— a 30-minute pair, promoted only if the step reports zero skipped.
Why 30 minutes and not a night. At 608 Hz a stream runs ~751 kB/s = 2.7 GB per node-hour. Five observers for 12 h is ~162 GB against 45 GB free per card — it would fill the cards in about 17 hours and outrun S3 sync long before that.
Claim these with experiment claim EXP-007 --profile ceiling-608 --from <date>
once they have actually run.
Results — the ceiling probe, answered (2026-08-23)
The section above says the ladder stopped at 100 Hz, so the pacer's ceiling was
unmeasured. lib-rate-ladder-48-2026-08-22-02 measured it. One hour, ch48/HT20,
monad09 injecting and eight nodes observing, five rate steps run up and back
down so any drift shows as an up-vs-down disagreement rather than hiding in a
monotonic trend.
The pacer holds, at every step, in both directions
| commanded | frames sent | achieved | fidelity | errors | skipped |
|---|---|---|---|---|---|
| 25 Hz | 7,504 / 7,503 | 25.01 / 24.93 Hz | 100.1% / 99.7% | 0 | 0 |
| 50 Hz | 15,005 / 15,006 | 50.02 / 50.02 Hz | 100.0% | 0 | 0 |
| 100 Hz | 30,010 / 30,010 | 100.03 Hz | 100.0% | 0 | 0 |
| 250 Hz | 75,026 / 75,025 | 250.09 / 249.25 Hz | 100.0% / 99.7% | 0 | 0 |
| 500 Hz | 150,051 / 150,053 | 500.17 / 498.51 Hz | 100.0% / 99.7% | 0 | 0 |
555,193 frames, 0 errors and 0 skipped across the whole hour. The gate this
card set for the ceiling probe was summary.inject.skipped, and it reads zero at
500 Hz — twenty times the rate at which the 2026-08-16 ladder stopped. The
transmitter is not the bottleneck, so every delivery figure below is computed
against a denominator the pacer actually produced.
Delivery is a receiver property, and it varies by node
Scoped to the injector's own source MAC (02:6d:6f:6e:01:09), from each
observer's timesync.rows:
| node | injector frames received | delivery | FTM paired | CSI yield |
|---|---|---|---|---|
| monad07 | 550,877 | 99.2% | 100.0% | 99.2% |
| monad03 | 544,636 | 98.1% | 100.0% | 99.1% |
| monad04 | 544,385 | 98.1% | 100.0% | 99.2% |
| monad05 | 541,316 | 97.5% | 100.0% | 99.8% |
| monad10 | 530,059 | 95.5% | 100.0% | 99.2% |
| monad02 | 524,362 | 94.4% | 100.0% | 99.2% |
| monad06 | 517,453 | 93.2% | 100.0% | 99.2% |
| monad01 | 507,286 | 91.4% | 100.0% | 99.2% |
Median 97.5%, range 91.4–99.2%, a 7.8 percentage-point spread across eight nodes hearing one transmitter in one room over one hour. FTM pairing is 100.0% everywhere, so the spread is reception, not timestamping.
The 500 Hz step specifically
The hour aggregate cannot be split by step from the sidecars alone, but the 500 Hz steps carry 300,104 of the 555,193 frames (54.1%), which bounds them. Assuming every slower step delivered perfectly — the most pessimistic split available — 500 Hz still delivered ≥ 84.0% on the worst node (monad01) and ≥ 98.6% on the best (monad07). A collapse at 500 Hz is arithmetically excluded.
What this settles, and what it does not
- Settled: the pacer reaches 500 Hz with zero skipped, so the ladder's missing
top end is measured and
illum-rate-608is the only remaining step. - Settled: the injector-side delivery deficit recorded on 2.4 GHz does not
appear here. That deficit is band-specific, which is consistent with 2.4 GHz
needing
inject_monitor_tx_rate = 16640to emit OFDM at all. - Not settled: per-step delivery. The numbers above are hour aggregates plus a bound. Splitting them needs the record timestamps, not the sidecar.
- Not settled: why monad01 hears 7.8 pp less than monad07. Position is the obvious candidate and it is not tested here.
Limits
- This is a delivery and pacing measurement, not the packet-rate floor. The
card's hypothesis is about the motion-detection breakpoint, and nothing here
touches it: the room was empty, so there is no motion to detect and no
downstream metric to collapse. The bound
v_max = λ·PRR/4remains confirmed only in a synthetic workbook. - Delivery figures are not yet sentinel-scoped. The 93–99 Hz range is the total record rate, every class and every transmitter. monad03 in particular saw non-injector traffic (spikes to 190–266 Hz), so its share of ambient must be subtracted before any per-node delivery claim.
- One channel, one band, one room. 2.4 GHz ch11 HT20 in the FIIT library. Step 5 of the plan below — the λ dependence across 2.4 and 5.32 GHz — is untouched.
- No repeat. One ladder, one night. The ascending/descending pair separates rate from thermal drift within this run and says nothing about run-to-run repeatability.
The plan (unexecuted — what a run must deliver)
This card has no results yet. A first execution must produce, at minimum:
- PRR swept over ≥5 rates on physically-consistent decimated runs, at ≥2 carriers and ≥3 speeds (slow ~0.7, normal ~1.4, brisk ~2.0 m/s).
- A located detection-vs-PRR breakpoint for each (carrier, speed) cell, with a confidence interval across scenes/seeds — a breakpoint without a spread is not a measurement.
- The empirical/theoretical ratio reported per cell with its tolerance.
- The aliasing-below-floor fold demonstrated directly in the Doppler spectra (the artefact W3 §5 predicts).
- A one-line, carrier-specific capture-rate design rule for the lab.
- An explicit statement that this is a simulator-internal validation of the sampling claim (which is geometry-agnostic), not a real-world sensing-accuracy claim. The real-hardware follow-on — FeitCSI on an Intel AX210 at configurable injection rate — is the external check and is a standing gate before any thesis claim leaves the simulator.
Review panel
Each voice is a prepared expert with a one-line stance and the literature it argues from. This card has no results, so the verdicts critique the design and flag what would make a first run trustworthy — not any measured number, because there is none.
Key references
- sharma2024_c8a2 ↗ — the low-rate passive regime this floor constrains; the reason PRR is not a free parameter in deployment.
- koo2026_a08d ↗ — energy/cost case for low-rate ambient capture; the deployment voice's basis.
- wang2015_48cf ↗ — the CSI-speed model tying Doppler shift to motion velocity; foundational to the whole
f_D = 2v/λframing. - wu2022_75d3 ↗ — Fresnel-zone geometry and the CSI-ratio trick for killing CFO phase before spectral estimation.
- alqaness2019_397d ↗ — the speed↔Doppler inversion the mathematician invokes for identifiability.
- cominelli2023_e6ee ↗ — measured commodity-CSI limits; the field/deployment reality check.
- vishwakarma2022_7143 ↗ — synthetic Doppler/HAR simulator; the red-team's evidence that sim Doppler over-cleans and needs a measured anchor.
- guarino2026_e72c ↗ — capture-parameter reporting as a reproducibility failure; the SWE and statistician's bar.
- zhang2026_ccac ↗ — the reproducible-wireless-sensing protocol to register the reduction against.
- huang2025_060d ↗, meneghello2023_0a93 ↗ — public real-CSI anchors for the red-team's decimate-real-data cross-check.