☰
FMCW毫米波雷达测距测速原理详解:从chirp信号到距离-多普勒图
2026/10/5 5:20:38 网站建设 项目流程

1. 为什么雷达测距偏偏选FMCW体制

做雷达相关开发的朋友应该都有体会,一说到测距测速,大家第一反应往往是“那不就是发个脉冲等回波嘛”,就像喊一嗓子听回声一样。这个直觉没错,脉冲体制确实是雷达最古老也最直观的形态:发射一个短促的高功率脉冲,记录它碰到目标反射回来的时间,距离自然就是光速乘以时间差的一半。

但问题出在实际工程里。脉冲体制要测得准,发射脉冲就得足够窄,窄到纳秒级甚至皮秒级;要测得远,峰值功率就得足够高,高到馈线、天线、发射机都跟着遭殃。更麻烦的是,脉冲体制想测速度,要靠多普勒频移,而多普勒频移在单脉冲里那点微小的频率偏移根本提不出来,必须长时间积累。于是早期的测速雷达要么做得很笨重,要么精度上不去,成本和功耗都相当感人。

FMCW,全称Frequency Modulated Continuous Wave,调频连续波,走的完全是另一条路。它不发射那种“咚”的一下的强脉冲,而是持续发射一个频率随时间线性变化的连续波,业内一般叫chirp,也就是“啁啾”信号。频率从f_start线性扫到f_stop,扫完一个周期再重来,波形看成锯齿状或者三角状。这种体制天生就能把“时间差”转换成“频率差”,而频率是连续信号里最容易高精度测量的物理量之一。

FMCW最大的优势在于,它用极低的峰值功率就能实现厘米级的测距精度。毕竟连续波的平均功率可以做得比较稳,发射链路和接收链路都能用固态器件实现,成本低、体积小、寿命长。再加上它天然支持同时测距和测速,一发一收之间就能把两个维度的信息都解出来,这让它在车载雷达、工业物位计、生命体征监测、无人机避障这些场景里几乎成了默认选项。

现在市面上的24GHz毫米波雷达模块,标称探测距离动不动就是40米甚至更远,这个数据背后的体制就是FMCW。很多做嵌入式或者机器人项目的朋友拿到模块,看到输出的距离和速度数据觉得“好神奇”,实际上这些数值都是芯片内部对你完全不可见的信号做了一连串FFT之后才得到的。理解FMCW的原理,不仅是为了知道公式怎么来,更是为了将来做应用层开发时,知道哪些参数能调、哪些性能是物理决定的、哪些坑是算法绕不过去的。

这篇文章就从最底层的信号出发,把FMCW雷达测距测速的原理完整推一遍。我用Python做了仿真验证,代码和数值结果都贴在对应的章节里,方便你对照复现。这篇是原理部分的第一篇,重点讲距离和速度的解算,测角、CFAR检测、目标聚类这些后续再单独展开。

2. FMCW测距的第一性原理:从发射波形到中频信号

2.1 一个chirp的数学长相

先看最基础的发射信号。一个线性调频连续波chirp,数学上可以写为:

[ s_{tx}(t) = A_{tx} \cdot \cos\left(2\pi f_c t + \pi \frac{B}{T_c} t^2 + \varphi_0\right) ]

这里面几个参数务必提前搞清楚:

  • ( f_c ):起始频率,也就是chirp开始时的瞬时频率。24GHz模块常见的是24.0GHz到24.25GHz这个频段,其实是一个典型的ISM频段,起始频率一般设在24.00GHz附近。
  • ( B ):扫频带宽,比如200MHz、250MHz。带宽是整个雷达系统里最宝贵的资源之一,因为它直接决定距离分辨率,后面细说。
  • ( T_c ):单个chirp的持续时间,通常是几十到几百微秒。比如一个chirp扫200MHz用100微秒,那么这个chirp的调频斜率S就是B除以Tc,也就是2MHz/微秒。
  • ( \varphi_0 ):初始相位,工程上一般不关心绝对初相,但在测速时跨chirp的相位差非常关键。

