Asking the fleet what it is doing…
monad-knowledge Wi-Fi sensing lab · FIIT STU
running csi-body-em-fidelity simulation simulation

Body-as-scatterer EM fidelity — what the dielectric cylinder hides (ray-traced)

In plain words

Is a person modelled as a water-filled cylinder with one loss number good enough for the radio simulation?

transmitter receiver one cylinder, one loss number dimmed by the body
The simulator models every person as a water-filled cylinder plus one number for how much signal a body swallows. The design sweeps that loss and the cylinder's radius across bands to find what the simple shape hides. Schematic of the design, not a measurement.
Why it matters
Every simulated result puts people in the room as that simple shape. If the shape hides something, so do the results.
How it is done
A 36-cell ray-traced grid: four loss values, three body radii, three bands, six people, one seed, on a synthetic corridor.
Where it stands
Measured in simulation, all four criteria met: the average attenuation barely moves across loss and radius (2.25 dB) while the spread across placements moves 14.85 dB, so the average cannot identify the body model but the distribution can. Band alone shifts blockage by 10.13 dB.

Asks, formallyA single homogeneous dielectric cylinder + one calibrated per-body loss is an adequate scatterer primitive for amplitude-bundle statistics IF the per-body loss and radius are jointly identifiable from the attenuation *distribution* (not the mean), and if the linear-additive blockage law only breaks at high co-linear occupancy. A body-parameter sweep makes the loss×radius confounding and the additive↔shadowing divergence visible before any phantom is built.

Found36-cell ray-traced grid (4 loss x 3 radius x 3 band, n_agents=6, seed 0), all 4 criteria met: grid-mean attenuation moves only 2.25 dB across loss x radius while per-placement spread moves 14.85 dB (the mean under-determines the body model; the distribution separates loss from radius), and mean blo…

StandingCollecting data now

RoomSynthetic lab floor `test-lab-synth-floor-0`, link layout `csi-synth-corridor-link` (1 Tx, 3 Rx). CPU/LLVM Sionna RT on the M1.

The room

test-lab-synth · test-lab-synth-floor-0 · 8 devices

The floor this experiment runs on — its rooms, walls, furniture and the highlighted sensors placed for it. This is the surveyed layout as last exported; a run's replay below shows the geometry as it was simulated.

Executive summary

We model every human as a water-filled plastic pipe — a homogeneous dielectric cylinder — plus one calibrated "loss" number that says how much signal a body swallows when it stands between transmitter and receiver. Cheap and tunable, but is it enough? This experiment ray-traced a 36-cell grid (4 loss values × 3 body radii × 3 Wi-Fi bands) on a synthetic corridor and asked what the pipe hides.

The honest headline: all four success criteria passed. Two facts carry the result. (1) Averaging over placements, the mean attenuation barely moves across the whole loss×radius grid — only 2.25 dB — while the spread of attenuation across placements moves 14.85 dB, roughly 6–7× more. So a dataset of average signals cannot tell the body's loss apart from its radius; only the distribution can. (2) The mean blockage shifts 10.13 dB across 2.4 → 5 → 6 GHz at fixed geometry, so a model calibrated at one band is simply wrong at another. Conclusion: the cylinder + one calibrated loss is adequate for amplitude-bundle statistics, provided the calibration is fit against the attenuation distribution (not the mean) and re-fit per band — no leftover structure demanded a fancier body (an elliptical cross-section or a two-layer shell).

Two caveats hold this to earth. First, everything here is synthetic — a corridor we built, a body-loss law we hand-wired, a single random seed, 32 placements per cell. This bounds a prior; it does not measure a real body. Second, and honestly: we had to add the per-body loss ourselves (the ray tracer does not transmit through solid bodies), so "the scalar absorbs the variation" is partly a statement about a knob we designed to be well-behaved. The real test is a measured Wi-Fi/BLE capture (IP-106).

The problem, in plain words

A Wi-Fi crowd-counter works because bodies block and scatter radio waves: more people between the antennas, weaker and more-jittery the signal. To simulate that, you need a stand-in for a person that a ray tracer can bounce waves off. The cheapest useful stand-in is a cylinder of water-like material — human tissue is mostly water, and water is what makes bodies opaque to Wi-Fi. But a real torso does two things at once: it shadows the direct line (blocks it) and it absorbs energy passing through it. Our ray tracer (hoydis2023 ) reflects and diffracts off the closed cylinder but does not transmit through it, so the through-body absorption a real chest adds is missing. We supply it with one scalar knob, body_loss_db: each blocked line loses a fixed number of decibels.

That raises three fair questions, and this experiment is exactly those three:

  1. Can you tell the loss from the size? A fatter body blocks more lines and our loss knob makes each blocked line dimmer. If both make the signal weaker, are they even separately measurable — or hopelessly tangled?
  2. Does the choice of Wi-Fi band matter? Radio wavelength changes with band, and so does the size of the "danger zone" (Fresnel zone) a body has to enter to block a link (wu2022 ).
  3. Is one cylinder + one number enough, or does the leftover error force a fancier body? If a scalar loss cannot flatten the swept variation, the residual tells you the minimal next primitive.

What we are trying to prove

  • Hypothesis (falsifiable): loss and radius are jointly identifiable only from the attenuation distribution, not the mean — i.e. the grid-mean attenuation stays near-flat along a loss×radius iso-contour while the per-placement spread separates the two parameters. And a single calibrated scalar loss, fit against that distribution and re-fit per band, absorbs the swept variation with no structured residual.
  • What a null looks like: if the mean attenuation did move as much as the spread, you could fit the body from average curves and the "fit on distributions" thesis collapses (a simpler, cheaper calibration would suffice). If a structured residual survived the scalar — say, a systematic error that grows with body size or bends per band — then the cylinder is not enough and the finding names the next primitive (elliptical cross-section, two-layer skin/tissue shell). Either outcome is a fidelity finding, not a bug.
  • The scepticism, stated up front: because we wired the per-body-loss law, a clean "the scalar absorbs it" result is partly self-fulfilling. The claim that survives is the information-geometry one — mean-blind, distribution-identifiable, band-dependent — which does not depend on the exact loss law we chose.

