
1. 还没到相位之前先把中频信号这关过了很多初学者看毫米波雷达的资料一上来就撞上中频信号的相位这个坎。我最早接触这块内容的时候也栽过跟头——光顾着盯频率、幅度相位完全没当回事结果后面看多普勒测速、MIMO测角的原理文章每一篇都云里雾里。后来才明白相位才是把距离、速度、角度这三件事串起来的那根线。这篇内容就聚焦在中频信号的相位这个基础点上扒开讲讲相位到底是怎么产生的、和哪些物理量挂钩、在真实雷达信号处理链路里又是怎么被使用的。适合刚入门毫米波雷达的同学也适合做了几年嵌入式或者射频测试、想回头把信号模型捋清楚的人。先说结论中频信号的相位本质上是发射信号与接收信号之间相位差在混频之后的投影。理解了这句话后面所有关于测速、测角的运算都会顺理成章。但这句话展开来牵扯到FMCW调制方式、混频器的工作机制、ADC采样时机等一系列问题。别急我们从最基础的天线收发链路一步步走。2. 中频信号是怎么造出来的2.1 一个收发链路的基本盘典型毫米波雷达前端比如TI的IWR1443、IWR6843这类单芯片方案内部的工作逻辑其实没想象中复杂一片信号源产生线性调频连续波FMCW经过功分器分成两路——一路直接送到混频器的本振端口另一路经发射天线辐射出去辐射出去的电磁波遇到目标反射回来被接收天线拾取进入低噪声放大器放大再送到混频器的射频端口两路信号在混频器里相乘输出的差频分量就是我们说的中频信号。注意这里有个容易忽略的细节混频器做的是乘法而乘积会产生两个分量——和频与差频。低通滤波器会把和频分量滤掉留下来的差频分量才是中频信号。而在FMCW体制下这个差频分量刚好携带了目标的距离和速度信息角度信息则藏在不同接收天线之间中频信号的相位关系里。2.2 FMCW的调频斜率与差频线性调频连续波发射频率随时间线性变化斜率用S表示单位是MHz/μs。一个chirp的周期通常只有几十微秒在这么短的时间内如果目标是静止的接收信号就是发射信号的一个时延副本。设目标距离为R电磁波往返时间τ 2R/cc是光速那么在第t时刻接收频率与本振频率之差就是 S·τ这个差值就是中频频率f_IF。例如S 30 MHz/μsR 5 m则τ 2×5/(3×10^8) ≈ 33.3 nsf_IF 30×0.0333 ≈ 1 MHz。这个频率落在MHz量级ADC采样毫无压力。但很多人没有继续往下多想一步中频信号除了频率还有个初相位这个相位的值等于什么2.3 中频信号的完整表达式把FMCW发射信号写出来用实信号形式s_T(t) A·cos(2π·f_c·t π·S·t² φ_0)其中f_c是起始频率φ_0是初始相位。接收信号经历了往返时延τ并且幅度衰减再叠加噪声s_R(t) A·cos(2π·f_c·(t-τ) π·S·(t-τ)² φ_0)混频器把这两路相乘经过低通滤波后中频信号的相位可以近似写为φ_IF 2π·f_c·τ π·S·(2t·τ - τ²)这里第一项2π·f_c·τ是主导项第二项里Sτ²的数值在短距离场景下小到可以忽略。把τ 2R/c代入第一项变成4π·f_c·R/c。因为波长λ c/f_c所以又可以写成φ_IF ≈ 4π·R/λ这个表达式是整个相位问题的核心。它说明中频信号的初相位和目标的距离R成正比比例系数是4π/λ。λ在77GHz频段大约是3.9mm也就意味着目标每移动不到1mm中频信号的相位就会偏转接近一圈。这种微小的距离变化引起剧烈相位变化的特性正是雷达能够测出亚毫米级位移的物理基础。2.4 为什么用复信号表示中频更好单独一路中频信号在模拟域就是个余弦波但进入数字域之后我们通常不直接拿实数采样来算相位而是经过I/Q双通道解调得到一组复数序列x[n] I[n] j·Q[n]这样做的理由很直白实数余弦波cos(2πftφ)在频谱上有正负两个对称分量直接用FFT看不出来相位方向而复数信号e^(j(2πftφ))只有一个方向的频率分量相位就是复数向量与实轴之间的夹角取atan2就能直接算出来。很多做软件的同学刚开始用实数ADC数据发现atan2的结果正负乱跳就是因为没有I/Q两路信息相位方向无法唯一确定。这算是一个高频踩坑点我后文还会再提。3. 相位是怎么牵着距离、速度、角度的3.1 相位差解微小位移从干涉说起如果有两帧中频信号分别对应目标在位置R1和R2二者的相位差为Δφ 4π(R2 - R1)/λ。只要ΔR远小于距离分辨率分辨率由带宽决定带宽大时可达厘米级频率上的变化几乎看不出差别但相位上的变化很明显。打个比方中频信号的频率告诉我们目标在几米这个量级上待在哪而相位则告诉我们目标在零点几毫米这个量级上动了多少。两者一个管大数一个管小数配合使用才能实现高精度的位移测量。我实际测过一个人体呼吸的静态场景人坐在雷达前约1米处胸腔起伏幅度大约为5~12mm。在77GHz频段λ约3.9mm5mm的位移意味着约4.6π的相位变化。只要连续采集chirp提取每个chirp中频信号的相位就能画出胸腔起伏的波形甚至能区分呼吸和心跳两个频段呼吸约0.2~0.5Hz心跳约1~1.7Hz。这就是生命体征雷达的基本原理而核心只依赖一件事——相位对微小位移的敏感度。3.2 相位差测速度多普勒效应的另一种理解传统多普勒理论说的是频率变化运动目标会让接收信号产生多普勒频移f_d 2v/λ其中v是径向速度。在FMCW雷达里单个chirp时间极短多普勒频率在单个chirp上的体现微乎其微但在脉冲间chirp与chirp之间看目标移动了ΔR v·T_cT_c是chirp周期于是中频信号的相位变化为Δφ 4π·v·T_c/λ这一串chirp按照时间排开每个chirp对应一个相位点构成一个以多普勒频率为频率的复指数序列。对这个序列做FFT也就是常说的多普勒维FFT就能提取出v。这里有个容易混淆的点不少人以为多普勒频率f_d直接出现在中频信号的频率上其实要分场景。静止目标中频频率只和距离相关运动目标在单个chirp期间多普勒频率会叠加进中频频率但这个频偏量极小——比如v10m/sλ3.9mmf_d≈5.1kHz而中频频率动辄几百kHz甚至上MHz在几十微秒的采样窗口里这点频偏很难被单chirp的FFT分辨出来。真正可靠的做法是跨chirp比相也就是通过相位序列来提取速度这也是为什么测速的核心算法叫多普勒FFT拿进去的是复数相位序列而不是单chirp的中频波形。3.3 相位差测角度阵列雷达的本质假设置雷达有N根接收天线间距d远场目标来向与法线夹角为θ那么相邻天线之间的波程差是d·sinθ换算成相位差是Δφ 2π·d·sinθ/λ目标回波在N根天线上产生的相位分别相差这个值所以对N个天线通道同一时刻的中频复数样本做FFT角度维FFT峰值对应的频点就对应着sinθ再反算θ即可。这里相位的作用就更为直接了。可以说角度测量的全部信息都存在于中频信号的相位里。工程上通常要求d不超过λ/2否则会出现栅瓣更大的间距虽然能提高测角分辨率但会牺牲无模糊角度范围这是一个经典矛盾。3.4 一个公式串起三个维度把前面几节串起来做个总结距离维单个chirp中频信号的频率 f_IF S·2R/c速度维相邻chirp之间中频信号的相位差 Δφ 4π·v·T_c/λ角度维相邻天线之间中频信号的相位差 Δφ 2π·d·sinθ/λ这个总结是我当年自己梳理出来的建议你也拿张纸自己推导一遍。三个维度各自依赖的FFT虽然算法形式上一样但输入的到底是什么数据、怎么reshape数据阵是完全不同的。很多人把Range-Doppler-Angle三个FFT连起来做却不知道为什么是先距离、再多普勒、最后角度的顺序根子上就是对相位在哪个维度发挥作用没有建立清晰的图景。4. 实操中的相位提取与避坑4.1 从ADC原始数据到相位值前端输出的是I/Q两路ADC数据通常在DSP里以复数数组存成一个Range-Doppler矩阵。以TI的毫米波雷达为例一帧数据里包含M个chirp每个chirp包含N个采样点整体数据可以看作N×M的矩阵行方向是快时间距离维列方向是慢时间多普勒维。提取某个距离单元的相位步骤大概是这样的第一步对每个chirp的N个采样点做距离维FFT加窗通常用Hamming或Hanning来压低旁瓣得到一个距离谱序列。第二步找到目标所在的距离单元索引r_idx。通常在静态场景下先做一帧积累的平均幅度谱挑峰值位置也可以用CFAR检测来定。第三步取所有chirp在r_idx处的复数幅值组成一个长度为M的复数向量。这个向量的每个元素的幅角就是对应chirp在中频信号上的相位。第四步对这个复数向量做多普勒维FFT仍然加窗峰值对应的频率即多普勒频率而峰值本身的相位是目标回波在某个初始时刻的相位。这在数学上每一步都是I/Q复数的线性操作所以相位信息不会丢。很多初学者有一个误区觉得FFT之后相位信息就没了其实恰恰相反——FFT之后幅角里保存了目标回波的初始相位和跨chirp的相位演变只不过它们被分散在不同的FFT bin里。4.2 I/Q不平衡相位精度的第一杀手理想情况下I路和Q路应该幅度完全相同、相位严格相差90度。到了实际硬件上射频通道的混频器、运放、ADC难免引入误差导致I/Q不平衡。常见症状是直流偏置不为零、I/Q增益不一致、正交相位误差不等于90度。这些问题最终都会体现为复信号星座图上圆环变成了椭圆、圆心偏离原点。在提取相位时圆心偏移会直接给幅角带来畸变——尤其当信号幅度小、距离远时稍微一点直流偏置就可能让相位读数的误差大到完全不可用。处理办法分几种在样本足够多时做校准采集一段无目标回波的底噪数据估算直流分量并在后续信号中扣除这是最容易实现的一种补偿。用系统校准流程TI等厂商的mmWave SDK里本身带了校准引擎可以测出I/Q增益和相位失配参数在DSP里做2x2矩阵校正。如果批量生产需要在产线上做每个通道的出厂校准把校准系数烧到板子的非易失存储里。我第一次做生命体征雷达的时候完全没有意识到I/Q不平衡的影响。波形图上明明能看到呼吸的起伏但抖动量很大后来排查了很久发现是I路和Q路的增益差达到1.5dB导致相位解算误差在5度以上。换算成位移误差大约是5度/360度×3.9mm ≈ 0.054mm看着不大但连续波段的抖动叠加后信噪比就显著下降。4.3 相位解缠别让atan2把你坑了atan2的返回值范围是(-π, π]也就是说真实相位如果跨越了这个区间提取出来的相位就会出现跳变。比如目标微动超过λ/2约2mm相位变化就超过一圈就会看到相位在±π之间跳变。这种跳变处理不当会让后续的速度估计、位移曲线出现毛刺。常用解法是相位解缠检测相邻相位值的差值如果大于π就减去2π如果小于-π就加上2π把相位序列拉成连续曲线。具体伪代码如下def unwrap_phase(phase): unwrapped [phase[0]] for i in range(1, len(phase)): delta phase[i] - phase[i-1] while delta np.pi: delta - 2 * np.pi while delta -np.pi: delta 2 * np.pi unwrapped.append(unwrapped[-1] delta) return np.array(unwrapped)注意一个细节相位解缠依赖相邻采样点之间的真实相位差小于π否则会出现模糊。如果chirp周期太长、目标运动速度太快采样率不足解缠结果就会出错。具体来说就是不等式4π·v·T_c/λ π必须成立解出来v_max λ/(4T_c)这个约束和经典多普勒测速模糊公式v_max λ/(4T_c)完全一致。所以反过来看设计chirp周期的时候就要先算好目标最大径向速度否则后面无论怎么做解缠都救不回来。4.4 相位噪声与信噪比的权衡相位噪声来自本振源的不理想。FMCW雷达的线性调频源如果相噪性能差中频信号的相位会产生随机抖动。这种抖动和热噪声是叠加的前者直接影响相位读数后者影响复数的幅值提取相位时两者都会折算到角度误差上。工程上有一个很实际的现象目标回波越强相位提取越干净回波一旦接近噪底相位就变成一堆乱码。原因在于噪声在I/Q平面上叠加在信号矢量端点上噪底越高矢量端点的扰动越大对应角度误差越大。定量上相位误差的均方根值大约为1/sqrt(2·SNR)。如果你想让相位精度达到1度SNR必须超过20dB以上。这个数在很多应用里是想当然达不到的不然相位法测位移也不会只适合近距离、强反射目标。我在调机器人避障雷达的时候试过用同样的算法跟踪远处墙面距离8米时的相位抖动比0.8米处大了将近一个数量级就是因为远距回波SNR衰减太厉害。所以做相位提取之前先看看Range-Doppler谱上目标峰值高出噪底多少dB低于15dB的基本就不要指望相位有多准了。5. 工具箱与上手建议5.1 用现成芯片快速验证相位模型对大多数人来说自己搭射频前端不太现实。更快的路径是拿一块TI的IWR1443BOOST或者IWR6843ISK这类的评估板直接用毫米波SDK采集原始ADC数据在MATLAB或者Python里复现整条信号处理链路。这类板子原始数据格式为复数浮点获取Phase数据不需要额外硬件纯软件就能完成。我习惯的做法是先用官方demo跑通一个标准的目标检测然后把输出从目标点云切换到距离维复数数据自己写FFT和相位提取代码。这个过程能帮你在真实数据上验证理论上推的公式到底和实际吻合度有多高。我建议的起步练习是第一步在雷达前面放一个角反射器或光滑金属板位置固定在1米左右。采集一帧原始数据。第二步画出距离维FFT幅度谱确认目标峰值位置。第三步提取该峰值在连续几十个chirp上的相位序列用unwrap处理之后看看是否平稳。注意如果板子有通风振动或者桌面有共振相位序列会出现周期性起伏。第四步用手以极慢的速度前后移动目标哪怕只有零点几毫米的位移观察相位波形。你大概率会发现即使没有任何精确的移动平台手部微小颤动都能被雷达捕捉到这就是相位灵敏度的直观体现。5.2 仿真先行没有硬件也能把原理吃透如果你手头暂时没有硬件用MATLAB也好、Python也好都能先做一些一维仿真来验证相位推导。仿真步骤就是按第二节的公式生成发射信号手动加上延时产生接收信号混频低通后得到中频复数信号再做FFT、提相位、看相位的演变规律。我当年自己写过一段很小的Python脚本验证多普勒相移公式。设置S30MHz/μsf_c77GHz目标以v1m/s远离雷达chirp周期T_c100μs理论上相邻chirp之间的相位差应该是4π×1×1e-4/3.9e-3≈0.3225rad。仿真得到的相位差和理论值误差在1%以内当时的第一反应是这么简单的东西竟然能对上后来才意识到正是这种简单的推导构成了整套雷达信号处理的基石。仿真里还会发现一个有意思的事如果把目标速度调大使相位差逼近π多普勒FFT会出现模糊超过π后峰值的速度估计会跳到一个错误的正负方向。这个现象在教科书上写得很枯燥但亲手跑到之后你的理解深度和看公式完全不是一个级别。5.3 三种FFT维度数据的组织形式用代码写Range-Doppler-Angle处理时最常出错的就是数据维度的reshape。整理一下标准流程假设一帧数据由K个chirp组成每个chirp有N个采样点接收天线数为Rx。那么ADC原始数据可以组织成一个三维数组axes: (N, K, Rx)第一步沿着N轴做距离FFT得到(N, K, Rx)的距离谱数据。第二步对距离谱数据沿着K轴做多普勒FFT得到(N, K, Rx)的Range-Doppler谱。第三步取某个距离-多普勒峰值的索引(n0, k0)把这个索引在所有Rx天线上的复数取出来得到长度为Rx的向量对这个向量做角度FFT峰值位置对应来波方向。很多初学者搞不清楚为什么要分开处理三个维度而不是一次做三维FFT。数学上当然可以做三维FFT但它把所有信息混在一起不便于逐级做滤波、CFAR检测和门限处理。分步处理的好处是每一级都可以加入独立的算法逻辑比如距离维加窗压低旁瓣速度维做MTD动目标检测角度维做超分辨算法MUSIC、ESPRIT灵活得多。6. 常见问题与排查技巧实录6.1 相位乱跳一帧一个样这是最常见的现象。多数情况下是目标太弱SNR不足噪声主导了相位提取结果。排查路径建议先看Range-Doppler谱上目标峰值旁瓣高度确认SNR是否在15dB以上检查目标是否在雷达的波束范围内比如墙角目标可能在距离谱上露出一半旁瓣排查是否存在强干扰源比如附近Wi-Fi、5G频段对77GHz的影响虽然小但板内数字噪声耦合到射频前端的情况并不少见手动把雷达和目标都用三脚架固定排除机械抖动还有一种情况目标明明静止但相位呈周期性变化。这时重点查电源开关电源的纹波调谐到VCO上会让发射频率产生周期性偏移最终体现为相位上的50Hz/100Hz成分。给板子换线性电源往往立刻见效。6.2 测速方向反了多普勒FFT的峰值出现在正频率还是负频率对应目标的径向运动方向是靠近还是远离。如果方向反了大概率是I/Q极性接反也就是I路和Q路的正负号标定搞反了。在接收链路里I/Q两路谁为正、谁是负会影响复数的旋转方向。排查方法是在雷达正前方把手机/钥匙从近向远匀速移动分别记录峰值在多普勒谱的哪个符号侧。如果和预期相反在代码里做复共轭或交换I/Q两路再重新验证。注意不同平台的ADC采样顺序可能不同TI平台里I/Q采样顺序是固定但如果你自己做的板子是分时采样且ADC通道映射和代码假设不一致就会出现这个经典问题。6.3 距离FFT的峰值位置和理论距离对不上这个问题的根子通常不在相位而在起始频率和调频斜率标定不准。一般有两种可能一是调频斜率S有偏差实际值和寄存器配置值不一致导致同样的时延算出不同的中频频率。这种情况在宽温场景下尤其明显温度变化会让VCO特性漂移。二是FFT频率分辨率限制。FFT频率最小分辨率为fs/N换算成距离分辨率是c/(2B)B是扫频带宽。比如B4GHz时距离分辨率约3.75cm。目标在1.04m处和1.02m处峰值可能落在同一个bin上这时相位才是分辨二者微小差别的关键。6.4 相位解缠失败曲线出现锯齿这个问题的根子通常在chirp周期过长相邻chirp之间的相位差超过π。比如你的目标最快径向速度是2m/schirp周期是150μs那么相邻chirp相位差是4π×2×150e-6/3.9e-3≈0.97rad还没超限如果速度到3m/s相位差就超过π了解缠就会出错。处理方法很直接缩短chirp周期或者减小调频周期内的占空比。还有另一种思路是提高雷达的工作频率比如从60GHz换到77GHzλ变短相位变化速度反而更快这会让速度模糊问题更严重所以频率选择上需要权衡。6.5 相位精度不够用如果你的应用对相位精度要求很高比如位移测量要优于0.1mm那么除了提升SNR之外还需要做系统级的校准。主要包括幅度和相位校准通过已知位置的角反射器标定每个天线通道的幅相响应温度校准记录不同温度下的相位偏移建立查找表补偿逐个器件校准混频器、放大器、ADC的通路延迟都要做延迟校准在77GHz频段1ps的延迟差异在相位上大约是0.28度2π×77e9×1e-12≈0.48rad这里需要仔细算1ps×77e9×2π≈0.48rad≈27.7度可见延迟校准多么敏感。通路里任何一个微小的长度差异或器件延迟漂移都会以相位误差的形式呈现出来。7. 从相位出发还能往哪走中频信号的相位这个知识点的价值不只是应付考试或者看懂论文它是连接理论与实践的一座桥。顺着相位这条线索往深处走你可能会对下面几个方向产生兴趣微多普勒效应运动目标上不同部位的微动旋转、振动会在相位上调制出边带这就是微多普勒分析的基础常用于无人机桨叶识别、人体动作识别等。干涉雷达InSAR利用不同时刻观测的相位差生成地面形变图分辨率可以达到毫米级甚至亚毫米级。地质监测、桥梁形变监测都用这个原理。太赫兹与光子雷达更高频率的雷达波长更短相位对微小位移的敏感度更强但要同时应对相位噪声更大、高精度系统校准更难的问题。我自己在这条路上踩过不少坑总结下来最重要的一点是分析问题时先回到物理模型动手写代码之前先把信号流、相位变化用笔推出来。很多看似复杂的信号处理问题只要弄清了哪个维度的FFT吃的是哪一组复数数据、相位在哪个维度起作用思路立刻清晰。最后再分享一个我实际操作中的小技巧调试相位相关算法时不要只看最终曲线务必把中间级的变量每个chirp的复数向量、unwrap前后的相位、SNR估算值全部打印出来逐帧对照。有一次我花了整整半天最后发现是一个信号从float转换到int时截断了低8位导致相位抖动量异常。这种问题只看最终位移曲线无论如何也定位不到只有对照中间变量才能一眼揪出来。希望这篇内容能帮你少走一些我当年走过的弯路。