瞬时频率是相位的导数:

[ f_{tx}(t) = \frac{1}{2\pi}\frac{d\phi_{tx}(t)}{dt} = f_c + \frac{B}{T_c}t ]

可以看到,频率随时间线性上升,斜率S = B / Tc。这个S就是区别FMCW雷达性能的“灵魂参数”。S越大,意味着相同时间内频率变化越剧烈,后面的差频信号频率就越高,测距精度相对越容易做高。

2.2 回波与发射信号混频:神奇的差频

假设有一个目标距离雷达为R,那么发射信号打到目标再反射回来,接收到的回波信号相比发射信号有一个时间延迟(\tau = 2R / c),其中c是光速。回波信号的表达式:

[ s_{rx}(t) = A_{rx} \cdot \cos\left(2\pi f_c (t-\tau) + \pi \frac{B}{T_c} (t-\tau)^2 + \varphi_0\right) ]

回波和发射信号同时送入混频器,混频器输出的是两者频率之差和频率之和两个分量,经过低通滤波器滤掉和频分量,剩下的差频信号就是核心的中频信号IF(Intermediate Frequency)。用三角函数积化和差后,中频信号的相位为:

[ \phi_{IF}(t) = 2\pi f_c \tau + 2\pi \frac{B}{T_c}\tau t - \pi\frac{B}{T_c}\tau^2 ]

这里面最后一项(\pi\frac{B}{T_c}\tau^2)非常小,因为(\tau)通常远小于(T_c)。比如目标距离10米,(\tau=2*10/c\approx66.7ns),Tc如果是100μs,那这项小到可以忽略。这样中频信号近似是一个单频正弦波,频率为:

[ f_{IF} = \frac{B}{T_c}\tau = \frac{B}{T_c} \cdot \frac{2R}{c} = S \cdot \frac{2R}{c} ]

这个式子用一句话概括就是:中频频率正比于目标距离。目标越远,回波延迟越大,差频就越高。这个映射关系是FMCW雷达的基石。

打个比方。假设你在山顶大喊一声,回声传回来要一段时间。脉冲雷达就像是你掐着秒表测回声时间。而FMCW更像一个不停改变音调的歌手,你听到自己歌声的回声时,声调已经比当前唱的稍微高/低了一点,通过声音的“高低差”来判断墙离你多远。这个类比虽然不严格,但直觉上非常好用。

2.3 一个关键问题:为什么不直接测时间?

这里值得多花一段解释。你可能已经发现,FMCW本质上还是把时间差翻译成了频率差。但为什么要绕这个弯子?

直接测时间差在工程上是极难做到高精度的。假设目标距离变化了1厘米,对应的时间变化是2厘米除以光速,大概66.7皮秒。想在示波器上直接测出66.7皮秒的时间差,你需要采样率高达15GHz以上的高速ADC,而且处理器要以极高的时钟频率处理这些样点,功耗和成本都爆炸。

但如果把它转换到频率域,事情就简单了。一个1GHz左右的中频正弦信号,用100MHz采样率的ADC就能采,通过FFT在这种数字信号处理算法,频率分辨率做到几十kHz甚至几kHz都很容易。而频率每1kHz的变化,对应的距离变化就是:

[ \Delta R = \frac{c}{2S} \cdot \Delta f_{IF} ]

以S=2MHz/μs为例,1kHz频率变化对应7.5厘米的距离变化。配合几百个点的FFT插值,mm级精度并不是梦。这就是FMCW体制最大的聪明之处。不是它不想直接测时间,而是它换了一个更便宜、更精确的度量衡。

2.4 用Python模拟一次单目标测距

只看公式容易飘,我把最基础的单目标场景用Python仿真一遍。假设一个24GHz雷达,扫频200MHz,Tc=100微秒,目标距离10米。

