Part IX: Radar, Lidar, Depth, Thermal, Event, and RF Sensing
Chapter 47: RF and Wireless Sensing

Through-wall and multi-person sensing

"A wall is opaque to light and merely inconvenient to me. I lose most of my energy crossing it, but the little that returns still carries your outline, your breath, and, if you insist on standing next to a friend, the awkward superposition of both of you at once. My job is to un-add you."

An Unobstructed AI Agent

Prerequisites

This section builds directly on the channel-state and pose machinery of the earlier chapter sections: the multipath channel model of Section 47.1, the device-free presence idea of Section 47.2, and the cross-modal, camera-supervised pose pipeline of Section 47.3. The spatial-separation tools we lean on, FMCW range estimation and antenna-array angle-of-arrival, are developed for automotive sensors in Chapter 44; if beat frequency or a virtual array is unfamiliar, read that first. We assume the signal and sampling vocabulary of Chapter 3 and the leakage-safe splitting discipline of Chapter 5, which is unusually easy to violate when the same room and the same people recur across frames.

Why seeing through walls and counting bodies is the hard part

Radio frequency sensing has one genuinely uncanny property no camera or lidar can match: at the right frequencies it passes through drywall, furniture, and smoke, so it can perceive people the eye cannot reach. That is the promise of through-wall sensing, and it is why elderly-fall monitors, search-and-rescue radars, and building-scale occupancy systems all reach for RF. But two brutal realities stand between the promise and a working system. First, a wall is a lossy filter: it attenuates the signal on the way in and again on the way out, so the return from a body behind concrete can be forty or more decibels weaker than the wall's own reflection sitting in front of it. Second, the physical world rarely offers you one person at a time, and every person in the field adds their reflection to the same received waveform. The measurement you get is a sum, and pose or vital-sign models trained on a single subject fall apart the moment two people share the room. This section is about the two techniques that make it work anyway: exploiting the geometry (range, angle, Doppler) to spatially un-mix people, and using cross-modal supervision to teach a network what a hidden body looks like.

The physics of penetration: what survives a wall

What happens to a radio wave at a wall is governed by frequency and material. Why lower frequencies win: attenuation through a dielectric slab grows with frequency and with the material's loss tangent, so a 2.4 GHz Wi-Fi tone slips through interior drywall with a few decibels of loss, while a 60 GHz millimeter-wave signal is essentially stopped by the same wall. This is the central design tradeoff of through-wall sensing, because the very millimeter-wave bands that give the finest range and angle resolution (see Chapter 44) are the ones walls block, and the sub-6 GHz bands that penetrate give you coarse resolution. How practitioners quantify what survives is a one-way link budget. For a target of radar cross-section \(\sigma\) at range \(R\) behind a wall with two-way loss \(L_{\text{wall}}\), the received power follows

$$ P_r = \frac{P_t\, G_t G_r\, \lambda^2\, \sigma}{(4\pi)^3\, R^4}\, \frac{1}{L_{\text{wall}}}. $$

The \(R^4\) term already punishes distant targets; the extra \(L_{\text{wall}}\) factor (often 3 to 15 dB one-way for interior walls, far more for reinforced concrete) is what pushes a human return down toward the noise floor. Two consequences follow. The wall's own strong static reflection must be removed, typically by background subtraction across time so that only moving scatterers survive, which is why through-wall systems are so sensitive to motion and breathing and so blind to a person holding perfectly still. And the whole enterprise lives or dies on dynamic range: the receiver must not saturate on the wall while still resolving the whisper behind it.

Motion is the through-wall system's flashlight

Because the static clutter (wall, furniture, appliances) dwarfs the human return, nearly every through-wall system keys on change. Subtract consecutive frames, or high-pass the signal along slow time, and the immovable scene cancels while a moving limb or a rising chest survives. This is the same logic that lets a device-free presence detector in Section 47.2 ignore an empty room, pushed to its limit: through a wall you are not imaging a body, you are imaging its motion. The gift is enormous clutter rejection for free. The curse is a genuine failure mode: a stationary person can become invisible, so vital-sign extraction (the sub-millimeter chest motion of breathing) is often the only thread keeping a still subject on the system's map, tying this section back to the vital-sign methods of Section 47.3.

Un-mixing multiple people: geometry against superposition

