c-furniture-csi-observatory
The five beats
Literature grounding — the figure contract
Every panel is a documented WiFi-sensing convention, not an ad-hoc plot. Recipes (axes → preprocessing → what it reveals) were surveyed from the vault:
| Viewpoint | Recipe | Source |
|---|---|---|
| Amplitude heatmap | |H| dB, subcarrier×time ("CSI image") | ma2020_4782, cominelli2023_e6ee |
| Doppler spectrogram | fast-time burst FFT (Hamming), incoherent avg over subcarriers; v = f·λ | wang2015_48cf, li2022_4220 |
| CSI ratio | H_ant0/H_ant1 cancels CFO/SFO → phase-clean, no Fresnel blind spot | wu2022_75d3 |
| Receiver-geometry small-multiples | same event, LoS 180° / bistatic / NLoS side by side | bocus2022_ce7f, meneghello2023_0a93 |
| RSSI coverage map | received power over an Rx grid | zhang2024_df4a, sun2026_2f5e |
| Fresnel sensitivity map | sensitivity peaks mid-zone, blind spot at zone boundary | wu2022_75d3 |
| Multi-viewpoint necessity | single link collapses at Fresnel limits; distributed views recover it | xiong2025_e227 |
| Furniture ablation | furniture drives RSSI variance/multipath, not mean | zhang2024_df4a, chen2023_5cbd |
Novel gap-fill (per the survey): no vault paper plots measured empty-vs-furnished CSI as temporal variance / Doppler spread — WiSegRT did it only on static RSSI-standard-deviation-by-distance. This campaign produces that time-frequency ablation from the coupled sim, and overlays the sensing-coverage map on the crowd footfall — two figures the field currently lacks.
Design
- Fixed-AP sensing model. 1 infrastructure Tx (living-room ceiling, 2.4 m) +
9 Rx across the apartment (
csi-oracle-grid-resplan-2605: bedrooms, bathroom, kitchen, living), spanning LoS (living) to deep-NLoS (bedrooms through walls). No seated-emitter hook ⇒ noemitters.parquet⇒ the runner keeps the fixed Tx and the crowd + furniture are scatterers (links = 1×9 = 9 stable links). This is the WiFi-sensing paradigm and gives a clean coverage map + a stable per-link CSI-over-time series.num_rx_ant = 2unlocks the CSI-ratio. - Furniture as the coupling. The 27 door-aware boxes (active FURNITURE layer
computed-resplan-2605-floor-0, IP-113) are exported intofloor_geometry.jsonas walker obstacles (furniture-aware motion) AND injected intoscene.jsonas box scatterers viascene_overrides.furniture(obstacles are not auto-scatterers, so the list is required — the explicit furniture→CSI bridge). - Ablation = identical trajectory, toggle scatterers. The empty arm is
byte-identical except it drops
scene_overrides. Same floor + samescenario.seed⇒ identical crowd trajectory ⇒ the per-link CSI delta isolates furniture scattering alone (the WiSegRT control: same motion, furniture on/off). Both arms' walkers still navigate around furniture. - Physical Doppler.
doppler.mode: cfrsynthesises per-path Doppler from each body's velocity 3-vector overn_subfast-time sub-frames spanningwindow_s(fs = n_sub/window_s Hz) — a physically-correct, signed Doppler (commodity CSI is unsigned; cfr keeps the sign). - Crowd = 6 IP-107 personas (long-stay worker, study group, browser, two through-traffic flows, quick visitor) with staggered arrival windows so the live count ramps/drains — the CSI dynamics need a varying occupancy, not a static full room.
Navigability finding (honest)
The ideal CFSM hard-core radius 0.20 m fragments this furnished floor's
navigable core into 2 parts (a sub-0.40 m pinch created by the door-aware
furniture) — the walker turned all agents away (0 spawned). Dropping to
0.15 m (0.30 m diameter, the canonical floor-agnostic oracle-agendas /
c-furniture-walkability value, within the Seyfried FD-intercept range) keeps the
core connected so the crowd moves. Recorded as a real furnished-floor constraint,
not silently patched. The active furniture layer also has 0 occupiable seats
(the door-aware refurnish dropped them), so seat-targeting legs degrade to
nearest_free; agents still transit and dwell, which is what drives the CSI.
Method
# furnished + empty, seed 0, everything local (CPU Sionna)
sim run exp-csi-crowd --where local \
--config monad_knowledge/sim/exp_csi_crowd/config/csi-observatory-resplan2605.yaml \
--params scenario.duration_units=2000 trajectory_frame_stride=25 doppler.n_sub=10
sim run exp-csi-crowd --where local \
--config .../csi-observatory-resplan2605-empty.yaml --params (same)
# reduction (monad-free): coverage + movement + CSI-over-time + furniture ablation
python monad_knowledge/notebooks/python/csi_observatory.py \
--run <furnished-run-dir> --compare <empty-run-dir> --out <out>
Artefacts per run: csi.hdf5 (H[frame,link,rx_ant,tx_ant,subcarrier] complex),
links.parquet, trajectory.parquet, ble_links.parquet, inputs/scene.json.
Results
Three local coupled runs, seed 0, identical trajectory (23 agents, 36 ray-traced coarse frames × n_sub 10, 9 links × 2 Rx-ant, 2.4 GHz):
| Run | run_id | scatterers / geometry |
|---|---|---|
| empty (Rx 1.2 m) | 01KXGAR2ZCAJ0VDFM5ZY7K2TP6 |
0 |
| furnished, real height (Rx 1.2 m) | 01KXGAPE0TXYWY69QDMWYRK06F |
27 boxes, 0.45–2.0 m |
| furnished, tall 1.8 m (Rx 1.2 m) | 01KXGB5ZAMCYBC3RV7QP2XY3YF |
27 boxes forced to 1.8 m |
| empty, low Rx 0.6 m | 01KXGFQ1F1CS9GT1DJ1DPRAWSF |
0 (experiment …-2605-low) |
| furnished, real height, low Rx 0.6 m | 01KXGFNBW3P2J8DRTH6AJ0R6F6 |
27 boxes, 0.45–2.0 m |
Furniture ablation (real vs empty) — the null:
| Metric | Value | Reading |
|---|---|---|
| mean-|H| relative delta | 0.0008 | furniture does not move the mean |
| spectral-var ratio (furn/empty) | 1.00 | no extra frequency-selective fading |
| temporal-var ratio | 1.00 | temporal variance is crowd-dominated |
| deepest-null delta | 0.21 dB | negligible |
| max per-link mean RSSI delta | 0.08 dB | only link 2 (by the one 2.0 m wardrobe) |
Mechanism confirmed from BOTH directions (same 27 real footprints, same crowd):
| Condition | RMS |Δ|H|| vs empty | max per-link Δ |
|---|---|---|
| ceiling Tx + waist Rx (1.2 m), real furniture | 0.11 % | 0.08 dB (invisible) |
| ceiling Tx + waist Rx (1.2 m), furniture raised to 1.8 m | 10.44 % | 9.17 dB (Rx05) |
| ceiling Tx + floor Rx (0.6 m), real furniture | 10.06 % | 13.23 dB (Rx05) |
Either raising the furniture into the plane OR lowering the Rx into the clutter
makes the SAME real furniture jump ~100–165× in effect. At low Rx the ablation
also flips physically: mean-|H| relative delta 0.10 (furniture now moves the
mean) and deepest-null 3.46 dB deeper — the link finally intersects the clutter.
See fig_height_mechanism.png.
Coverage / sensing-sensitivity (H1): per-Rx mean RSSI −47 dB (Rx04, LoS) → −72 dB (Rx08, deep NLoS); the std_t(RSSI) sensing map inverts onto the NLoS links (Rx02 7.7, Rx07 6.2, Rx01 3.7 dB) — power and sensitivity live on different links.
Figures (from csi_observatory.py --run <furnished> --compare <empty>):
fig_coverage.png (RSSI + sensing + Fresnel/footfall), fig_csi_amplitude.png
(subcarrier×time, 9 Rx — body-blocking null stripes visible), fig_doppler.png
(cfr Doppler, LoS vs NLoS), fig_csi_ratio.png, fig_link_timeseries.png,
fig_furniture_ablation.png (spectral/temporal/mean decomposition),
fig_height_mechanism.png (the headline), anim_movement.gif, anim_csi.gif.
Limitations
- Synthetic, uncalibrated CSI. Ray-traced Sionna-RT, no Sionna-vs-measured
indoor validation exists (campaign-rigor-audit, sim-param-grounding-2026-07).
This is a mechanism/visualization instrument, not a fidelity claim. At
2.4 GHz Sionna neglects diffuse scattering (Rayleigh λ/8) — furniture internal
structure is exactly where that approximation bites (
zhang2024_df4a). - One floor, one arrangement, self-authored crowd. Not cross-floor, not a measured occupancy trace.
- Impairment-free (clean oracle H) — hardware CFO/phase-noise are an unvalidated IP-101 prior, left off here.
Changelog
- 2026-07-14 — Claude: campaign created; configs + monad-free reduction built and self-tested; local smoke validated the full coupled chain (fixed-Tx 9-link, furniture scatterers injected, cfr Doppler). Ran seed-0 empty / furnished(real) / furnished(tall 1.8 m) locally. Result: real furniture CSI-invisible (≤0.08 dB), tall furniture 9.2 dB / 10.4 % RMS — antenna-plane geometry gates furniture→CSI. H1 (LoS power vs NLoS sensing-sensitivity inversion) confirmed; naive H2 (furniture-driven temporal variance) refuted and re-explained (crowd-dominated temporal variance; furniture is a static below-plane multipath term here). The reduction's ablation metric was corrected mid-run from temporal→spectral/spatial variance after the temporal-var null exposed the wrong axis.
- 2026-07-14 — Claude: added the low-Rx arm (new PostGIS experiment
csi-oracle-grid-resplan-2605-low, Rx dropped 1.2 m→0.6 m into the clutter, Tx kept at ceiling). Real furniture goes from CSI-invisible (0.11 % RMS) to 10.1 % RMS / 13.2 dB — the antenna-plane mechanism confirmed from the second direction.