import numpy as np import matplotlib.pyplot as plt c = 3e8 fc = 24e9 # 起始频率 24GHz B = 200e6 # 扫频带宽 200MHz Tc = 100e-6 # chirp时长 100us S = B / Tc # 调频斜率 fs = 10e6 # 采样率 10MHz(用于中频信号采样) N = int(fs * Tc) # 单个chirp采样点数 t = np.arange(N) / fs R = 10.0 tau = 2 * R / c f_if = S * tau # 中频频率 = S * 2R/c print(f"理论中频频率: {f_if/1e3:.2f} kHz") # 构造中频信号(忽略幅度、初相) if_signal = np.cos(2 * np.pi * f_if * t) # 加窗后做FFT window = np.hanning(N) spectrum = np.fft.rfft(if_signal * window) freqs = np.fft.rfftfreq(N, 1/fs) # 找峰值 idx = np.argmax(np.abs(spectrum)) f_peak = freqs[idx] R_est = f_peak * c / (2 * S) print(f"FFT峰值频率: {f_peak/1e3:.2f} kHz") print(f"估计距离: {R_est:.2f} m")

运行结果应该是:

理论中频频率: 13.33 kHz FFT峰值频率: 13.33 kHz 估计距离: 10.00 m

这个仿真揭示了整个FMCW测距最原始的链路:构造中频信号、采样、做FFT、找峰、换算距离。实际雷达芯片内部做的事情,本质就是这个链路的高度工程优化版。后面所有的复杂度——多目标、测速、测角、目标检测——都是在“中频频率到距离”这个基础映射上叠加的。

3. 距离维FFT:从连续差频到离散距离门

3.1 为什么不能把模拟中频信号直接“看懂”

上一节的仿真是在理想条件下做的。实际系统里,中频信号经过放大、滤波之后进入ADC采样,变成一串离散的数值。接下来要处理的就不是连续的模拟信号了,而是一个有限长度的离散序列。对这个序列做FFT,本质是把时域信号换到频域,看它包含哪些频率分量。

FFT结果的核心意义在于:它能告诉我们中频信号里有几个不同的频率,每个频率的强度是多少。对应到物理场景,一个频率分量就对应一个目标距离上的反射。多目标场景下,中频信号是多个频率正弦波的叠加,FFT能把它们分开,就像把几个人同时说话的声音按音调高低分开一样。

但FFT不是万能的。两个目标的频率差如果小于FFT的频率分辨率,它们的频谱峰就会重叠,看起来像一个目标。这就引入了距离分辨力的概念。

3.2 距离分辨率:带宽决定的物理底线

FFT的频率分辨率取决于观测时长:

[ \Delta f = \frac{1}{T_c} ]

也就是说,chirp扫得越久,FFT频率分辨率越高。但距离分辨率跟这个没有直接关系,把(\Delta f = 1/T_c)代入距离映射公式:

[ \Delta R = \frac{c}{2S} \cdot \frac{1}{T_c} = \frac{c}{2B} ]

因为S = B / Tc,Tc正好消掉了。这个结果非常漂亮,也非常反直觉:距离分辨率只由扫频带宽B决定,和chirp时长、采样率都无关。

  • 200MHz带宽,距离分辨率 = 3e8 / (2 × 200e6) = 0.75米
  • 4GHz带宽(77GHz车载雷达常见),距离分辨率 = 3e8 / (2 × 4e9) = 0.0375米,也就是3.75厘米
  • 24GHz的模块如果带宽只有200MHz,那么区分两个相距0.75米以内的目标就很吃力

这也是为什么车载雷达普遍往77GHz频段走的原因之一。77GHz频段可以合法使用更大的扫频带宽,距离分辨率做上去,才能把汽车、行人、护栏这些紧挨着的目标分开。

需要澄清一个常见的误解:分辨率和精度是两个概念。分辨率是“两个目标能不能被区分开”的能力,物理底线由带宽决定。精度是“单个目标测出来误差有多大”的指标,可以通过插值、多次测量平均等方式提高。FFT峰值位置的估计精度可以做到远优于分辨率,这就是为什么实际雷达模块能输出厘米级甚至毫米级的距离数据。

