"You installed me to move packets. I learned to read the rise and fall of your chest, the swing of your arms, the curve of your spine, from the way you bent the packets on their way past. Nobody signed a consent form for that."
An Eavesdropping AI Agent
Prerequisites
This section builds directly on the channel-state-information (CSI) representation of Section 47.1: a per-subcarrier complex gain \(H_{k}=|H_{k}|e^{j\angle H_{k}}\) whose amplitude and phase encode how a moving body reshapes the multipath field. It assumes the device-free activity pipeline of Section 47.2 as the coarse-grained sibling of the fine-grained pose and vital-sign tasks here. The vital-sign half leans on the spectral estimation vocabulary of Chapter 7 (band-pass filtering, periodograms) and the aliasing intuition of Chapter 3. The pose half reuses the teacher-student and cross-modal supervision ideas of Chapter 17.
From "someone is walking" to "here is the surface of their body, and they are breathing 14 times a minute"
Section 47.2 asked a categorical question: is a person present, and which of a handful of activities are they doing. This section asks two far harder, continuous questions from the same commodity Wi-Fi hardware. First, where is every part of the body in space: the 3D skeleton (WiPose) or even a dense per-pixel map of the body surface (DensePose-from-WiFi), recovered from nothing but the CSI captured on three transmit and three receive antennas. Second, what is the body doing internally: the millimetre chest motion of respiration and the sub-millimetre motion of the heartbeat, read off the CSI phase. Both push RF sensing from a crude motion detector toward a contactless camera-and-stethoscope, which is exactly why the same capability is thrilling for elder-care and alarming for privacy (Section 47.7). Understanding how a router recovers a pose it was never designed to see, and where the recovery breaks, is the goal of this section.
Why the body is legible in the channel at all
What makes pose and breathing recoverable is that a human body is a large, water-filled, moving reflector sitting inside the router's multipath field. Every limb adds a reflected path; every path has a length; every length sets a phase. Why tiny motions register is the wavelength: at 5 GHz, \(\lambda\approx 6\) cm, so a path-length change of a few centimetres rotates the CSI phase through a full \(2\pi\). Chest expansion during a breath moves the torso surface by roughly 4 to 12 mm, and the heartbeat by a few tenths of a millimetre; both are a measurable fraction of a wavelength and therefore a measurable phase swing. The Fresnel-zone model formalises this: as the body crosses successive elliptical zones whose foci are the transmit and receive antennas, the received signal traces out sinusoidal fringes, and the fringe rate encodes displacement. How pose differs from breathing is granularity. Breathing is one dominant periodic reflector, so a band-pass filter isolates it. Pose is a spatial configuration of dozens of reflectors, hopelessly entangled in the raw channel, which is why pose needs a learned inverse rather than a filter.
Amplitude carries "how much motion", phase carries "how far"
The single most useful split in Wi-Fi sensing: CSI amplitude is robust and easy but coarse, reacting to the presence and energy of motion; CSI phase is precise but poisoned by hardware. Raw phase from a commodity NIC is corrupted by carrier-frequency offset (CFO), sampling-frequency offset (SFO), and random packet detection delay, which add an unknown, time-varying linear ramp across subcarriers that can dwarf the millimetre signal you want. The universal fix is to subtract phase across a pair of receive antennas on the same NIC: they share the same oscillator, so the offsets cancel in the difference, leaving the true propagation phase. This conjugate-multiplication trick (\(H_{i}\overline{H_{j}}\)) is why almost every serious vital-sign paper uses antenna-pair phase rather than single-antenna phase, and it is the difference between a clean breathing sinusoid and noise.
WiPose and Person-in-WiFi: learning the skeleton
What WiPose (Jiang et al., MobiCom 2020) demonstrated is the first 3D human skeleton from commodity Wi-Fi CSI. How it works is a supervised cross-modal map: a synchronised motion-capture or depth camera provides ground-truth joint positions while the network sees only CSI, learning to regress the joints the camera reported. Architecturally it stacks a CNN spatial encoder over the CSI tensor with a recurrent temporal model (the recurrent and TCN toolkit of Chapter 14), and, crucially, ends in a forward-kinematics layer: instead of predicting 3D joint coordinates freely, it predicts joint rotations along a fixed skeleton and lets a differentiable kinematic chain place the joints. That constraint bakes in bone lengths, forbids anatomically impossible poses, and sharply improves generalisation, a recurring theme with the pose interfaces of Chapter 27. Person-in-WiFi (Wang et al., 2019) is the 2D cousin, regressing joint-confidence maps and body-segmentation masks in the image plane, again teacher-supervised by a camera.
DensePose-from-WiFi: a body surface from a router
What DensePose-from-WiFi (Geng, Huang, and De la Torre, 2022) pushes to is the DensePose target: a dense mapping from every body pixel to a canonical UV coordinate on the SMPL human surface, the same output an RGB DensePose network produces, but from CSI alone. Why it is a landmark is that it closes most of the gap to vision on a genuinely non-visual sensor. How it is built is a three-stage design. First, amplitude and phase tensors from the \(3\times3\) antenna links are fed through a small network that maps the CSI feature domain into a \(2\text{D}\) spatial feature map aligned with the image plane, effectively learning the sensor's forward model in reverse. Second, that feature map drives a DensePose-RCNN head (the same detection-plus-UV head used in the vision system). Third, and decisively, training uses a transfer-learning teacher: a pretrained image-based DensePose runs on a synchronised camera to produce pseudo-labels and intermediate features, and the Wi-Fi student is trained to match both the final UV output and the teacher's internal representations. Without that dense visual teacher the CSI-to-UV problem is too ill-posed to fit. The reported accuracy trails the RGB teacher and degrades on layouts and bodies unlike the training set, the robustness problem taken up in Section 47.6, but the surfaces are recognisably human.
Where the state of the art sits
As of the mid-2020s the fine-grained Wi-Fi perception frontier is defined by DensePose-from-WiFi (dense body surface), WiPose and its successors (3D skeleton), and, on the vital-sign side, phase-based respiration and heart-rate systems descended from MIT's RF-based work and commodity-CSI systems such as the Fresnel-model breathing trackers. The open problems are consistent: cross-environment and cross-subject generalisation (a model trained in one room collapses in another), multi-person separation (Section 47.4), and the reliance on a camera teacher for supervision, which self-supervised RF pretraining (Chapter 17) is beginning to relax. The parallel radar route to the same vital signs is developed in Chapter 44, and the clinical framing in Chapter 33.
Reading a breath off the phase
What vital-sign sensing recovers is respiration rate (typically 0.1 to 0.5 Hz, i.e. 6 to 30 breaths per minute) and heart rate (roughly 0.8 to 2 Hz) from the periodic phase modulation of a stationary subject. How the pipeline runs is: form antenna-pair conjugate phase to kill hardware offsets, select the subcarrier or Fresnel-sensitive component with the strongest periodic energy, band-pass to the physiological band, and estimate the dominant frequency with a periodogram or peak-tracking. When it fails is instructive: any gross body motion swamps the millimetre signal, so these systems assume a still subject (sleeping, seated), and heart rate is far harder than breathing because its displacement is an order of magnitude smaller and sits near respiration harmonics. The snippet below simulates a breathing-modulated CSI phase and recovers the rate.
import numpy as np
from scipy.signal import butter, filtfilt, periodogram
fs = 20.0 # CSI packet rate (Hz)
t = np.arange(0, 60, 1/fs) # one minute of packets
true_bpm = 15.0 # 15 breaths/min -> 0.25 Hz
# Simulated antenna-pair phase: breathing sinusoid + heartbeat + noise
resp = 0.9 * np.sin(2*np.pi*(true_bpm/60)*t)
heart = 0.1 * np.sin(2*np.pi*1.2*t) # ~72 bpm, much smaller
phase = resp + heart + 0.15*np.random.randn(t.size)
# Band-pass to the respiration band (0.1-0.5 Hz), then find the peak
b, a = butter(4, [0.1, 0.5], btype='band', fs=fs)
resp_clean = filtfilt(b, a, phase)
f, pxx = periodogram(resp_clean, fs=fs)
est_bpm = 60 * f[np.argmax(pxx)]
print(f"estimated respiration rate: {est_bpm:.1f} breaths/min")
Let SciPy own the filter and the spectrum
Written from scratch, a stable band-pass filter (bilinear-transformed Butterworth with zero-phase forward-backward application) plus a windowed periodogram is roughly 60 to 80 lines of numerically fussy code, and easy to get wrong at the band edges. scipy.signal.butter, filtfilt, and periodogram collapse it to the four lines above and handle the coefficient design, edge padding, and normalisation for you. Reserve hand-rolled DSP for the parts a library cannot know: the antenna-pair phase-offset cancellation and the subcarrier selection that are specific to CSI.
The care-home router that noticed a breath had stopped
A contactless monitoring pilot in an assisted-living facility repurposed the existing 5 GHz access points in residents' rooms as respiration sensors, with no wearable and no camera. Overnight, antenna-pair CSI phase was band-passed to the breathing band and a rate was logged every 30 seconds; a sustained drop in periodic energy raised a "no respiration detected" flag to the night staff. The system worked precisely because a sleeping resident is the ideal target: still torso, single person, consistent geometry. Its limits mapped exactly onto the theory. A resident who rolled over produced a motion transient that had to be gated out; two people in one bed broke the single-reflector assumption and demanded the separation methods of Section 47.4; and moving the bed shifted the Fresnel zones enough to force a recalibration. The clinical-validation and false-alarm discipline this deployment needed is the subject of Chapter 33.
Exercise: expose the heartbeat
Extend the code above to also estimate heart rate. (1) Design a second band-pass filter for 0.8 to 2.0 Hz and apply it to the same phase signal. (2) Estimate the dominant frequency and compare it to the injected 1.2 Hz (72 bpm). (3) Now increase the noise standard deviation from 0.15 to 0.4 and rerun both estimators. Which one degrades first, and why does that match the amplitude-versus-phase and displacement-magnitude arguments in this section? (4) Reduce the record length from 60 s to 10 s and explain, using the frequency-resolution limit from Chapter 7, why short windows blur the estimate.
Self-check
1. Why does DensePose-from-WiFi require a synchronised camera during training but not during deployment, and what does that dependency imply for building a Wi-Fi pose dataset without leakage (Chapter 5)?
2. A colleague reports beautiful breathing curves from single-antenna CSI phase with no offset correction. Give the most likely reason to be suspicious, and the one-line fix.
3. Why does WiPose predict joint rotations through a forward-kinematics layer rather than regressing 3D joint coordinates directly?
What's Next
Everything in this section quietly assumed one still person in a clean geometry. In Section 47.4, we drop both assumptions: sensing through walls where the signal is attenuated and cluttered, and separating multiple people whose reflections overlap in the same channel, which is where RF sensing meets its hardest source-separation problems.