FMCW Radar: The Mathematical Foundation
How one radar waveform can reveal an object's range, velocity, and direction using frequency, phase, Fourier transforms, and antenna geometry.
An FMCW radar does not directly measure range, velocity, and angle. Instead, it measures changes in frequency and phase. Those measurements are transformed into physical quantities.
| Dimension | What changes? | Information |
|---|---|---|
| Samples within a chirp | Beat frequency | Range |
| Chirp to chirp | Doppler phase | Velocity |
| Receiver to receiver | Spatial phase | Angle |
1. Start With an FMCW Chirp
FMCW stands for Frequency-Modulated Continuous Wave. Instead of transmitting a single frequency, the radar continuously sweeps its frequency.
A simple up-chirp can be written as:
where:
- (f_c) = carrier frequency
- (S) = chirp slope in Hz/s
- (t) = time
The slope is:
where (B) is bandwidth and (T_c) is chirp duration.
Numerical Example
Suppose:
- Carrier frequency = 77 GHz
- Bandwidth = 1 GHz
- Chirp duration = 50 Ξs
Then:
So the radar's frequency increases by approximately 20 THz every second.
2. Range: Why Does the Beat Frequency Give Distance?
Electromagnetic waves travel approximately at the speed of light:
If an object is at distance (R), the signal must travel to the object and back.
The round-trip delay is therefore:
Because the transmitted chirp is changing frequency with time, the delayed signal has a slightly different instantaneous frequency from the signal currently being transmitted.
Mixing the transmitted signal with the received signal produces the beat frequency:
Substituting the delay:
Therefore:
Numerical Range Example
Assume:
- (S=2\times10^{13}) Hz/s
- Object range (R=30) m
- (c=3\times10^8) m/s
The round-trip delay is:
The beat frequency is:
Therefore, a target 30 m away produces approximately a 4 MHz beat frequency.
3. Why Do We Take an FFT for Range?
The ADC does not tell us directly:
Instead, it gives us a sequence of voltage samples representing a signal that oscillates at approximately 4 MHz.
For example:
The question becomes:
The Fourier Transform answers exactly that question.
In practice, we use the Fast Fourier Transform (FFT), which is an efficient algorithm for calculating the Discrete Fourier Transform.
The DFT is:
The FFT efficiently calculates these frequency components. A strong peak at frequency (f_b) means that the received signal contains a strong component at that beat frequency.
4. Range Resolution
An important property of FMCW radar is that range resolution is primarily determined by bandwidth.
For (B=1) GHz:
So approximately 15 cm range resolution is possible under ideal assumptions.
5. Velocity: The Doppler Effect
Now imagine the target is moving. Motion changes the frequency of the returned wave. This is the Doppler effect.
The Doppler frequency for a monostatic radar is:
where:
- (v) = radial velocity
- (\lambda) = wavelength
The wavelength is:
Numerical Velocity Example
For a 77 GHz radar:
Suppose a car is approaching at (v=20) m/s.
6. Why Do We Take Another FFT for Velocity?
This is where FMCW radar becomes especially interesting.
We already used the samples within one chirp to determine range.
Now we look at the same range bin across many chirps.
Suppose the radar transmits chirps every (T_c) seconds.
The Doppler signal across chirps can be approximated as:
Notice what happened:
Because the Doppler signal is also a frequency component, we again use an FFT.
Second FFT: frequency across chirps → velocity.
Numerical Slow-Time Example
Suppose chirps are separated by:
For (v=20) m/s we calculated:
The phase change between consecutive chirps is:
Therefore:
So the complex radar signal rotates by roughly 3.23 radians per chirp.
That phase rotation is the mathematical origin of Doppler estimation in the slow-time dimension.
7. Range-Doppler Map
After the first FFT, every chirp contains a set of range bins. Stack those chirps together:
Then perform another FFT along the chirp dimension.
The result is a range-Doppler map.
| Axis | Physical meaning |
|---|---|
| X-axis | Range |
| Y-axis | Velocity / Doppler |
| Brightness | Signal strength |
8. Angle: Why Can Two Antennas Tell Direction?
Now consider two receiving antennas separated by distance (d).
A wave arriving at an angle does not reach both antennas at exactly the same time.
The path difference is approximately:
A path difference creates a phase difference:
Substituting:
Solving for angle:
Numerical Angle Example
Suppose:
- Radar frequency = 77 GHz
- (\lambda\approx3.896) mm
- Antenna spacing (d=\lambda/2)
- Target angle (\theta=30^\circ)
Then:
So a target at 30° produces approximately a 90° phase difference between the two receivers.
9. Why Only Two Receivers Are Limited
With two antennas, we essentially get one spatial phase measurement:
That gives us an estimate of one angle.
But with more antennas, we obtain many spatial measurements:
This allows us to perform spatial beamforming or a spatial FFT to obtain a more precise angular spectrum.
10. Why MIMO Helps
MIMO stands for Multiple Input Multiple Output.
Multiple transmitters and receivers can create a larger virtual antenna array.
For example, with:
appropriately arranged channels, the radar can obtain many virtual spatial samples.
This improves angular resolution and allows the radar to distinguish targets that are close together in angle.
11. Putting Everything Together
We can now see why the same raw radar data contains all three measurements.
Range
Find the beat frequency using an FFT across samples within a chirp.
Velocity
Find the Doppler frequency using an FFT across chirps.
Angle
Compare the phase received by spatially separated antennas.
12. The Mathematical Picture
The most useful way to think about FMCW radar is as a multidimensional signal-processing problem.
Therefore, the radar data cube can conceptually be represented as:
In real radar systems there are many additional complications: noise, clutter, multiple targets, acceleration, phase noise, leakage, range-Doppler coupling, antenna calibration, windowing, CFAR detection, and more.
13. Numerical Example
Consider a 77 GHz FMCW radar with:
- Bandwidth (B=1) GHz
- Chirp duration (T_c=50) Ξs
- Target range (R=30) m
- Target velocity (v=20) m/s
- Two receivers separated by (d=\lambda/2)
- Target angle (\theta=30^\circ)
Step 1 — Chirp slope
Step 2 — Range
Step 3 — Wavelength
Step 4 — Doppler
Step 5 — Angle
The radar therefore observes approximately:
| Measurement | Observed quantity | Physical result |
|---|---|---|
| Fast-time FFT | 4 MHz beat frequency | 30 m range |
| Slow-time FFT | 10.27 kHz Doppler | 20 m/s velocity |
| Rx phase difference | Ï/2 rad | 30° angle |
14. Summary
%% Simple FMCW Radar: Fast-Time FFT + Slow-Time FFT
clear;
clc;
close all;
%% Radar parameters
c = 3e8; % Speed of light (m/s)
fc = 77e9; % Carrier frequency (Hz)
B = 1e9; % Bandwidth = 1 GHz
Tc = 50e-6; % Chirp duration = 50 us
S = B/Tc; % Chirp slope (Hz/s)
%% Target
R = 30; % Target range = 30 m
v = 20; % Target velocity = 20 m/s
lambda = c/fc;
%% Sampling parameters
Fs = 20e6; % ADC sampling frequency = 20 MHz
Ns = 1000; % Samples per chirp
Nc = 128; % Number of chirps
Ts = 1/Fs;
%% Create data matrix
% Rows = fast time (samples within chirp)
% Columns = slow time (different chirps)
radarData = zeros(Ns, Nc);
%% Generate received beat signal
for m = 1:Nc
% Time within this chirp
t = (0:Ns-1).' * Ts;
% Target range changes because target is moving
Rm = R - v*(m-1)*Tc;
% Round-trip delay
tau = 2*Rm/c;
% Beat frequency caused by range
fb = S*tau;
% Doppler frequency
fd = 2*v/lambda;
% Beat signal
radarData(:,m) = exp(1j*2*pi*(fb + fd)*t);
end
%% ============================================================
% FAST-TIME FFT
% Samples within ONE chirp -> Range
% =============================================================
% Take FFT along rows
rangeFFT = fft(radarData, [], 1);
% Keep only positive frequencies
rangeFFT = rangeFFT(1:Ns/2, :);
% Frequency axis
fRange = (0:Ns/2-1).' * Fs/Ns;
% Convert beat frequency to range
rangeAxis = c*fRange/(2*S);
%% Plot Fast-Time FFT
figure;
plot(rangeAxis, abs(rangeFFT(:,1)));
xlabel('Range (m)');
ylabel('Magnitude');
title('Fast-Time FFT → Range');
grid on;
xlim([0 50]);
%% ============================================================
% SLOW-TIME FFT
% Same range bin across MANY chirps -> Velocity
% =============================================================
% Pick the range bin containing the target
[~, rangeBin] = max(abs(rangeFFT(:,1)));
% Extract this range bin across all chirps
slowTimeSignal = rangeFFT(rangeBin, :);
% FFT across chirps
dopplerFFT = fftshift(fft(slowTimeSignal, Nc));
% Doppler frequency axis
PRF = 1/Tc;
fDoppler = (-Nc/2:Nc/2-1) * PRF/Nc;
% Convert Doppler frequency to velocity
velocityAxis = lambda*fDoppler/2;
%% Plot Slow-Time FFT
figure;
plot(velocityAxis, abs(dopplerFFT));
xlabel('Velocity (m/s)');
ylabel('Magnitude');
title('Slow-Time FFT → Velocity');
grid on;
xlim([-30 30]);
%% ============================================================
% RANGE-DOPPLER MAP
% =============================================================
% FFT across slow-time/chirp dimension
RD = fftshift(fft(rangeFFT, Nc, 2), 2);
figure;
imagesc(velocityAxis, rangeAxis, abs(RD));
xlabel('Velocity (m/s)');
ylabel('Range (m)');
title('Range-Doppler Map');
colorbar;
axis xy;
ylim([0 50]);
xlim([-30 30]);