3.3 实际FFT处理中的注意点

做距离维FFT时有几个细节,直接影响最终测距表现。用上一节的仿真代码继续说明。

第一个是加窗。矩形窗(也就是不加窗)的好处是没有频谱泄露的“主瓣变宽”问题,但旁瓣特别高,高达-13dB。在有多目标场景下,强目标的旁瓣可能掩盖掉弱目标的峰值,导致漏检。实际处理中一般会加汉宁窗或者汉明窗,把旁瓣压低到-40dB以下。代价是主瓣变宽,两个相近目标更难区分。如果你的场景是单目标测距,比如雷达水位计、料位计,那直接用矩形窗就行,分辨率最好;如果是多目标检测,比如车载雷达场景,汉宁窗是更稳妥的默认选择。

第二个是零填充(Zero Padding)。FFT的频率分辨率是fs/N,零填充不会提高物理分辨率,但可以让频谱曲线更平滑,峰值定位更准确。这是数字信号处理里典型的“知其所以然”:零填充是做插值,不是做魔法。配合抛物线插值或者chirp-z变换,可以实现亚采样级的高精度频率估计。

第三个是目标数量的问题。如果两个目标的距离差小于物理分辨率,无论怎么加窗、怎么零填充,FFT都只能看到一个胖乎乎的峰。这时候唯一的办法是增大扫频带宽。当年我在测试一款24GHz 200MHz带宽的模块时,一直纳闷为什么两个相距40厘米的角反射器在距离维上只有一个峰,看了带宽才发现这是物理规律决定的。换一款带宽更大的雷达,问题立刻消失。

3.4 多目标场景的仿真验证

把上一节的单目标扩展成两个目标,距离分别设在8.0米和8.4米,这个间距0.4米小于200MHz带宽对应的0.75米分辨率,看看FFT能不能分开。

R1, R2 = 8.0, 8.4 tau1, tau2 = 2*R1/c, 2*R2/c f_if1, f_if2 = S*tau1, S*tau2 if_signal = np.cos(2*np.pi*f_if1*t) + np.cos(2*np.pi*f_if2*t) spectrum = np.fft.rfft(if_signal * window) freqs = np.fft.rfftfreq(N, 1/fs) plt.figure(figsize=(10, 4)) plt.plot(freqs/1e3, np.abs(spectrum)) plt.xlabel("Frequency (kHz)") plt.ylabel("Magnitude") plt.title("Two targets with spacing below range resolution") plt.grid(True) plt.show()

现实中你会看到一个单峰或者一个极不明显的鼓包,根本数不出两个目标。如果把两个目标改成8.0米和9.0米,间距1米大于0.75米,FFT就能清晰地看到两个谱峰。这个实验直观验证了距离分辨率的物理决定性。

4. 测速原理:跨chirp的相位差与二维FFT

4.1 为什么一个chirp测不出速度

如果目标在径向方向上运动,回波会产生多普勒频移。中频信号的频率也会跟着变化,但问题是这个变化量相对于测距的差频来说太小了。举个例子,一个目标以10米/秒的速度径向运动,在24GHz频段(波长约12.5毫米)产生的多普勒频率约为:

[ f_d = \frac{2v}{\lambda} = \frac{2 \times 10}{0.0125} = 1600 \text{ Hz} ]

而10米距离目标对应的中频频率是13.33kHz。多普勒频移会改变中频信号频率,但如果你只用单个chirp做一次FFT,你完全无法区分“这个频率偏移是因为目标远了0.1米造成的”还是“目标以10米/秒的速度运动造成的”。距离和速度在单chirp里是耦合的,解不开。

这是单chirp原理决定的盲区,再好的ADC也救不了。必须从另一个维度寻找速度信息。

4.2 速度测量的突破口:相位对微小位移的极度敏感

虽然一个chirp中的频率变化难以区分多普勒,但相位对这个微小变化却极其敏感。再回头看看中频信号的相位表达式。忽略那个极小的二次项,中频信号在t=0时刻的相位为:

