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

Packet-Rate Floor for Motion Sensing

In plain words

How many radio frames per second does a receiver need before a walking person stops being visible in the signal?

fast enough: every wobble is seen too slow: the same wobble folds away
A walking body wobbles the radio at a frequency set by its speed. Sampled often enough (top), the wobble is visible; sampled too slowly (bottom), the samples join into a line that never wobbled. The rule is two samples per cycle. Schematic of the design, not a measurement.
Why it matters
A walking body wobbles the radio at a frequency set by its speed. You can only see a wobble if you sample at least twice per cycle; below that, no clever processing brings the person back.
How it is done
One transmitter steps its rate 5, 10, 25, 50, 100 frames a second and back down while receivers listen for an hour, and the collapse point is compared with the textbook ceiling v_max = lambda x rate / 4.
Where it stands
Partly measured. The ladder ran on 2026-08-16 in the empty library (ten steps, five nodes, 559 thousand records) and the transmitter side is settled: both 100 Hz steps sent 30,008 frames. The ceiling probe was answered on 2026-08-23. The collapse of a walker's own signature is not yet measured, because every run so far was in an empty room.

Asks, formallyThe detectability of walking-speed motion in CSI collapses once the packet reception rate (PRR) falls below the Nyquist bound for that motion's Doppler shift; the empirical breakpoint in a downstream motion/occupancy-change metric matches the closed-form ceiling v_max = λ·PRR/4 (max Doppler f_D = 2v/λ, Nyquist f_max = PRR/2) within tolerance, and no preprocessing recovers motion sampled below it.

FoundPARTIALLY EXECUTED.

StandingThe data is in, the analysis is not

RoomTwo legs. REAL (executed 2026-08-16): monad01 injects at a commanded rate into the empty FIIT library, monad02–06 receive; 2.4 GHz ch11 HT20, sentinel ef:be:ad:de:ad:de. SIMULATED (not yet run): channel-simulator family (sionna-csi-runner / exp-csi-crowd), ray-traced CSI on a coupled walk scenario, reproducible offline.

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)

  1. 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.
  2. 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.
  3. 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.
  4. Locate the breakpoint — the PRR where the metric crosses the fixed degradation threshold — per speed and carrier, and compare it against 4v/λ.
  5. 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:

  1. illum-rate-608 — a 5-minute step, the ladder's missing top end. The gate is summary.inject.skipped: non-zero means the pacer could not hold 608 Hz and every delivery figure computed against it is wrong.
  2. 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-608 is 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 = 16640 to 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

  1. 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/4 remains confirmed only in a synthetic workbook.
  2. 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.
  3. 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.
  4. 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.