How the experiment works (plain method)

  1. Fix the crowd, sweep the body. Occupancy is held at n_agents=6 on the synthetic corridor csi-synth-corridor-link (1 Tx, 3 Rx). Only the body model and the radio band vary.
  2. The 36-cell grid: body_loss_db ∈ {2, 5, 10, 20} × body_radius_m ∈ {0.15, 0.20, 0.30} × carrier_freq_hz ∈ {2.4, 5, 6} GHz. Each cell is ray-traced over 32 random placements × 3 links = 96 attenuation rows, enough to sample the distribution of attenuation, not just its mean. (The brief's design-max was 64 placements; the recorded session ran 32 per its staged tractable-pass config.)
  3. One knob, honestly bolted on. For each blocked link the scalar loss is applied as excess attenuation, h[link] *= 10^(-(n_occluders · body_loss_db)/20). The ray tracer owns geometry and multipath; the scalar supplies the through-body absorption Sionna cannot ray-trace.
  4. Reduce across the grid. csi_body_em_sensitivity.py pools the 36 cells into (a) the loss×radius confounding map — grid-mean vs per-placement spread — and (b) the per-band curves, emitting a metrics.json and one figure.

What we've found so far (honest)

The recorded run is campaign c-csi-body-em-fidelity, session 01KTGKKQR4KPCGFAGPFFJDRR9H — a real, complete 36/36-run session (9-minute wall clock, sequential), not a phantom: every cell has a scalar floor + links.parquet in S3 (e.g. sim://run/01KTGQEBC0KF5JM6J3V3TER52C/artefact/links.parquet), and the reduction produced a real figure now in the vault. All four criteria resolved true.

The three swept knobs then behaved distinctly (numbers from body_em_grid.csv, verified):

What we swept What moved Reading
body_loss_db 2 → 20 (radius 0.20 m, 2.4 GHz) mean |H| −55.6 → −56.4 dB; spread 27.4 → 29.2 dB (both monotone) Loss is now a live axis — but its effect is modest at n_agents=6 because occluder rates are low, so the per-occluder loss averages out.
body_radius_m 0.15/0.20 → 0.30 spread jumps to ≈ 41–42 dB vs ≈ 27–29 dB Radius is the dominant spread driver; it sets the occluder count that the loss scales, so the two are genuinely confounded.
band 2.4 → 5 → 6 GHz grid-mean mean |H| shifts 10.13 dB Per-band calibration is not optional (criterion 3).

The load-bearing pair, grid-wide: across the whole loss×radius grid the mean-range is 2.25 dB while the spread-range is 14.85 dB at 2.4 GHz (12.7–14.9 dB across all bands). The distribution carries ~6–7× more information than the mean about the body model. That is the criterion-2 result, and it is the one that survives even the "we wrote the loss law" objection: an averaged dataset is structurally blind here.

Closure verdict (sober): within this corpus a single calibrated scalar absorbs the swept variation of the bundle mean, provided it is (a) fit against the attenuation distribution, not the mean, and (b) re-fit per band. No structured residual demanded an elliptical or two-layer body. IP-094 Q5 (cylinder + calibrated loss) is vindicated for bundle statistics — as a prior, on a synthetic scene, at low occupancy, on one seed. A blockage-heavy geometry/occupancy would amplify the loss axis and is the natural next stress.

How to read the figure

fig_csi_body_loss_radius_confounding.png

  • The heatmap is mean attenuation over the loss (rows) × radius (columns) grid: look at how little the colour changes down a column (loss) versus how the spread overlay grows toward the wide-radius column — that visual near-invariance of the mean beside a moving spread is the identifiability story.
  • The per-band small-multiples are the attenuation curves at 2.4 / 5 / 6 GHz: the ~10 dB vertical offset between panels is the Fresnel/permittivity band shift, not noise.
  • Do not over-read individual cells: each is 96 rows on one seed. Read the ranges (2.25 dB mean vs 14.85 dB spread), which is what the reduction reports, not any single number.

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

  • rampa2022 — analytic EM models for bodies as scatterers; the fidelity bar this cylinder primitive is judged against.
  • depatla2018 — the body-blockage counting model where the distribution of link losses, not the mean, carries the person count; grounds criterion 2.
  • wu2022 , wang2015 — Fresnel-zone physics behind the per-band shift.
  • hoydis2023 — the differentiable ray tracer used; its no-transmission body is why the scalar loss exists.
  • zhang2024 , zhu2024 — ray-tracing fidelity must be validated against real captures; the red-team's demand.
  • sun2026 , cimdins2023 — where lumped-scalar body models fray in clutter.
  • angelopoulos2025_8070 — the risk-controlled calibration bar the statistician invokes.
  • santos2024 , wang2025 — the deployment realities (environment dependence, sensor placement).
  • huang2025 , meneghello2023 — real-CSI anchors for the standing sim-to-real cross-check.
  • zhang2026 , guarino2026 — the reproducibility bar the software-engineer voice invokes.
Campaigns & sessions 1 campaign instantiating this experiment
Campaign Session State Runs Started Report
c-csi-body-em-fidelity planned

Provenance

Data origin
simulated
Domain
csi
Room layout
csi-synth-corridor-link

Data types

  • csi-amplitude
  • rician-k
  • per-link-summary