[ \phi_{IF}(0) = 2\pi f_c \tau = 2\pi f_c \frac{2R}{c} = \frac{4\pi R}{\lambda} ]

也就是说,目标距离变化半个波长,中频信号的初始相位就旋转整整一周。24GHz雷达波长12.5毫米,目标移动6.25毫米,相位就转了一圈(360度)。这种灵敏度简直可怕。

连续发射两个chirp,如果目标在chirp间隔时间内移动了微小距离(\Delta R),那么两个chirp的中频信号之间就有一个相位差:

[ \Delta \phi = \frac{4\pi \Delta R}{\lambda} ]

目标径向速度为v,chirp间隔为(T_c)(在实际系统中,chirp间隔时间就是chirp周期,因为chirp是一个接一个发的),那么(\Delta R = v T_c),于是:

[ \Delta \phi = \frac{4\pi v T_c}{\lambda} ]

速度v就可以通过相位差除以时间换算出来。但这里有一个容易被忽略的前提:这个相位差必须对同一个距离门(range bin)的中频信号来讲。所以标准做法是先做距离维FFT,然后观察同一个距离门在不同chirp之间的相位变化。

4.3 二维FFT:把每个距离门当做一个慢时间序列

假设一帧里发N个chirp。接收到的中频信号采样后整理成一个二维数组,行是快时间(快时间轴,即每个chirp内的采样点),列是慢时间(慢时间轴,即chirp序号)。先沿快时间维FFT,得到距离维频谱,此时每一列是某个chirp对应的距离频谱。再做一次FFT,这次沿慢时间维进行,就把每个距离门上的相位变化转换成了多普勒频率。

多普勒频率和速度的关系:

[ f_d = \frac{2v}{\lambda} ]

把多普勒频率和相位差对照起来看,慢时间维做FFT的本质,就是把跨chirp的相位旋转速度转化为频率峰。这个二维频谱通常叫range-Doppler Map(RDM),也就是距离-多普勒图。

一次完整的处理流程:

  1. 一帧内采集N个chirp,每个chirp采样M个点,得到N×M矩阵
  2. 对每一行(每个chirp)沿快时间做M点FFT,得到距离维频谱
  3. 对距离维频谱的每个距离门,沿慢时间做N点FFT,得到多普勒频率
  4. 二维矩阵的每个单元格就代表某个距离和某个速度上的能量

看一段仿真代码,模拟一个距离10米、速度5米/秒的目标:

N = 128 # chirp数量 M = N_fft_time # 每chirp采样点数,沿用上一个值 v = 5.0 # 目标速度 m/s lambda_ = c / fc # 波长 rdm = np.zeros((N, M)) for n in range(N): tau_n = tau + (v * n * Tc) / c # 每次chirp目标距离微变 phi_n = 2 * np.pi * fc * tau_n rdm[n, :] = np.cos(2 * np.pi * f_if * t + phi_n) # 快时间维FFT range_fft = np.fft.fft(rdm * window[np.newaxis, :], axis=1) # 慢时间维FFT(做在目标所在距离门) target_bin = np.argmax(np.abs(range_fft[:, :M//2]).sum(axis=0)) doppler_fft = np.fft.fftshift(np.fft.fft(range_fft[:, target_bin])) doppler_freqs = np.fft.fftshift(np.fft.fftfreq(N, Tc)) speed_axis = doppler_freqs * lambda_ / 2 peak_idx = np.argmax(np.abs(doppler_fft)) v_est = speed_axis[peak_idx] print(f"估计速度: {v_est:.2f} m/s")

输出应该是5.00米/秒左右。这就是二维FFT测速的基本思路。

4.4 速度模糊、最大不模糊速度和速度分辨率

慢时间FFT直接定义了速度的性能边界。多普勒频率的可见范围由慢时间采样率决定,也就是脉冲重复频率PRF,这里等于1/Tc:

