
A presence sensor has to tell a person from a chair, and a gesture sensor a moving hand from the desk under it. Both rely on the same measurement: how fast each echo is moving towards or away from the radar. An FMCW radar gets it not from one chirp but from many, by watching how the echo phase from chapter 2 turns from one chirp to the next. Arranged into a range-Doppler map, the result separates everything in the scene by distance and by speed at once.
The Doppler shift
An ambulance siren sounds higher as it drives towards you and lower as it drives away. A radar echo from anything moving is shifted the same way, and twice over: once on the way out, once on the way back.
Start from chapter 2: the echo phase turns once around every time the target moves half a wavelength further away. A target that keeps moving keeps the phase turning at a steady rate, and a phase that turns at a steady rate is simply a frequency. That frequency is the Doppler shift. Seen from outside, a wave reflected from a moving object comes back at a slightly different frequency. For a radar the shift is applied twice, once on the way out and once on the way back, so
fd = 2v / λ
where v is the radial velocity, the component along the line between radar and target. At 60.5 GHz a person walking at 1 m/s straight towards the radar produces about 400 Hz; at 77 GHz, about 510 Hz. This series uses positive velocity for targets moving away, matching the phase increasing with range.
Why one chirp is not enough
Those few hundred hertz do add to the beat frequency of each chirp, but chapter 5 showed why that is useless: with a 40 µs chirp one range bin is 25 kHz wide, so a 400 Hz shift moves the peak by under 2% of a bin. Measuring the Doppler shift directly would need a record of several milliseconds, long enough for a fast target to change range bins. FMCW radars use a different route.
Velocity from chirp to chirp
Photograph a turning wheel with a mark on it once a second and lay the photos side by side: the mark sits a little further round in each one, and how far it moves per photo tells you how fast the wheel turns. A radar takes one such snapshot of the echo phase per chirp.
Between two chirps sent T apart, a target moving at v changes its range by vT, and its echo phase 4πR/λ changes by
Δφ = 4π · v · T / λ
At 60.5 GHz with a chirp every 250 µs, a target moving at 0.8 m/s turns the phase of its range bin by 29° per chirp, even though its range changes by only 0.2 mm. The phase acts as a magnifying glass: it turns a sub-millimetre motion into a large, easily measured angle.
Sampled chirp by chirp, the range-bin value is a slowly rotating phasor, which is a tone in its own right. Its frequency is exactly the Doppler frequency 2v/λ, measured over the whole frame instead of over one chirp.
Fast time and slow time
Reading a book has two speeds: your eyes run along a line in a moment, while the story moves on page by page. A radar frame is read the same way: along each chirp in microseconds, and from chirp to chirp in milliseconds.

It helps to arrange one frame of data as a matrix. Each row is one chirp, sampled over microseconds: fast time. Moving down the rows, chirp after chirp over milliseconds, is slow time. The range FFT runs along each row and turns the samples into range bins. A second FFT, the Doppler FFT, runs down each column of range bins and turns the chirp-to-chirp phase rotation into velocity bins. With several receive antennas the matrix becomes a cube, and the third axis carries angle (chapter 12).
The Doppler FFT
Everything from chapter 6 carries over, with chirps in place of samples:
- Velocity resolution Δv = λ/(2NT): N chirps T apart. For 64 chirps every 250 µs at 60.5 GHz: 0.155 m/s.
- Maximum unambiguous velocity vmax = ±λ/(4T): the phase step must stay within ±180°. Here ±4.96 m/s.
- Windows work the same way: a Hann window keeps a strong static echo from leaking into the velocity bins of a weak moving one.
- Integration gain: a target that stays in one velocity bin collects the full 10·log10(N) gain from chapter 7.
| Chirp interval T | Chirps N | Frame time | vmax at 60.5 GHz | Δv |
|---|---|---|---|---|
| 50 µs | 64 | 3.2 ms | ±24.8 m/s | 0.77 m/s |
| 250 µs | 64 | 16 ms | ±4.96 m/s | 0.155 m/s |
| 250 µs | 256 | 64 ms | ±4.96 m/s | 0.039 m/s |
| 1 ms | 64 | 64 ms | ±1.24 m/s | 0.039 m/s |
The trade is visible in the table: a short chirp interval covers fast targets, a long frame resolves slow ones, and both together cost memory and processing. Gesture sensing needs a high vmax for flicking hands; presence sensing needs fine Δv to catch a person who barely moves.
The range-Doppler map
Picture a theatre seating plan where each row is a distance and each seat is a speed. Everything the radar sees takes a seat: furniture in the middle seat of its row, people walking off to the sides.

