Executive summary
Wi-Fi crowd counting relies on motion: people moving stir the radio channel, and the wobble scales with how many are moving. But a seated, still crowd stops stirring — the temporal feature flatlines and the counter goes blind (a companion experiment measured the seated-window signal variance collapsing to near zero). This card asks a simple rescue question: in exactly that dead zone, can a second, cheap radio — a co-registered BLE / RSSI (Bluetooth signal-strength) channel solved from the same ray-traced scene — still tell you something about occupancy?
The headline, stated honestly: yes for presence, no for headcount. Across 30 simulated runs, the BLE anchor robustly separates an occupied room from an empty one — effect size d = 2.3 to 3.7, and still comfortably resolvable (d > 1) even when we inject 6 dB of measurement noise. But its response saturates after the first one or two occupants: going from 2 to 4 to 6 people barely moves the signal (d ≈ 0.4 to 0.8, per-seed rank-correlation as low as -0.09). So the anchor is a good occupancy switch and a poor people-counter. This is in-silico motivation for periodic BLE calibration — not proof. The BLE noise is a self-authored Gaussian, so no accuracy headline earned here is allowed to travel; the real gate is a multi-week hardware capture on two or more sites (IP-106).
The problem, in plain words
Think of counting people in a room by listening to how much the radio "shimmers." When people walk, they scatter the signal and the shimmer grows — that is how Wi-Fi crowd counting works, and it works because bodies in motion keep changing the channel. Now sit everyone down. The shimmer stops. The counter has nothing left to measure, even though the room is just as full. Device-free CSI counting is well studied (zhou2020 ↗; zou2018 ↗), and this static/seated blind spot is one of its known weak points.
The idea we test is to bolt on a second, unrelated radio that does not depend on motion. Bluetooth Low Energy beacons are cheap, everywhere, and a body standing between a beacon and a receiver simply blocks and weakens the signal — a static effect that survives even when nobody is moving. BLE has an independent track record as an occupancy and coarse-counting sensor (demrozi2021 ↗; longo2019; iannizzotto2022 ↗). The bet: where CSI's temporal feature starves, BLE's blockage feature still carries the signal — and because we solve both radios from one and the same simulated scene, any disagreement between them is a real physical fact, not a calibration mismatch.
What we are trying to prove
- Hypothesis (falsifiable): in the static/seated regime where the temporal CSI feature provably collapses, the co-registered BLE anchor still carries occupancy information — concretely, pooled mean RSSI should fall monotonically with the number of people N (Spearman rho(N, RSSI) <= -0.6 per seed), and a resolvable-step analysis should say how fine a headcount difference Delta-N is distinguishable given the event noise.
- What a null means: if RSSI stayed flat as the room filled, or fell only in a way that could not be told apart from noise, the anchor would add nothing in the CSI dead zone and the whole "BLE-anchored ground truth" premise would need to be rebuilt (e.g. by moving beacons next to occupant zones) before any hardware money is spent — a cheap, valuable negative.
- What the brief explicitly forbids: any BLE-vs-CSI accuracy contest. The BLE measurement noise is a self-authored
sigma = ble.noise_dbstanding in for real per-event fading and MAC jitter, so an accuracy claim against it would be circular by construction. The honest deliverable is a sensitivity table, not a MAE number.
How the experiment works (plain method)
- Take a real multiroom floor (
resplan-12439-floor-0) and, on a static through-wall rig (a still placement of bodies = a seated-crowd proxy), ray-trace the channel for N in {0, 2, 4, 6, 8, 12} people across three seeds. - From the same solved channel (one ray-tracing pass, no second solve), emit both outputs: the CSI (
links.parquet/csi.hdf5) and the co-registered BLE (ble_links.parquet, a ~2 MHz narrowband slice of the same channel plus a per-event Gaussian noise term). Co-registration is by construction — this is a design no measured dataset offers, which is the point and also the caveat. - For each run, pool the BLE advertising events per link, subtract the empty-room baseline per link (to remove the ~4 dB fixed path-loss offset between links), and measure how the resulting Delta-RSSI moves with N.
- Compute the honest deliverables: per-seed Spearman rho(N, Delta-RSSI), and an effect-size table d = |Delta mean| / SE that says which occupancy steps are resolvable — then repeat the presence step at higher injected noise (4.0 and 6.0 dB) to see how fast it degrades.
What we've found so far (honest)
One finished session, 30 runs, one figure, and a verdict that split the three success criteria clean down the middle — pass / fail / pass.
Criterion 1 — both channels from one channel solve — PASS. All 30 runs emitted links.parquet / csi.hdf5 and ble_links.parquet (5 receive links x 24 placement events) from the same solved channel with ble.enabled: true, every file read with no NaN/Inf. Co-registration by construction confirmed — the plumbing is sound (the kind of check the 2026-07-15 integrity audit found is often skipped elsewhere).
Criterion 2 — graded monotone RSSI, rho <= -0.6 per seed — FAIL (not uniformly). Baseline-normalised Spearman rho(N, Delta-RSSI) per seed at 2.0 dB noise: seed0 = -0.83, seed1 = -0.66, seed2 = -0.09. Two of three seeds clear the bar; seed2 is wrecked by a single low-N placement that dropped a body into a strong-blockage spot. But the deeper problem is the shape: not a clean graded slope, but an empty -> occupied step (Delta-RSSI approx -1 to -2 dB) followed by a saturated plateau — N=6 and N=12 land within ~0.2 dB of each other. The anchor does not encode graded count in this geometry.
Criterion 3 — resolvable-Delta-N sensitivity table + noise degradation — PASS (deliverable produced; honest reading). Effect size after event-averaging (M approx 120 events per level):
| comparison | d @ noise 2.0 dB | reading |
|---|---|---|
| empty -> occupied (0 -> any N) | 2.32 - 3.70 | presence strongly resolvable |
| within-occupied, Delta-N=2 (2->4, 4->6, 6->8) | 0.43 - 0.77 | graded count not resolvable |
| within-occupied, Delta-N=4-6 | 0.19 - 1.02 | marginal at best |
Presence survives noise: d(empty -> first occupants) = 2.32 @ 2.0 dB -> 1.81 @ 4.0 dB -> 1.54 @ 6.0 dB, staying above d = 1 even at 6 dB event noise. Meanwhile the pooled per-event spread is ~6-12 dB and is dominated by cross-link and placement variability, not the injected measurement noise — that spread is the budget any finer occupancy term would have to clear, and it cannot.
Bottom line. The enabling premise holds in the honest, narrow sense: where temporal CSI starves, a co-registered BLE anchor still robustly says "the room is occupied." It does not deliver graded headcount here. This lands between the brief's "informative" and "needs rework" outcomes: informative for presence, needs beacon-placement-near-occupants or per-link calibration before it could support counting. Accordingly ble-ground-truth-sufficiency (H1) stays supported on literature weight — not bumped on this synthetic evidence, and ble-periodic-calibration (H2) stays plausible. (An earlier 14-run session, 01KT9E56..., was the plumbing shakedown; this 30-run session supersedes it.)
How to read the figure
fig_csi_ble_coregistration.png has two panels:
- Left — Delta-RSSI vs N. Baseline-subtracted mean signal drop on the y-axis, number of people on the x-axis, one trace per seed. The story is in the elbow: a clear drop from 0 to the first occupants, then a flat plateau. Read the shape, not the endpoints — a counter would need a steady downward ramp, and there isn't one. seed2's near-flat line is the placement-unlucky realization, not a bug.
- Right — per-event sigma. The ~6-12 dB spread of individual advertising events. This panel is the honest reality check: it shows the occupancy signal (a 1-2 dB step) sitting inside a much larger event-to-event scatter, which is why presence is resolvable only after averaging ~120 events and graded count is not resolvable at all.
Review panel
Each voice is a prepared expert with a one-line stance and the literature it argues from. Verdicts are about this experiment and its current evidence, not the idea in the abstract.
Key references
- zhou2020 ↗, zou2018 ↗ — device-free CSI counting and its static/seated blind spot, which motivates the anchor.
- depatla2018 ↗ — through-wall Wi-Fi counting; the geometry-diversity requirement the Field Scientist invokes.
- demrozi2021 ↗, longo2019, iannizzotto2022 ↗, billah2021 — BLE occupancy/counting, the second modality's real-world basis and its known saturation.
- rampa2022 ↗ — multi-body blockage physics; explains the plateau as expected, not a defect.
- bocus2022 ↗ — the real co-modal CSI + BLE/PWR anchor the Red-Team demands for cross-check; huang2025 — public real-CSI counting bar.
- zhang2026, guarino2026 ↗ — the reproducibility bar the SWE voice invokes.
- zhang2024, rusca2024 ↗ — privacy-preserving occupancy, the Ethics voice's basis.
- chaudhari2026 — occupancy-for-energy framing behind the Building-Systems voice.
- zhao2023 — learned RF synthesis, the adjacent approach to the ray-traced CSI/BLE used here.