[ f_{d,max} = \frac{1}{2T_c} ]

对应的最大不模糊速度:

[ v_{max} = \frac{\lambda}{4T_c} ]

Tc越小,能测的速度范围越大。但Tc太小又会限制最大测距(因为中频信号的采样需要时间)。另外速度分辨率由多普勒FFT的总观测时间决定:

[ \Delta f_d = \frac{1}{N T_c} ]

[ \Delta v = \frac{\lambda}{2 N T_c} ]

这就出现一个典型的工程矛盾:帧长NTc越长,速度分辨率越好,但帧率会下降;同时跨chirp的相位差如果超过π,就会出现速度模糊,需要解模糊算法。实际参数设计基本就是在这几个约束之间取折中,没有任何一组参数能同时满足所有性能最大值。

5. 波形参数设计:最大测距、距离分辨率、速度分辨率背后的权衡

5.1 参数设计与四个关键指标的硬约束

前面推导的公式已经足够支撑一次完整的雷达波形参数设计。设计过程中的核心参数和物理约束汇总如下:

设计指标决定参数表达式设计偏好
距离分辨率扫频带宽Bc / (2B)B越大越好
最大测距ADC采样率fs与调频斜率Sc·fs / (2S)fs越大或S越小越好
最大不模糊速度chirp周期Tcλ / (4Tc)Tc越小越好
速度分辨率chirp数N与Tcλ / (2·N·Tc)N·Tc越大越好

这里有一个非常值得注意的连锁关系:最大测距公式是R_max = c·fs / (2S),而中频频率不能超过ADC采样率的一半(奈奎斯特定理)。如果调频斜率S太陡,同样距离对应的中频频率就高,ADC可能采不到。所以设计时往往是先定好最大距离和ADC采样率,反推允许的S;再根据距离分辨率需求定B;然后根据波长和v_max定Tc;最后根据速度分辨率需求定N。

5.2 一个实际波形参数的完整设计实例

以一款24GHz模块宣称的最大测距40米为例,试着反推它的设计思路。

  • 目标距离40米,对应的中频频率f_IF = S·2R/c。如果选择100MHz的采样率(这是市场上常见工业雷达芯片的典型值),那么f_IF必须小于50MHz,即S·2·40/c < 50MHz,可算出S < 187.5MHz/μs。工程上留出裕量,取S约150MHz/μs。
  • 如果带宽B取200MHz,那么Tc = B/S = 1.33μs。这个chirp长度在24GHz应用里偏短,但用于40米测距是够用的。
  • 24GHz波长约12.5mm,最大不模糊速度v_max = λ/(4Tc) = 12.5mm / (4×1.33μs),约等于58.6m/s,也就是211km/h。对于车载场景,这个上限足够覆盖绝大多数道路情况,但对高速相向行驶的极端场景可能不够。
  • 如果一帧发射128个chirp,速度分辨率Δv = λ / (2·N·Tc) = 0.458m/s。这个分辨率对常规交通场景足够把行人、自行车、汽车区分开。

换个场景,如果同样一个24GHz模块要兼顾生命体征监测,那就完全是另一套参数了。人体呼吸引起的胸腔起伏只有几毫米到十几毫米,心跳引起的起伏更小(0.1~0.5毫米),速度极慢(每秒几毫米到几厘米),但要求相位测量精度极高。这时候需要把chirp做得更短?实际上不是——生命体征检测更关注的是长时间相位稳定性和极低噪声,所以通常不追求大带宽长chirp的定位精度,而是用短距离门内的相位变化连续观测几十秒。

这再次说明,没有一套波形参数是万能的。做产品定义时先想清楚第一需求是测距、测速,还是微动监测,再来决定S、B、Tc和N。

5.3 24GHz与77GHz的参数差异

很多人问:同样是FMCW雷达,24GHz和77GHz除了频率不同到底差在哪。最大的差异还是带宽。24GHz的ISM频段在中国和欧洲可用带宽只有200MHz左右,算出的距离分辨率极限约0.75米。而77GHz频段可用的带宽达到4GHz甚至更大,距离分辨率能做到3.75厘米。这让77GHz雷达在车载多目标场景里的优势是降维打击式的。