The result of the two FFTs is the range-Doppler map at the top of the page: range across, velocity up. Every stationary object, walls, furniture, the radome, sits on the zero-velocity line. Anything moving lifts off it. This one picture explains several features of real sensors:
- Static clutter removal. Subtracting the average over the chirps from each range bin before the Doppler FFT empties the zero-velocity line, leaving only what moves. Many presence sensors do this first.
- Two targets at the same range separate if their speeds differ by more than Δv, for example a person walking past a cabinet.
- Detection on the map: CFAR (chapter 16) runs on the range-Doppler cells, not on the raw profile.
Range-Doppler processing in a few lines
import numpy as np
# adc: samples [chirps, samples] for one receive antenna (real or complex; with real samples keep the first half of the range bins)
rp = np.fft.fft(adc * np.hanning(adc.shape[1]), axis=1) # range FFT
rp -= rp.mean(axis=0, keepdims=True) # static clutter removal
rd = np.fft.fftshift(np.fft.fft(rp * np.hanning(adc.shape[0])[:, None], axis=0), axes=0)
rd_db = 20 * np.log10(np.abs(rd) + 1e-12) # rows: velocity, cols: range
When the velocity wraps around
You may have seen it on video: a helicopter in flight whose rotor seems to stand still. The camera takes 30 pictures a second, and a four-blade rotor turning 7.5 times a second moves exactly a quarter turn between pictures, so every picture looks the same; slow it to 6 turns a second and each blade covers only 0.8 of the gap, which the eye reads as 0.2 backwards. A radar measuring speed falls into the same trap, because one wave looks just like the next. A car at 200 km/h seen by a 24 GHz radar that chirps every 89.5 µs moves 5 mm between chirps, the echo path 10 mm, 0.8 of a 12.4 mm wave, and the radar reads −50 km/h. The numbers below show why.
The phase can only be read between −180° and +180°. A target fast enough to turn the phase by more than half a turn per chirp is indistinguishable from one turning the other way: it appears at the wrong speed, often with the wrong sign. This is the same aliasing as an ADC sampling too slowly (chapter 5): the chirps are samples of the echo phase taken once per chirp interval, and a phase that turns faster than half a cycle per sample folds back onto a slower one.