What makes multi-person sensing hard is linear superposition: the antenna sums every reflection, so two people produce one tangled waveform. Why you cannot simply run a single-person model twice is that the model never sees the individuals, only their sum, and a pose network trained on one body will happily hallucinate a single averaged skeleton floating between two real people. How to separate them is to find a domain where the people occupy different coordinates. Three axes of separation are available, and good systems use all three at once. Range: an FMCW radar maps each scatterer to a beat frequency proportional to its distance, so two people at different depths land in different range bins. Angle: an antenna array estimates angle-of-arrival, so two people at the same range but different bearings separate in the spatial spectrum. Doppler: two people moving at different radial velocities separate in the frequency shift of the return, and even breathing produces a tiny but distinct micro-Doppler signature. The MIT RF-Pose and RF-Pose3D systems combine range and angle into a pair of orthogonal 2D reflection heatmaps (a horizontal and a vertical projection), and later work such as RF-Avatar pushes to reconstructing multiple full-body meshes at once by first localizing each person in the range-angle map and then decoding a body per cluster.

The practical recipe is therefore a two-stage one: localize then decode. Build a range-angle (and, with a 2D array, range-angle-elevation) power map, detect the peaks as candidate people, associate peaks across time into tracks (a data-association problem you have met in Chapter 11 and will meet again in tracking), and then run a per-person pose or vital-sign decoder on the local patch around each track. Crucially this converts the intractable "invert a sum of unknown many" problem into "detect K sources, then solve K single-source problems," which is exactly why spatial resolution (and hence a large virtual aperture) matters so much: two people the array cannot resolve in range or angle cannot be un-mixed at all, and the system undercounts.

import numpy as np

def range_angle_map(iq, n_range=64, n_angle=64):
    """iq: (n_chirps, n_ant, n_fast) complex FMCW-MIMO cube.
    Returns a (n_range, n_angle) power map after slow-time clutter removal."""
    iq = iq - iq.mean(axis=0, keepdims=True)          # cancel static wall/clutter
    rng = np.fft.fft(iq, n=n_range, axis=2)            # fast-time FFT -> range
    rng = rng.mean(axis=0)                             # coherent chirp average -> (n_ant, n_range)
    ang = np.fft.fftshift(np.fft.fft(rng, n=n_angle, axis=0), axes=0)  # array FFT -> angle
    return np.abs(ang.T) ** 2                          # (n_range, n_angle) power

def count_people(power, k_max=4, guard=3, rel_db=8.0):
    """Greedy peak picking: brightest cells, suppressing a neighborhood each time."""
    p = power.copy()
    floor = np.median(p)
    peaks = []
    for _ in range(k_max):
        idx = np.unravel_index(np.argmax(p), p.shape)
        if 10 * np.log10(p[idx] / floor + 1e-9) < rel_db:
            break                                     # nothing left above threshold
        peaks.append(idx)
        r0, a0 = idx                                  # blank a guard region
        p[max(0, r0 - guard):r0 + guard + 1,
          max(0, a0 - guard):a0 + guard + 1] = 0.0
    return peaks

rng_gen = np.random.default_rng(0)
cube = 0.05 * (rng_gen.standard_normal((32, 8, 128)) + 1j * rng_gen.standard_normal((32, 8, 128)))
for (rbin, abin, vel) in [(40, 2, 0.9), (70, 5, -0.6)]:      # two moving people
    t = np.arange(32)[:, None, None]
    steer = np.exp(1j * 2 * np.pi * abin / 8 * np.arange(8))[None, :, None]
    fast = np.exp(1j * 2 * np.pi * rbin / 128 * np.arange(128))[None, None, :]
    cube += (np.exp(1j * 2 * np.pi * vel * t / 32) * steer * fast)
pmap = range_angle_map(cube)
print("detected people:", len(count_people(pmap)))
A minimal localize-first pipeline: slow-time subtraction removes the static wall, two FFTs build a range-angle power map, and greedy peak picking with neighborhood suppression counts the resolvable sources. Seeded with two moving targets, it reports two people; collapse their range and angle to the same bins and it undercounts, which is the resolution limit made concrete.

The listing above is the whole two-stage idea in thirty lines: cancel the wall, form a range-angle map, and pick peaks as people. The greedy suppression is a poor person's CLEAN algorithm, and its failure is instructive: two subjects closer than the guard region merge into one detection, so counting accuracy is bounded by aperture, not by the cleverness of the downstream network.

Right tool: let a signal library own the FFTs and detection

