docs/research/sota-2026-05-22/R6-fresnel-forward-model.md
Status: working forward model + numpy demo · 2026-05-22
The entire wifi-densepose-signal DSP pipeline — vital_signs, multistatic, pose_tracker — operates on CSI windows whose physical meaning is taken for granted. We measure complex per-subcarrier amplitudes, treat them as input features, and learn classifiers. Nobody in the repo has written down the forward model: given a known scatterer position + size + reflectivity, what does the CSI look like?
Without a forward model:
This tick makes the forward model explicit. Self-contained numpy; no dependencies on the workspace.
For a Tx-Rx link of length L, the first Fresnel zone is the prolate ellipsoid where most of the diffracted RF energy travels. Its radius at fractional position p ∈ [0, 1] along the LOS is:
r_1(p) = sqrt(λ · L · p · (1 − p)) [metres]
A point scatterer at perpendicular offset x from the LOS, at link position d_1 from Tx (so d_2 = L − d_1 from Rx), introduces a path-length delta:
Δℓ(x) = sqrt(d_1² + x²) + sqrt(d_2² + x²) − (d_1 + d_2)
Phase shift on subcarrier k with centre frequency f_k:
φ_k = 2π · f_k · Δℓ / c
That's it. Six lines that the entire workspace's DSP secretly assumes.
examples/research-sota/r6_fresnel_zone.py runs four canonical scenarios and emits per-subcarrier phase predictions for 802.11n/ac 20 MHz channels (52 used subcarriers, 312.5 kHz spacing):
| Link length | 2.4 GHz @ midpoint | 5 GHz @ midpoint |
|---|---|---|
| 2 m | 25.0 cm | 17.3 cm |
| 5 m | 39.5 cm | 27.4 cm |
| 10 m | 55.9 cm | 38.7 cm |
These are measurable, physical envelopes: a 5 m WiFi link in a typical bedroom has a roughly 40 cm wide "channel of maximum sensitivity" centered on the LOS, narrowing toward each antenna. A human standing inside that ellipsoid moves the entire CSI vector; a human standing outside it perturbs only edge subcarriers.
| Scenario | Offset | Position | Zone @ 2.4 GHz | Phase spread |
|---|---|---|---|---|
| Human standing at midpoint | 10 cm | 2.5 m | zone-1 | 0.077° |
| Human walking into Fresnel | 25 cm | 2.5 m | zone-1 | 0.477° |
| Scatterer outside Fresnel | 1.5 m | 2.5 m | far-field | 15.9° |
| Scatterer near Tx | 5 cm | 0.5 m | zone-1 | 0.053° |
Key insight (concrete now): the phase spread across subcarriers grows monotonically with Δℓ, which grows quadratically with offset x. A scatterer in the far field (15.9° spread across 52 subcarriers) is the regime where multi-tap channel estimation works well. A scatterer inside the first Fresnel zone (<0.5° spread) is essentially uniform across subcarriers — which is why R5's saliency revealed band-spread top subcarriers (the scatterer effectively excites the whole band) rather than tight clusters.
This unifies R5 and R6: the saliency band-spread we measured experimentally is exactly what the Fresnel forward model predicts for inside-zone-1 occupancy.
| Existing module | What R6 gives it |
|---|---|
vital_signs (breathing/HR) | Predicts that chest-wall motion at ~1 cm amplitude inside zone-1 produces 0.01–0.05° phase change per breath — sets the floor SNR for HR detection |
multistatic.rs (attention-weighted fusion) | Provides ground-truth weights: scatterers in different Fresnel zones contribute different per-subcarrier phase signatures, so the attention weights have a closed-form prior |
tomography.rs (RF tomography) | Forward operator A in Ax = y was a black box; R6 makes A explicit (per-voxel position → per-subcarrier phase contribution) so the L1-ISTA inverse problem becomes properly conditioned |
pose_tracker.rs (17-keypoint Kalman) | The "sensitivity to limb position" prior is now derivable from the Fresnel geometry — distal limbs (hands, feet) often sit outside the first Fresnel zone for indoor links, explaining why they're harder to track than torso/head |
R12 (eigenshift) failed because the SVD spectrum is a 1-D summary that loses the spatial structure the Fresnel forward model preserves. The right revision is:
y_predicted = sum_voxels A(voxel) · reflectivity(voxel)
residual = y_observed − y_predicted
PABS = norm(residual) # the structure-detection signal
where A(voxel) is exactly the per-subcarrier phase prediction from R6. This is essentially RF tomography, but used as a structure-detection prior rather than as inverse reconstruction. PABS-over-Fresnel-grounded-basis is the right next step that R12 explicitly identified — R6 supplies the basis.
R10's range estimates used FSPL + ITU foliage attenuation. But foliage also blocks the first Fresnel zone, and an obstacle filling >60% of the zone produces diffraction loss that FSPL alone misses. For the 2.4 GHz / 100 m sparse case, the first Fresnel zone at midpoint is sqrt(0.125 · 100 · 0.5 · 0.5) = 1.77 m wide — large enough that a tree trunk in the middle of the link cuts deeply into it.
A more honest sparse-foliage range, accounting for partial zone obstruction: probably closer to 70 m than 100 m for canopies with ~1.5 m vertical clearance. Documented here as a known under-estimate of the range we should retract toward in any field deployment.
Δℓ here. The scalar version is the correct first-order approximation.(link length, frequency, scatterer position+size) we can predict the per-subcarrier signature analytically. Removes mystery from "why does this signal look like this?"phase_align.rs handles the calibration step.vital_signs heuristic.wifi-densepose-cli.