At 60.5 GHz with T = 250 µs, a target at +7 m/s appears at about −2.9 m/s. MIMO radars that take turns between transmitters make this worse, because the chirp interval per transmitter grows (chapter 14). Chapter 15 covers the standard ways to recover the true speed: different chirp intervals in alternate frames, tracking, and phase compensation.
Velocity between the bins
Velocity bins can be interpolated exactly like range bins in chapter 8: the same parabolic fit, the same Cramér–Rao bound, σv ≈ Δv·√6/(2π·√SNR). With 30 dB SNR and 0.155 m/s bins that is about 2 mm/s. Tracking a target over many frames improves it further.
What Doppler cannot see
Walk straight at an automatic door and it opens; walk past it and many motion radars barely notice you. Split your walk into the part towards or away from the radar and the part across the line of sight: only the first changes the length of the echo’s trip. Walking past at a steady 1.2 m/s, the measured speed slides from negative through zero, right in front of the sensor, to positive, although you never slowed down.
- Sideways motion. Doppler sees only the radial component. A person walking across the beam at a constant distance shows almost no Doppler; their motion appears in angle (chapter 12) instead.
- Range migration. If a target moves more than one range bin during a frame, its energy smears over several bins. At 1.2 m/s over a 16 ms frame it moves 1.9 cm, half a 3.75 cm bin, which is acceptable.
- Very slow motion. Breathing moves a chest by millimetres at a few tenths of a hertz, far below one velocity bin of a short frame. It is measured from phase over many seconds instead: chapter 11.
Designing a chirp: a worked example
The relations from chapter 5, chapter 6 and this chapter are enough to design a complete waveform. Take a common task: a 60 GHz sensor on a wall that must see people anywhere in a room. Start from what the application needs, then turn each requirement into one parameter.
| Requirement | Relation | Choice | Result |
|---|---|---|---|
| Separate two people 5 cm apart in range | B = c / 2ΔR | B = 3 GHz during sampling | ΔR = 5.0 cm |
| See the whole room, 9 m, with margin | Rmax = fs·c / 2S (complex) | 256 samples at 4 MS/s: 64 µs, S = 46.9 MHz/µs | Rmax = 12.8 m; 9 m beats at 2.8 MHz |
| Fast walking and arm swings, ±4 m/s | vmax = λ / 4T | chirp every T = 250 µs | vmax = ±4.96 m/s |
| Tell a step from a shuffle, 0.1 m/s | Δv = λ / 2NT, so N ≥ 99 | N = 128 chirps | Δv = 0.077 m/s, 32 ms per frame |
| Ten updates per second | frame period | 100 ms frames | 32% of the time transmitting |
Each choice leaves a few checks. The ramp must sweep slightly more than 3 GHz, because the first microseconds settle before the ADC starts: at 46.9 MHz/µs, an 80 µs ramp covers 3.75 GHz, which still fits the 57–64 GHz band with room to spare. The IF low-pass goes a little above 2.8 MHz so that echoes from 9 m pass and farther walls are attenuated before they can alias. The Doppler shift of a 4 m/s walker inside one chirp is about 1.6 kHz, a tenth of a 15.6 kHz range bin, so it barely moves the range peak. Range migration is the one real compromise: at 4 m/s a person moves 12.8 cm during the 32 ms frame, about 2.6 range bins, so fast walkers smear. For presence and tracking that is acceptable; for fine gestures a shorter frame and a smaller N would be chosen instead.
Every number trades against another. Shortening T to raise vmax also shortens the frame and coarsens Δv unless N grows. Adding a second transmitter in time-division halves vmax (chapter 14). More samples per chirp extend Rmax but raise the ADC and memory load: this design already produces 98,304 complex samples per frame with three receivers. Integrated modules make the same trade-offs internally and publish only the results. The values above are a worked example, not the configuration of any particular module.
Every figure on this page is reproduced by the range-Doppler example in the open-source radar-basics-sim library; add your own targets and chirp settings to see where they land. On hardware, the gesture and presence kits below run this processing in their firmware.
Try it yourself: examples/ch10_range_doppler.py in the open-source radar-basics-sim repository runs the core simulation of this chapter; change the assumptions and see what moves.
-

60 GHz AiP Gesture & Presence Radar Sensor Module, Pre-flashed (57–64 GHz, 2T2R)
From $19.00Sensor onlySensor + USB-TTL adapter (3.3 V LDO)Reset optionsGesture recognitionPresence, ceiling mountPresence, wall mountPresence and fall events, ceiling mountBreathing and heart rate (research)Select options This product has multiple variants. The options may be chosen on the product page -

60 GHz Gesture & Presence Radar Module Development Kit, PCB Antenna (2T2R, 25 × 31.5 mm)
From $19.00DIY boardDevelopment kitReset optionsGesture recognitionPresence, ceiling mountPresence, wall mountPeople countingPresence and fall events, ceiling mountBreathing and heart rate (research)Select options This product has multiple variants. The options may be chosen on the product page
FAQ
Does an FMCW radar measure Doppler directly?
Not within one chirp, where the shift is far smaller than a range bin. It measures the phase change of each range bin from chirp to chirp, which gives the same Doppler frequency much more precisely.
Why does my radar show a person at zero speed when they walk past?
Doppler only measures the radial component. Walking across the beam at a constant distance gives almost no radial velocity.
How do I get finer velocity resolution?
Use more chirps or a longer chirp interval: Δv = λ/(2NT). A longer interval lowers the maximum unambiguous velocity, so the two have to be balanced.
What is the zero-Doppler line on a range-Doppler map?
The row of cells for velocity zero, where every stationary reflector lands. Static clutter removal empties it.
Sources and method
- M. A. Richards, Fundamentals of Radar Signal Processing, 2nd ed., McGraw-Hill, 2014 (Doppler processing, slow time).
- Texas Instruments, Introduction to mmWave Sensing: FMCW Radars, training series (velocity estimation; concepts only).
- M. I. Skolnik, Introduction to Radar Systems, 3rd ed., McGraw-Hill, 2001 (MTI and clutter).
- Figures and animations are computed in Python from the formulas shown; the simulation code is open source in Kymopsis/radar-basics-sim. Chirp settings are examples, not product settings. Figures marked SIMULATION are not measurements of a product.