波长也带来了测速上的差异。77GHz波长约3.9mm,比24GHz的12.5mm短得多,同样速度对应的多普勒频移更大,速度分辨率更好,但对微小振动的敏感度也更极端——这意味着同样的振动幅度会产生更大的相位变化,利于感知微动,但也意味着对机械振动、热漂移等干扰更敏感。做4D毫米波雷达、点云成像这类产品,77GHz基本上是必然选择;做简单的物位计、道闸雷达、区域安防,24GHz足够了,成本低、开发门槛也低。

5.4 天线与射频链路对测距性能的影响

波形参数只决定了信号处理的理论极限,实际系统的测距精度还受射频前端性能制约。这里把影响链路最终性能的几个因素一并列出来,方便你在选型和评估时心里有个数。

  • 相位噪声:FMCW对相位噪声敏感的原因在于,混频后的中频信号来自两个有相位噪声的信号的差。如果本振和回波之间存在时间延迟,相位噪声就无法完全对消,会在中频上表现为噪声边带。这个噪声边带落在目标峰旁边,会抬高噪声底,弱目标容易被淹没。
  • VCO的非线性调频斜率:理想的chirp是完美的线性扫频,实际VCO的调频曲线并不是严格直线,会有非线性。非线性会导致中频信号不再是纯的单频,频谱会展宽,距离维分辨率下降。现代雷达芯片一般内置DLL或PLL来做线性化校正,低成本的24GHz模块可能没有这个校正,这就是同是“200MHz带宽”,不同模块实测距离分辨率差异很大的原因之一。
  • ADC的有效位数:中频信号的动态范围由强目标和弱目标的回波强度差决定。如果ADC位数不足,弱目标会被量化噪声淹没,表现为检测距离缩短。24GHz雷达中频信号不会特别大,12位ADC是常规配置,16位更好但功耗上去。

6. 工程实现时的信号处理链路与后续扩展方向

6.1 从原始ADC数据到距离-多普勒图的完整链路

把前面的原理串成工程上可落地的信号处理链,大致是这样一条流水线:

  1. 混频并滤波得到中频信号
  2. ADC以fs采样,每个chirp得到M个复数基带采样点(IQ两路,或者单通道实采样后用希尔伯特变换构造解析信号)
  3. 按帧组织数据,一帧包含N个chirp,形成N×M矩阵
  4. 对每个chirp做距离维FFT,加上窗函数抑制旁瓣
  5. 对每个距离门做慢时间维FFT,得到RDM
  6. (后续接入CFAR检测、峰值提取、聚类、跟踪、测角)

这套链路在几乎所有FMCW雷达芯片上都是标配。如果你用的模块SDK提供了原始adc数据接口,你完全可以按这套流程自己实现一版完整的信号处理链路。很多国产24GHz模块和部分77GHz开发板都开放了这种模式,适合底层学习和算法验证。

实际做嵌入式实现时,有两个容易踩的坑。一个是FFT点数与采样点数不一致时,距离门对应的物理距离有偏移;另一个是窗函数带来的能量缩放,会影响后续CFAR阈值的标定。处理这些细节时,建议先在PC上用Python或MATLAB完成完整链路仿真,确认算法逻辑无误,再搬到DSP或FPGA上优化。直接上手硬件调参效率太低,而且极难排查问题。

6.2 距离-多普勒图上还能做哪些事情

RDM生成的频率峰值只是“候选目标”。在实际场景中,噪声、杂波、多径、旁瓣都会产生虚假峰。所以CFAR检测几乎是标配后续处理。CFAR的基本思路是在每个距离-多普勒单元周围设置一个保护窗口和一个参考窗口,用参考窗口的统计噪声水平动态计算检测门限,目标能量必须超过该门限才判定为目标。