The hand-rolled range-angle map and greedy picker above run to roughly forty lines with the clutter removal, windowing, and peak logic you would need in production. A radar DSP stack such as pyradar-style toolkits or the range-Doppler and CFAR primitives shipped with vendor mmWave SDKs (for example TI's mmwave processing chain) collapse the same pipeline, windowed FFTs, MIMO virtual-array formation, 2D CFAR detection, and clustering, into about five configuration calls, and they add the numerically careful windowing and calibration that a from-scratch FFT omits. Reserve the explicit version for teaching or for a custom statistic (like a per-cell breathing score) the stock CFAR does not expose; reach for the library the moment you need calibrated detections on real hardware.

Cross-modal supervision: teaching a network to see the hidden

What the deep-learning breakthrough for through-wall pose actually solved was not the physics but the labels. You cannot hand-annotate a skeleton in an RF heatmap by eye, and you certainly cannot annotate people you cannot see behind a wall. Why cross-modal supervision is the elegant escape: during training, place a camera in the same room with a clear line of sight, run an off-the-shelf vision pose estimator to produce skeletons, and use those as ground-truth targets for a network whose input is the synchronized RF heatmaps. This is the teacher-student setup introduced for Wi-Fi pose in Section 47.3, and it is the load-bearing trick behind MIT's RF-Pose (2018) and its 3D successor. How the through-wall magic emerges: at test time you remove the camera and place the wall back. The network, having learned the RF-to-pose mapping from unobstructed data, generalizes to the occluded case because the RF signal itself barely changed, only attenuated. The camera was never needed at inference; it was a scaffold for supervision, discarded once the network internalized what a body does to radio waves. Multi-person training data is generated the same way, with the vision teacher labeling each person, so the RF student learns to output multiple skeletons and to attribute reflections to the right body.

Clinical: the RF fall monitor that watched a bathroom without a camera

An assisted-living operator needed fall detection in the one room a camera can never go: the bathroom. A wall-mounted FMCW sensor outside the door, using the localize-then-decode pipeline above, tracked the single occupant through the closed door by their motion and breathing, flagging the signature of a collapse (a fast downward micro-Doppler burst followed by a body at floor height that then goes ominously still). The team learned this section's two lessons the hard way. First, when a caregiver entered to help, the room briefly held two people, and a single-subject model fused them into one phantom skeleton; the fix was the range-angle localizer that kept the two returns in separate tracks. Second, a resident who fell and lay motionless nearly vanished, because with no gross motion the only surviving signal was the sub-millimeter chest rise of breathing, so the vital-sign channel of Section 47.3 was not a nicety but the safety-critical thread that kept a still body on the map. The system shipped only after both were fixed, and the privacy story (no imagery ever leaves the room) was, for a bathroom, the entire point.

Where through-wall and multi-person RF sensing stand

As of 2026 the reference line runs from MIT CSAIL's RF-Pose (Zhao et al., CVPR 2018), which first showed camera-supervised 2D skeletons through walls, through RF-Pose3D and RF-Avatar, which reconstruct multiple 3D bodies and parametric meshes from the range-angle heatmaps, alongside earlier localization systems WiTrack and Vital-Radio from the same group. On the Wi-Fi side, Person-in-WiFi and DensePose-from-WiFi extend dense multi-person body sensing to commodity CSI. Three open problems define the frontier: (1) scaling person count, since resolution collapses and association becomes ambiguous beyond a handful of closely spaced people; (2) domain and layout generalization, because a model trained in one apartment's multipath rarely transfers to another, the theme carried into Section 47.6; and (3) calibrated uncertainty on occluded predictions, tying back to Chapter 18, so a monitor knows when a "no one here" is confident rather than merely a still person lost in the clutter floor.

Exercise: find the resolution limit that makes counting fail

Take the range_angle_map and count_people code above and place two synthetic people at the same angle bin, then sweep their range separation from far apart down to adjacent bins. Plot detected count against separation and identify the separation at which the two merge into one detection. Repeat the sweep in angle at fixed range. Now degrade the setup: scale the target amplitudes down by 20 dB to mimic a concrete wall and add matching noise, then re-run both sweeps. Write three sentences explaining how wall attenuation and finite aperture jointly set the minimum resolvable spacing, and why a system that undercounts is more dangerous in a fall monitor than one that occasionally over-counts.

Self-check

  1. Why do through-wall systems prefer sub-6 GHz bands over millimeter-wave, and what resolution price do they pay for that choice?
  2. State the three physical axes along which two people in the same room can be separated, and name the array or waveform property each one requires.
  3. In camera-supervised through-wall pose, the camera is present during training but absent at test time. Explain precisely what role it plays and why its removal does not break the model.

What's Next

In Section 47.5, we turn from research prototypes to the standard that is about to make RF sensing a first-class feature of ordinary Wi-Fi hardware: IEEE 802.11bf, its sensing measurement procedure, and what it means when every access point in a building is, by design, also a multi-person radar.