简介:《FMCW Radar Design》英文原版技术PDF,面向77GHz毫米波雷达、车载防撞与自动驾驶领域的工程师及信号处理学习者。全书系统讲解FMCW连续波雷达设计全流程:从线性/三角/分段扫频波形、距离与速度测量原理,到LPI低截获概率设计、匹配滤波、脉冲压缩、天线与相控阵方案,并深入FFT、多普勒处理、目标检测跟踪等核心算法,兼顾电磁理论、信号处理与硬件工程,理论与工程实践结合紧密。资源为单文件PDF,全书共1个文件,压缩包约22.3MB,便于离线查阅,适合放在案头或平板中随时翻看。已有167人学习/下载。对需要从原理到工程落地完整掌握FMCW雷达、尤其关注77G毫米波频段的设计人员,是一份值得收藏的系统性参考。
1. FMCW Radar design 的第一道坎:先把“测距”这件事用频率差想明白
FMCW Radar design 最容易被低估的不是天线,而是信号链。很多人把毫米波评估板买回来,跑通 demo 就以为会设计 FMCW 了,真正到量产才发现:距离分辨率、最大不模糊速度、中频带宽这几个指标互相打架,调一个另两个就崩。FMCW(调频连续波)的核心思想是用一个线性调频的连续波代替脉冲,把电磁波飞行时间转换成频率差来测量,好处是峰值功率低、成本低、测距测速能同时做。这篇文章从信号模型、Python 仿真到参数约束和实测校准,把一套可落地的 FMCW 设计路径讲清楚,适合正在做毫米波传感器选型、或者准备把算法跑进嵌入式 DSP 的工程师自己完整推演一遍。
2. FMCW 雷达的信号模型:chirp 怎么变成中频信号,再变成距离和速度
2.1 线性调频的数学表达与差频(beat frequency)来源
FMCW 发射信号一般写成一个线性调频脉冲串,也叫 chirp。瞬时频率随时间线性增长,斜率为 S(单位 Hz/s),带宽为 B,持续时间为 Tc。发射信号频率表示为:
f_tx(t) = f_c + S·t,0 ≤ t < Tc
电磁波碰到目标反射回来,接收信号是发射信号的延时(τ = 2R/c)版本。混频器把发射信号和接收信号相乘、低通滤波后得到一个差频信号(IF 信号),频率等于发射和接收瞬时频率之差:
f_b = S·τ = 2·S·R/c
这是整个 FMCW 设计里最核心的公式。距离 R 和中频频率 f_b 是线性关系,所以对中频信号做一次 FFT,峰值对应的 bin 直接换算成距离。需要特别说明的是,这里的 FFT 是对单个 chirp 的 ADC 采样序列做的,叫距离维 FFT(range FFT)。采样率 Fs 决定了最大可测中频频率,也就决定了最大不模糊距离:
R_max = c·Fs /(4·S)
这里中频信号的最高频率一般取 Fs/2。初学者常踩的坑是把 R_max 算成 c·Fs/(2·S),少了 1/2 因子。工程上要留采样定理的裕量,IF 信号是实部单边谱,实际可用带宽只有 Fs/2。TI 的应用手册和 MATLAB 雷达工具箱里都采用前者。
2.2 二维 FFT:如何从一组 chirp 里同时拿到距离和速度
单 chirp 只能测距离,测速度需要一组 chirp(frame)。假设一个 frame 里有 M 个 chirp,目标以径向速度 v 运动,相邻两个 chirp 之间目标距离变化 ΔR = v·Tc,对应中频信号相位变化为:
Δφ = 4π·f_c·v·Tc / c
通常写作 4πvTc/λ,这就是多普勒频移在相位上的体现。对 M 个 chirp 的距离门(range bin)沿慢时间维(chirp 索引维)再做一次 FFT,得到多普勒频率 f_D = 2v/λ。两次 FFT 组合起来叫 range-Doppler map(RDM)。
慢时间维 FFT 的 bin 间距对应多普勒分辨率 Δf_D = 1/(M·Tc),换算成速度分辨率:
Δv = λ/(2·M·Tc)
最大不模糊多普勒频率是 ±1/(2Tc),对应最大不模糊速度:
v_max = λ/(4·Tc)
这两条公式直接决定 frame 参数:要测高速目标就把 Tc 缩短,要区分速度接近的目标就加大 M。但 Tc 变大会占用更长的发射周期,影响帧率,需要和距离维参数一起权衡。
| 设计变量 | 决定指标 | 公式 | 调参方向 |
|---|---|---|---|
| 带宽 B | 距离分辨率 | ΔR = c/(2B) | B 越大分辨率越高 |
| 斜率 S | 最大距离 | R_max = c·Fs/(4S) | S 越小测距越远 |
| chirp 周期 Tc | 最大速度 | v_max = λ/(4Tc) | Tc 越小测速范围越大 |
| frame 内 chirp 数 M | 速度分辨率 | Δv = λ/(2·M·Tc) | M 越大速度分辨率越高 |
2.3 中频采样与 I/Q 通道的取舍
IF 信号经过 ADC 采样后做复数(I/Q)或实数(单通道)处理。低成本方案常只用单通道,于是镜像频率混叠,无法区分正负多普勒频率——目标靠近还是远离无法判断。仪表级 FMCW 雷达通常做 I/Q 双通道采集,硬件成本增加但换来 ±f_D 的对称可测范围。
还有一个工程细节:中频信号的频带可以选择镜像折叠利用。令中频中心落在 Fs/4 附近,把有用信号搬到 0 到 Fs/2 中间,两边镜像留出过渡带,方便后续抗混叠滤波。这个技巧在高斜率设计中很常见,能省一级低通滤波器。
3. 用 Python 从零搭建 FMCW 雷达中频信号仿真
3.1 仿真参数表与发射信号生成
写仿真前先定参数。把参数集中成一个字典,方便调参对照硬件。以下参数对应 77 GHz 车载前向雷达的典型配置:
import numpy as np params = { "fc": 77e9, # 载频 Hz "B": 1e9, # 线性调频带宽 1 GHz "Tc": 40e-6, # chirp 周期 40 us "Fs": 10e6, # ADC 采样率 10 MHz "M": 128, # frame 内 chirp 数 "Ns": 256, # 每个 chirp 的采样点数 "R": 50.0, # 目标距离 m "v": 12.0, # 目标径向速度 m/s }先算这个参数下能压住哪些指标:距离分辨率 ΔR = c/(2B) ≈ 0.15 m;最大不模糊距离 R_max = c·Fs/(4S),S = B/Tc = 25 GHz/ms,R_max ≈ 30 m。目标设在 50 m 就超出了最大不模糊距离,这就是设计里最常见的首轮迭代:Fs 或 S 必须调整。
修正一版:Fs 提高到 20 MHz,R_max ≈ 60 m,才能罩住 50 m 目标。采样率翻倍意味着 ADC 功耗和数据处理量翻倍,这是实际硬件里头一个要权衡的点,仿真阶段就要记录这个代价。
# 修正参数 params["Fs"] = 20e6 S = params["B"] / params["Tc"] # 斜率 25 GHz/ms t = np.arange(params["Ns"]) / params["Fs"] # 快时间轴 Tc_actual = params["Ns"] / params["Fs"] # 实际采样时长3.2 中频信号生成与距离维 FFT
发射和接收的混频输出,在仿真里可以直接用相位差构造中频信号。考虑目标延时 τ = 2(R + v·t)/c,中频信号(复包络)写为:
def generate_if_frame(params, num_targets): """生成一个 frame 的 IF 信号,返回形状 (M, Ns)""" fc = params["fc"]; B = params["B"]; Tc = params["Tc"] Fs = params["Fs"]; M = params["M"]; Ns = params["Ns"] S = B / Tc t_fast = np.arange(Ns) / Fs frame = np.zeros((M, Ns), dtype=complex) for m in range(M): t_abs = m * Tc + t_fast # 绝对时间 for (R0, v) in num_targets: tau = 2 * (R0 + v * t_abs) / 3e8 # 差频相位:第一项产生距离频点,第二项积累多普勒相位 if_sig = np.exp(1j * 2 * np.pi * S * tau * t_fast) \ * np.exp(-1j * 4 * np.pi * fc * (R0 + v * t_abs) / 3e8) frame[m] += if_sig return frame代码说明:第一项 exp(j2πS·τ·t) 是线性调频的差频项,距离信息对应到频点位置;第二项 exp(-j4πfc·R/c 展开) 是载频项,慢时间维的相位积累是速度信息来源。把目标和帧循环分开写,方便后续加多目标场景。实际硬件里没有这个复数构造,但仿真里用它能验证后面 FFT 峰值位置的正确性。
距离维 FFT 直接对每行做 512 点补零 FFT:
def range_fft(frame, params): Nfft = 512 win = np.hanning(params["Ns"]) spectrum = np.fft.fft(frame * win, Nfft, axis=1) freq_bins = np.fft.fftfreq(Nfft, d=1/params["Fs"]) # 正半轴对应距离:R = c·f/(2S) ranges = 3e8 * freq_bins / (2 * params["B"] / params["Tc"]) return spectrum, ranges参数说明:窗函数用 Hanning 是抑制旁瓣的常规做法,主瓣会宽一点,但旁瓣从 -13 dB 压到 -31 dB 左右,多目标场景下值得。ranges 数组里只有正频率索引 0 到 Nfft/2-1 是有效距离,负频率部分是镜像。峰值位置换算距离后应落在目标真实距离附近,偏差来自 τ 对 t_fast 的近似,一般小于一个距离 bin。
3.3 二维 FFT:慢时间维的速度解算
慢时间维 FFT 需要先做距离维 FFT,再取每个距离门的一列做第二个 FFT:
def doppler_fft(range_spec, params): M = params["M"] Nfft_d = 256 win_d = np.hanning(M) # 沿 chirp 维加窗,抑制多普勒旁瓣 rdm = np.fft.fft(range_spec * win_d[:, None], Nfft_d, axis=0) doppler_bins = np.fft.fftfreq(Nfft_d, d=params["Tc"]) # 速度:v = λ·f_D/2 lam = 3e8 / params["fc"] velocities = lam * doppler_bins / 2 return rdm, velocities速度分辨率理论值是 λ/(2M·Tc) ≈ 3.9e-3/(2×128×40e-6) ≈ 0.38 m/s。从 velocities 数组找峰值索引,速度值应和仿真里设置的 12 m/s 接近(±0.38 m/s 误差)。CFAR 检测一般在这个 RDM 上做而不是在距离谱上做,因为二维检测能同时抑制静态杂波和随机噪声抬底。
注意一个耦合现象:距离-速度耦合会让运动目标的峰值在距离维偏移一个量,偏移量为 ΔR = v·Tc 对应的距离变化。低速目标这一项远小于距离分辨率可以忽略,但高速目标必须用测得的 v 反向补偿距离维索引,否则报出的距离偏大或偏小一个系统量。
4. FMCW 参数设计的约束链:从分辨率倒推硬件指标
4.1 带宽、斜率与 chirp 周期之间的闭式约束
FMCW 设计本质是解一组联立不等式。给定雷达指标——距离分辨率 ΔR、速度分辨率 Δv、最大距离 R_max、最大速度 v_max——先用这四个指标把 B、Tc、M、Fs 全部解出来。以 77 GHz 车载雷达为例:
- ΔR = c/(2B) ≤ 0.1 m,得 B ≥ 1.5 GHz
- R_max ≥ 100 m,结合 Fs = 20 MHz 得 S ≤ c·Fs/(4R_max) = 15 GHz/ms
- Tc = B/S ≥ 1.5e9/15e9 = 100 μs,注意这是下限
- v_max ≥ 70 m/s(约 252 km/h 相对速度),需要 Tc ≤ λ/(4v_max) ≈ 3.9e-3/(280) ≈ 13.9 μs
矛盾出现了:Tc 要同时满足 ≥100 μs 和 ≤13.9 μs,做不到。这就是 FMCW 单斜率设计的硬伤。业内解法有三条路:用更高 Fs(意味着 ADC 成本上升)、拆成多段斜率(sub-chirp)、或者换 OFDM/OTFS 波形。
4.2 多段斜率 FMCW 的工程折中
常见做法是把一个 frame 拆成两个不同斜率的 chirp 组:一组大斜率测速、一组小斜率测距。速度组用短 Tc,距离组用长 Tc,两组交替发射,接收端分别做二维 FFT 再配对。配对条件是两组目标的数量和大致距离一致,用幅度做关联。代价是帧率下降一半,因为每个测量周期只算一组有效数据。以下是一组常用参数起点:
| 参数 | 测速组 | 测距组 |
|---|---|---|
| 带宽 B(MHz) | 1500 | 800 |
| chirp 周期 Tc(μs) | 12 | 50 |
| frame 内 chirp 数 M | 256 | 128 |
| 采样率 Fs(MHz) | 20 | 15 |
| R_max(m) | 30 | 55 |
| v_max(m/s) | 81 | 19 |
注意测速组 R_max 只有 30 m,只能负责中近距离的跟车场景,远距目标交给测距组。这就是为什么量产雷达一定有多组波形分时复用,而不是单一配置打天下。
4.3 OFDM / OTFS 雷达与 FMCW 的取舍
最近行业里讨论多的 OFDM 雷达和 OTFS 雷达,本质上是把通信波形复用成雷达波形。OFDM 雷达把每个子载波当作独立的连续波,在频域做匹配滤波,距离维用 IDFT 替代,多普勒维用符号间的相移估计。OTFS 更进一步,把调制放在时延-多普勒域,对高速目标的感知比 OFDM 更稳。
对 FMCW 设计者来说,这两者不是替代关系而是互补。FMCW 在单目标信噪比和硬件成熟度上仍然占优(DSP 里一个 FFT 就能测距),但 OFDM/OTFS 的价值在通信感知一体化(ISAC)场景——同一个波形同时传数据和测距,频谱利用率是 FMCW 做不到的。如果项目是车载 V2X 融合,认真评估 OTFS;如果只是单传感器测距测速,FMCW 的成本优势明显。波形选择的第一判据是「是否必须和通信共用硬件」,不是性能对比表。
4.4 一个实用的参数迭代顺序
我一般按这个顺序调参:先定 B 满足距离分辨率,再定 Fs 满足 R_max,然后算 Tc 上下限,若上下限交叉就立刻转多段斜率方案,最后定 M 满足速度分辨率。每轮改完只动一个变量,其他锁死,这样能清楚看到哪个指标被牺牲了。仿真里每轮记录 RDM 的峰值旁瓣比和目标位置的偏差,偏差超过一个 bin 就回头看是窗函数的问题还是耦合补偿没做。
5. 相位校准与多目标配对的两个实战技巧
5.1 I/Q 不平衡校准
FMCW 雷达上电后第一件事不是采集,是校准——尤其是 I/Q 两路的幅度和相位不平衡。I/Q 不平衡会导致镜像频带泄漏,镜像抑制比变差,在 RDM 上表现为目标左右出现对称的假峰。简单的校准方法:注入一个单音中频信号,采样后估计幅度比 α 和相位差 φ:
def iq_calibrate(i_samples, q_samples): x = i_samples + 1j * q_samples # 幅度比与相位偏差估计(Russell 方法) alpha = np.std(np.real(x)) / np.std(np.imag(x)) phi = np.mean(np.real(x) * np.imag(x)) / \ np.sqrt(np.mean(np.real(x)**2) * np.mean(np.imag(x)**2)) phi = np.arcsin(phi) return alpha, phi def iq_correct(sig, alpha, phi): """按标准正交化公式补偿""" re = np.real(sig) im = (np.imag(sig) - np.tan(phi) * re) / (alpha * np.cos(phi)) return re + 1j * im校准系数算一次存进 flash,每次上电加载即可。这个估计对噪声敏感,注入信号的幅度要用接近 ADC 满量程、频率落在中频带中心的值,采样点数至少 1024,否则 φ 估计的方差下不来。
5.2 多目标配对联合门限
另一个实战技巧是多目标配对时的幅度-相位联合门限。距离维峰值和速度维峰值分别找出来后,用幅度比(主峰值/旁瓣)和相位方差两个量做联合判决:幅度比大于 13 dB 且相位方差小于 0.1 rad² 的峰值才判定为真实目标。这个方法在密集车流场景下能挡住大部分镜面反射形成的假目标。
最后补一个排查顺序:任何一版参数改动后,优先做一次静态场景的 RDM 本底电平记录,本底抬升 3 dB 以上先查 I/Q 校准系数,再查天线隔离度。这个顺序能省一半调试时间。
本文还有配套的精品资源,点击获取