CFAR算法派生出了很多变体,比如CA-CFAR(单元平均)、GO-CFAR(最大选择)、OS-CFAR(有序统计)。车载雷达场景中,杂波空间分布不均匀,OS-CFAR在防掩膜方面表现更好,但计算量更大。24GHz的简单安防雷达用CA-CFAR就够。

再往上层走,就是对检测出的点云做聚类和跟踪。雷达输出的不是“图像”而是稀疏点云,每个点有距离、速度、角度、RCS等信息。经典的处理方式是DBSCAN聚类后,再用卡尔曼滤波器做轨迹关联。4D毫米波雷达的火爆本质上是把角度维做精了,点云密度提高了,使这个链路在自动驾驶场景下更有价值。

6.3 FMCW技术在高价值场景中的应用方向

热词里有一串和FMCW毫米波雷达强相关的方向,简单展开说说。

毫米波雷达生命体征监测:FMCW的高相位灵敏度让它可以检测到人体胸腔的微米级运动。呼吸频率约0.2~0.5Hz,心跳约1~1.7Hz,这些极低频率的信号表现为某个距离门相位的缓慢变化。关键不在硬件而在信号处理的稳定性:需要长时间连续观测,用带通滤波把呼吸和心跳分量分开,同时消除身体随机运动的干扰。这项技术现在做跌倒检测、车内儿童存在检测、睡眠监测的产品很多。

24GHz毫米波雷达模块40m测距:这正是前面参数设计实例里的应用,通常做货架检测、道闸触发、水位测量、工业安全防护等。这类场景对距离分辨力要求不高,但对成本、功耗、可靠性要求高。选型时重点看S和fs参数是否匹配目标距离,以及是否支持多个chirp配置组,有的场景一个雷达需要短距离高精度和长距离低精度两套波形轮换工作。

4D毫米波雷达:在距离、速度、俯仰角、方位角四个维度同时输出目标信息。这需要多收多发天线阵列,多通道接收后做数字波束成形或者MIMO虚拟阵列信号处理。原理层面还是FMCW,只是把测角提到了和测距测速同等重要的位置。

毫米波雷达目标检测与C++ FFT程序:很多工程师拿到雷达模块后,第一件事是把ADC数据拉出来自己在C++里写FFT。主流的做法是用FFTW库或者CMSIS-DSP(Cortex-M平台)。写这类程序时特别注意定点数转浮点数的效率、FFT输出幅度的归一化、以及双精度/单精度选择。实际测试中发现,单精度FFT在大多数场景下完全够用,但做相位差分测速时,单精度的相位误差可能导致速度抖动,需要小心处理。

毫米波雷达与摄像头的目标时空同步:这是多传感器融合里最头疼的问题之一。雷达输出的是目标级别的稀疏数据,摄像头输出的是像素级的稠密数据,二者坐标系、时间戳、数据率都不同。工程上需要做外参标定、时间对齐(一般以高帧率传感器时间为主,低帧率插值)、然后做特征级融合。FMCW雷达的好处是目标距离和速度非常准,正好补足摄像头在测距和夜间场景的短板。

6.4 从原理到产品:这一篇之外的东西

写完这些,回头再看“FMCW毫米波雷达原理一”这个主题,其实核心就是把“距离怎么测、速度怎么测”这回事彻底讲清楚。这一篇的侧重点是体制的数学原理和基础信号处理链路,很多现实工程问题——天线阵列校准、多径抑制、干扰规避、目标跟踪、传感器融合——都需要在这个基础上逐层展开。

我给想深入研究的朋友一个实操建议:选一款支持原始ADC输出的评估板,不要直接用SDK里的现成算法,自己动手写一遍从IF信号到RDM再到CFAR的完整链路。我当年第一次把自写算法的检测结果和模块SDK的输出并排对比时,那种“原来信号长这样”的豁然开朗感觉,比读十遍论文都管用。这一篇的内容足够支撑你完成第一版原理验证,后面的大坑,我们下一篇继续填。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询