ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

FMCW TDMA-MIMO雷达仿真从距离多普勒谱到点云输出的完整实现与DDMA对比

FMCW TDMA-MIMO雷达仿真从距离多普勒谱到点云输出的完整实现与DDMA对比 做毫米波雷达算法这几年的一个体会是调参的时间永远比写原理的时间多。前阵子重新整理了一套FMCW TDMA-MIMO雷达信号处理仿真从波形生成到距离-多普勒谱、从角度估计到目标点云输出一条链路走通。更关键的是这套框架只需要改动发射波形组织和慢时间维补偿就可以切换成DDMA-MIMO模式很适合用来对比两种多址方式在测速、测角上的真实差距。这篇文章把我搭建这套仿真的完整思路、关键代码片段和踩过的坑都记录下来目标读者是正要入门雷达仿真的同学、做雷达算法验证的工程师以及需要快速复现MIMO测距测速测角链路的研究人员。内容偏工程实践理论只讲够用的程度但保证每一步都有出处、能落地。1. 动手之前先把FMCW毫米波雷达仿真的底层逻辑理清1.1 一帧雷达数据里到底藏着哪几个维度很多刚接触毫米波雷达仿真的朋友一上来就拿着别人的代码跑Range-FFT跑完不知道中间结果长什么样。我建议先建立一个数据体感一次完整发射采集下来的数据至少有三维——快时间维、慢时间维、通道维。快时间维对应单个chirp内部的时间采样点也就是ADC采出来的那一串点。它决定距离维信息因为目标越远回波时延越大中频频率越高。慢时间维对应同一根收发通道上连续多个chirp的采样它决定多普勒维信息目标径向速度越快相邻chirp之间的相位旋转越快。通道维则是不同收发天线组合形成的虚拟通道天线位置不同导致回波的相位差不同最终通过空间维FFT或波束形成解算出角度。把这三维想明白后面的代码就只是填空。仿真里最常踩的坑就是把慢时间维和多普勒维搞混直接把按chirp排列的数据做FFT却没有考虑目标在连续chirp之间的相位变化导致速度测出来全是乱的。所以在我这套框架里第一步不是写代码而是先把数据立方体的形状定下来Rx天线数量乘以采样点数乘以chirp总数对应着一块三维数组。1.2 FMCW为什么能同时测距和测速FMCW的全称是Frequency Modulated Continuous Wave调频连续波。它的核心不是“连续发波”这个动作而是发射频率随时间线性变化。用生活化的方式理解如果一个人站在远处朝你喊话声音的音调不会变但如果他拿着一个频率不断变化的喇叭你听到的音调会和声源频率有一个偏移这个偏移量就和他的距离有关。雷达里把这个偏移量叫做中频频率记作f_IF。发射信号的调频斜率为K目标距离为R则回波时延为tau 2R/c中频频率近似为K乘以tau。所以测距的本质就是测频距离维FFT的峰值位置直接对应目标的距离。测速则利用慢时间维的相位变化即相邻chirp之间目标移动造成的相位旋转量正比于速度。这两个维度的FFT互不干扰因为快时间上的频率是“距离频率”慢时间上的频率是“多普勒频率”。在MATLAB仿真里我通常用一个复数指数信号来表示拍频信号。复数的好处是正负频率可以区分方向性信息不会丢。后面第三章的代码里会看到回波信号本质上就是在快时间维上叠加一个和距离成正比的频率在慢时间维上叠加一个和速度成正比的相位。1.3 MIMO是怎么把物理天线数量“变多”的单发单收雷达的天线孔径小角度分辨率很有限。MIMO雷达的核心思路是通过多个发射天线和多个接收天线之间的波形正交性构造出一个比物理天线数大得多的虚拟阵列。可以这样理解一个接收天线收到来自不同发射天线的信号时如果发射波形不冲突那么每一个收发配对都可以被看作一个独立的“虚拟接收通道”。假设有4根发射天线、4根接收天线采用时分方式让它们轮流发射那么接收端可以得到16个通道的数据。这16个通道对应的空间位置由发射天线位置和接收天线位置的组合决定。只要摆布合理就能等效出一根16单元的均匀线阵角度分辨率大约等效于用16根物理天线接收。为什么虚拟阵列能做到物理上不可能的事因为发射端的多个位置也提供了额外的空间采样点。本质上虚拟阵列的坐标等于txPos与rxPos的向量和。只要txPos采用大间距、rxPos采用小间距让两个集合相加后刚好填满一个连续均匀的整数网格虚拟阵列就不存在空洞和重叠。这是整个MIMO仿真里最值得反复验证的一步。2. 仿真框架整体设计与关键参数选型思路2.1 框架输入输出与模块划分我搭建这套仿真时给自己定的原则是输入端只配置两类参数一类是雷达系统参数一类是目标场景参数输出端只输出三类结果Range-Doppler谱、检测后的目标列表、带有距离速度角度的点云。中间的过程函数全部独立这样换场景、换MIMO模式都不会牵一发动全身。模块划分上我拆成了五个独立步骤波形参数初始化、目标回波生成、距离维FFT、多普勒维FFT、角度估计与检测。前面三个模块和MIMO的具体方式没有关系不管是SISO还是MIMO回了波先做距离维FFT都能看到距离峰。真正和TDMA、DDMA强相关的是发射波形组织方式和慢时间维的补偿逻辑。所以我在设计代码时把“MIMO模式”定义成一个枚举变量波形生成模块根据这个变量决定发射顺序和相位旋转后端的距离多普勒处理完全复用。这样做的好处很直接。我后面把TDMA改成DDMA只需要动发射信号生成和通道分离两个函数大约几十行代码其他几千行基本不碰。对于经常要对比不同MIMO方案的场景来说这个解耦设计比把全部逻辑写在一个大脚本里要舒服得多。2.2 关键参数怎么定从公式反推需要的数量级参数选型不能拍脑袋。我常用的做法是从指标反推参数。比如希望距离分辨率达到0.15米根据距离分辨率公式deltaR c / (2B)带宽B至少需要1GHz。又比如希望最大作用距离到75米左右那么中频采样率Fs、调频斜率K和最大中频频率要匹配。中频频率f_IF K * 2R/c最大不模糊距离对应最大中频。如果采用复采样中频频率可以用到Fs附近那么最大距离Rmax Fs * c / (2K)。下面是我在这套仿真里常用的一组参数实测下来覆盖了大多数中短距雷达场景参数符号示例值设计说明载频fc77 GHz车载毫米波常用频段也可换成24GHz带宽B1 GHz距离分辨率约0.15mchirp时长Tc50 us兼顾距离和累计时间采样率Fs10 MHz中频采样复采样每chirp采样点数Ns500Fs * Tc调频斜率K20 GHz/msB / Tc发射天线数nTX4可扩展接收天线数nRX4可扩展每根发射天线chirp数N128单天线慢时间积累点数用这组参数算一下理论指标最大不模糊距离约75米距离分辨率0.15米。多普勒方面如果采用经典TDMA轮换发射单个虚拟通道的慢时间采样周期是nTX * Tc等效PRF只有5000Hz在77GHz频段下最大不模糊速度大约4.8m/s。这个速度范围对汽车场景肯定不够。所以实际工程里要么增加chirp内部的调频设计、要么做速度解模糊或者干脆切换到DDMA模式重新分配多普勒资源。仿真框架的价值就在这里先用参数算出理论边界再在代码里验证实际表现。2.3 为什么拿TDMA做起点同时保留DDMA扩展TDMA-MIMO是最直观的MIMO实现方式。不同发射天线按时间片轮流工作接收端天然能把各路发射信号分开不需要额外的编码和解码处理。在仿真里它的实现成本最低适合作为第一版验证链路。另一个原因是TDMA的痛点非常明确目标一旦运动起来不同发射天线的发射时刻不一样会导致虚拟阵列相位不一致需要额外做运动补偿。把这个问题暴露出来对理解MIMO雷达的工程细节非常有帮助。但TDMA也有一个天生的软肋它牺牲了时间资源。在相同帧时间内每根天线的有效积累时间只有1/nTX等效多普勒PRF下降速度模糊更容易出现。这时候DDMA的优势就显现出来了。DDMA让所有发射天线同时发射但给每一路信号叠加一个不同的慢时间频偏接收后通过多普勒维的频段来分离不同发射天线。代价是多普勒维被分成了nTX段每段可测速度范围同样被压缩。所以TDMA和DDMA并不是谁绝对好而是在不同约束下做的资源交换。框架保留两种模式就是为了能直观对比这种交换。3. 从发射波形到回波生成TDMA-MIMO信号仿真怎么搭3.1 发射端把chirp按TDMA顺序排好TDMA的发射波形组织有两种常见方式。第一种是块切换每根发射天线连续发射N个chirp然后再换下一根天线。这种方式的优点是单根天线的慢时间采样间隔就是Tc多普勒PRF没有降低但代价是帧时间拉长到nTX倍帧内目标运动会带来位置误差。第二种是轮换切换每根天线发射一个chirp后立刻切换循环nTX次单根天线的慢时间采样间隔变成nTX*Tc各有取舍。在我的仿真代码里轮换切换更常用来展示TDMA的特点因为它会直接让有效PRF降下来多普勒维可以看到明显的折叠效应非常适合用来验证速度模糊理论。下面这段代码生成一个最简单的TDMA-MIMO chirp排列%% 参数准备 fc 77e9; c 3e8; lambda c / fc; B 1e9; Tc 50e-6; Fs 10e6; Ns round(Fs * Tc); K B / Tc; nTX 4; nRX 4; N 128; % 每根发射天线发射的chirp数 nChirpTotal nTX * N; % 帧内总chirp数 d lambda / 2; % 关键: 发射天线间距设为nRX*d保证虚拟阵列连续均匀 txPos (0:nTX-1) * nRX * d; rxPos (0:nRX-1) * d;这里的txPos设计是整个MIMO仿真的基石。如果发射天线间距取小了比如取2d和接收天线间距d相加虚拟阵列就会出现重叠和空洞角度谱会出现栅瓣。发射天线间距取nRX*d也就是接收阵列的孔径长度才能让txPos与rxPos相加后得到一段连续均匀的虚拟阵列。这个细节我最早是在测角谱出现一堆假峰之后才反应过来后来每次写MIMO仿真都会先打印一遍虚拟阵元坐标确认。3.2 回波生成时延、多普勒、阵列相位一个都不能少回波生成是把目标从物理世界映射到数字域的关键一步。对一个距离R、径向速度v、角度theta的目标来说接收到的拍频信号可以写成三个相位项的乘积快时间差频项、慢时间多普勒项、空间阵列相位项。快时间差频项是exp(j2piKtaut)其中tau是双程时延。慢时间多普勒项是exp(j2pifdt_slow)其中fd 2v/lambda。空间阵列相位项是exp(j2pi(txPosrxPos)/lambda*sin(theta))它正是后面角度估计的信息来源。下面这段代码演示了轮换切换下回波生成的核心逻辑%% 目标场景三个目标 targets [30, 5, 10 * pi/180; 55, -3, -20 * pi/180; 70, 12, 5 * pi/180]; rxData zeros(nRX, Ns, nChirpTotal); % 数据立方体 for chirpIdx 1:nChirpTotal txActive mod(chirpIdx-1, nTX) 1; % 当前激活的发射天线 tSlow (chirpIdx-1) * Tc; % 全局慢时间 tFast (0:Ns-1) / Fs; for rx 1:nRX sig zeros(1, Ns); for m 1:size(targets, 1) R targets(m, 1); v targets(m, 2); theta targets(m, 3); tau 2 * R / c; fd 2 * v / lambda; beat exp(1j*2*pi*K*tau*tFast) ... % 距离频率 .* exp(1j*2*pi*fd*tSlow) ... % 多普勒相位 .* exp(1j*2*pi*(txPos(txActive)rxPos(rx))... / lambda * sin(theta)); % 空间相位 sig sig beat; end rxData(rx, :, chirpIdx) sig; end end这段代码看起来简单但三个相位项的顺序和符号必须保持一致否则距离、速度、角度会出现莫名其妙的偏移。我在最早写的时候把空间相位的正负号搞反了结果角度谱的所有峰值都从右边移到了左边找了大半天才意识到是符号问题。另一个容易忽视的点是幅度。真实雷达回波幅度跟距离的4次方成反比还跟目标RCS有关但在算法验证阶段我通常先不加幅度衰减让所有目标的信噪比一致方便观察距离-多普勒谱的峰值位置。等到要验证检测概率、CFAR阈值时再加RCS起伏和噪声模型。3.3 混频与距离维FFT先看一下目标在距离上怎么分布在真实雷达硬件里混频器把发射信号和回波信号混频后输出中频信号再由ADC采样。仿真里不需要真的做乘法混频直接用拍频信号的复数表达式就等价于混频后的中频结果。做完距离维FFT就能看到目标在距离维上的峰值。%% 距离维FFT nfftR 512; windowR hamming(Ns).; winFFT windowR. * ones(1, nChirpTotal); % 给每个chirp加窗 rdCube zeros(nRX, nfftR, nChirpTotal); for rx 1:nRX for chirpIdx 1:nChirpTotal rdCube(rx, :, chirpIdx) fft(rxData(rx, :, chirpIdx) .* windowR, nfftR); end end % 距离坐标换算: R_bin idx * Fs * c / (2 * K * nfftR) R_axis (0:nfftR-1) * Fs * c / (2 * K * nfftR);这段代码里的加窗操作很关键。窗函数能压低距离维FFT的旁瓣但也略微展宽主瓣。仿真中如果目标距离很接近不加窗时两个目标可能因为旁瓣互相掩盖加窗后反而更容易区分。距离轴换算公式经常有人写错我建议每次跑仿真前手动验证一个已知目标的峰值位置确认R_axis算对了再往下走。4. 距离-多普勒-角度三维检测把目标从数据里“挖”出来4.1 二维FFT生成Range-Doppler谱距离维FFT做完之后每个chirp对应一个距离谱。要把慢时间维转换成多普勒维需要沿着chirp方向再做一次FFT。这一步在实现时有个细节不是对整个数据立方体做二维FFT而是对每一个虚拟通道分别做慢时间维FFT。因为多普勒信息是逐通道独立存在的后续的阵列处理才需要把所有通道的数据在同一个距离-多普勒bin上取出来。%% 多普勒维FFT nfftD 256; windowD hamming(nfftD).; % rdCubeAfterDoppler: nRX x nfftR x nfftD dopplerCube zeros(nRX, nfftR, nfftD); for rx 1:nRX for rangeBin 1:nfftR % 对慢时间维做FFT block squeeze(rdCube(rx, rangeBin, :)); dopplerCube(rx, rangeBin, :) fftshift(fft(block .* windowD, nfftD)); end end % 速度坐标: v_bin bin * lambda * PRF_eff / (2 * nfftD) PRF_eff 1 / (nTX * Tc); % 轮换切换下的有效PRF v_axis (-nfftD/2:nfftD/2-1) * lambda * PRF_eff / (2 * nfftD);注意这里PRF_eff用的是1/(nTX*Tc)而不是1/Tc。这是TDMA轮换切换下最容易出错的地方。你在距离-多普勒谱上看到的速度峰如果总是对不上理论值先检查是不是把PRF带错了。4.2 峰值检测与恒虚警的选择二维FFT之后目标在Range-Doppler谱上表现为一个个峰值。最简单的方法是直接找全局或局部极大值但真实场景中存在噪声和杂波峰值检测容易把旁瓣或噪声峰当成目标。我的建议是至少加一个简单的CFAR判断。CFAR的核心思想是动态估计每个待测单元周围的噪声功率设置一个自适应阈值。仿真中最常用的是二维CFAR距离维和多普勒维各设一组保护单元和训练单元。保护单元是为了防止目标自身能量泄漏到参考窗内训练单元用于估计背景噪声。阈值系数alpha由虚警概率Pfa决定经验值在10dB到12dB之间。%% 二维CFAR参数示意 guardR 2; trainR 8; guardD 1; trainD 6; threshold 10; % dB经验值 % 对每个检测单元统计训练窗内的平均功率与待测单元功率比超过阈值则判为目标如果只是验证算法链路不追求接近真实场景的检测概率我建议直接用峰值检测加距离-速度-角度联合筛选速度快调试直观。等把MIMO对比的主流程跑通了再回来加完整的CFAR也不迟。仿真和实物最大的区别就是可控性能简洁时就别急着加复杂度。4.3 角度估计虚拟阵列上的空间谱峰角度估计是MIMO仿真里最有价值也最容易出问题的一步。前面生成的Range-Doppler谱对每个检测到的目标峰点取出所有虚拟通道在该峰点的复数值组成一个空间矢量。这个矢量的相位差由目标角度决定用空间FFT就能算出角度谱。%% 提取空间矢量并做角度估计 nVirt nTX * nRX; sv zeros(nVirt, 1); for tx 1:nTX for rx 1:nRX virtIdx (tx-1)*nRX rx; % 取该虚拟通道在目标距离-多普勒峰处的复数值 sv(virtIdx) dopplerCube(rx, rangeIdx, dopplerIdx); end end % 空间FFT / 波束形成 nfftA 256; spatialFFT fftshift(fft(sv, nfftA, 1)); angleAxis asin((-nfftA/2:nfftA/2-1) * 2 / nfftA);这里面的关键变量是rangeIdx和dopplerIdx它们来自目标峰位置。取错峰点角度估计天然就错。还有一个容易踩的坑不同发射天线对应不同的chirp序号。在TDMA轮换模式下只有当前激活的发射天线对应的chirp才包含该通道的完整相位。所以在构建空间矢量时必须确认每个虚拟通道的数据来自正确的chirp位置。这也是我代码里用双重循环按virtIdx来组织数据、而不是直接按固定chirp切片的原因。角度分辨率一方面由虚拟孔径长度决定另一方面受阵列排布影响。16个均匀虚拟通道在天线间距lambda/2时正前方的角度分辨率大概在7度左右。如果要更高分辨率就得增大虚拟孔径这正是4D毫米波雷达和分布式阵列研究的核心动力。5. 从TDMA平滑切换到DDMA只需改这几处5.1 TDMA的局限性到底卡在哪里TDMA-MIMO的问题在仿真里跑一次高速目标就能立刻感受到。目标速度一旦超过最大不模糊速度速度维FFT会出现折叠目标峰位置被翻到错误的bin上。更麻烦的是运动目标引起的相位不连续4根发射天线在时间上轮流发射相邻天线之间的发射时刻相差一个Tc如果目标速度高这个时间差内目标已经移动了一个可观的距离等效相位误差随之产生。这个误差会直接污染虚拟阵列的空间相位角度谱出现展宽或偏移。我实测试过一个速度30m/s的目标用4T4R TDMA模式跑角度峰比低速目标宽了不少峰值也低了几个dB。这就说明运动相位误差不能忽略。在仿真里简单的补偿方法是用估计出来的多普勒频率对每个虚拟通道的慢时间序列做相位补偿把不同发射天线之间的时间差修正回来。但这种方法依赖速度估计的准确性速度折叠后补偿就失效了。所以TDMA想要做好速度解模糊和运动补偿必须配套。5.2 DDMA到底改了什么多普勒偏移编码DDMA的出发点是让所有发射天线同时工作不再占用时间资源。但所有天线同时发回声混在一起怎么分离答案是给每根发射天线在慢时间维上叠加一个不同的线性相位等价于给该天线的信号加一个固定的多普勒频偏。这样在慢时间FFT之后来自不同发射天线的能量会落在多普勒维的不同区间直接把多普勒域当作天线分离的“车道”。用代码表达DDMA模式其实很简洁%% DDMA模式下的发射信号 PRF 1 / Tc; % DDMA下所有TX同时发慢时间间隔还是Tc nTX 4; N 128; % 帧内每个通道的chirp数 % 每根TX分配一个多普勒频偏 freqShift (0:nTX-1) - (nTX-1)/2; freqShift freqShift * PRF / nTX; % 将多普勒维均分给nTX根天线 % 对第tx根天线第k个chirp附加的相位旋转 for tx 1:nTX for k 1:N phaseDDMA(tx, k) exp(1j * 2 * pi * freqShift(tx) * (k-1) * Tc); end end接收端处理时先做和TDMA完全相同的距离维FFT和多普勒维FFT。区别在于多普勒谱上会同时出现nTX组目标峰每一组属于不同的发射天线。要还原目标真实速度和空间相位需要把每个峰对应的多普勒坐标减去对应天线的频偏再把nTX组校正后的数据按照虚拟通道顺序拼接起来做角度估计。5.3 切换后必须做的补偿和性能对比DDMA模式做完天线分离之后有一个绕不开的补偿步骤把频偏从速度估计里扣掉。如果不扣同一个目标会被拆成nTX个不同速度而且每个速度值都带一个固定偏移。工程实现上通常先用峰值所在的多普勒bin反推出天线编号然后用目标真实多普勒频率等于观测多普勒频率减去对应频偏。性能对比方面我用同一组目标跑过TDMA和DDMA结论比较明显DDMA在速度不模糊范围上并没有优于TDMA因为多普勒维要分配给多根天线每根天线的可用多普勒区间变成了整个范围除以nTX。但DDMA的帧时间更短同一帧内的目标运动更小虚拟阵列的相位一致性天然更好角度谱更干净。对于希望用4根以上发射天线做MIMO的雷达系统DDMA比TDMA更有吸引力。模式切换时的代码改动主要集中在发射信号组织和多普勒分离两步。后端的距离FFT、目标检测、角度估计完全复用。我甚至把MIMO模式做成了一个字符串参数跑对比实验时只需要把mode从tdma改成ddma重启脚本输出的Range-Doppler谱和图就自动换一套逻辑。这种“底层复用、模式隔离”的设计是让仿真保持长期可用性的关键。6. 实测中踩过的坑相位、速度模糊与数据对不齐6.1 TDMA相位不连续导致角度谱“拖尾”这个问题我最初是在验证4T4R MIMO测角时发现的。低速目标的角度谱很尖锐高速目标的角度谱变得又矮又胖一开始以为是加窗的问题后来排查到是不同发射天线的发射时刻差引起的相位误差。解决办法是先用多普勒FFT估计出目标速度然后对慢时间维的相位做补偿将每个虚拟通道的数据乘以对应的反向旋转项。实际操作中要注意补偿量必须基于未折叠的真实速度如果速度已经模糊补偿反而会引入额外误差。6.2 DDMA模式下多普勒谱“串天线”DDMA最经典的问题是目标峰值越过了分配给某个发射天线的频段掉进了相邻天线的区间。目标多普勒频率较大时其在多普勒谱上的位置是真实频偏叠加目标速度频移如果速度很大峰值会跨段天线分离就失效了。我在仿真里用30m/s目标加4根发射天线时就出现过目标峰跑到了不属于它的扇区。解决这类问题有两类思路一是设置扇区保护间隔牺牲一小段多普勒范围换取分离稳定性二是对每个目标先做大范围速度假设并验证也就是所谓的多普勒解模糊流程。建议在DDMA仿真里把频偏系数留一点余量不要直接把PRF/nTX占满。比如设成PRF/(nTX*1.2)虽然可用速度范围小一点但串天线概率明显下降。仿真里调整这个系数的过程能够直观理解速度和天线分离之间的资源竞争。6.3 距离维FFT峰值偏移和栅瓣问题距离维FFT峰值偏移的常见原因是采样率和调频斜率用错量纲。比如K用了Hz/s而不是GHz/s计算出的距离轴差好几个数量级峰位置自然对不上。排查方法很简单用单个静止目标设一个整数值距离跑完FFT看峰值是否落在对应的R_axis位置如果偏了就先检查单位再检查公式。栅瓣问题则基本出在虚拟阵列排布上。如果txPos间距不等于nRX*d虚拟阵列会重叠或出现空洞角度谱在错误方向出现等幅假峰。我在第二章已经提过这个问题这里再强调一次每次修改天线数或天线间距都应该打印一遍虚拟阵列坐标确认它是一条连续均匀的序列。这个检查在仿真里只需要一行代码却能省下后续排错的大量时间。6.4 仿真数据和实际采集数据对不齐怎么办很多人在仿真里算法性能很好一接到真实雷达数据就崩。常见原因有三个第一实际雷达的中频信号存在I/Q不平衡镜像频率没有完全抑制第二天线之间的幅相一致性有偏差虚拟阵列导向矢量不再理想第三环境中的多径和静止杂波在仿真里没有建模。建议的方法是先用“近程强目标”数据验证距离维FFT再用转台或角反验证角度维一步步把仿真链路和实际数据对齐而不是一上来就期望全套算法直接落地上线。我个人的习惯是仿真里会故意加入0.5dB幅度误差和2度相位误差让算法在“不那么完美”的通道下也能工作这样迁移到真实数据时不会那么脆。7. 后续扩展从16通道仿真走向4D点云与分布式阵列7.1 增加俯仰维把线阵变成平面阵现在的16通道是一维线阵只能测方位角。4D毫米波雷达需要输出俯仰角这时候需要把接收天线排布扩展成两排虚拟阵列也就变成二维面阵。仿真框架里只需要增加一组z方向的天线坐标角度估计从一维空间FFT变成二维波束形成或MUSIC数据立方体变成四维。这个扩展非常自然因为前面按虚拟通道组织数据的方式不需要改。7.2 从单节点到分布式阵列分布式阵列的做法是把多个雷达节点摆在不同位置合成一个更大的虚拟孔径。这时候不同节点之间的时间同步和相位同步是最大的工程难点。仿真可以做的是把节点间的时间偏差建模成一个可配置参数观察它对角度估计和点云拼接的影响。相比单节点MIMO分布式阵列能带来更明显的角度分辨率提升但也对算法鲁棒性提出更高要求。7.3 算法验证之外实时化和C移植这套MATLAB仿真跑完一轮目标点云在普通笔记本上大约需要几十秒到几分钟主要取决于chirp总数和FFT规模。如果后续要做嵌入式验证可以把Range-Doppler FFT、峰值检测、空间FFT这几个核心函数翻译成C用Eigen或FFTW实现。C版本的优势不只是速度更在于能直接对接PCIe采集卡抓到的原始ADC数据把仿真链路应用到真实数据流上。这个方向我也在做后续整理完再单独写一篇。这套仿真框架最值钱的地方不是某一行代码而是它让我快速理解了TDMA和DDMA在系统层面的取舍。很多结论不跑一遍光看公式是体会不到的。后面我还会继续对它做裁剪和扩展如果你也在做毫米波雷达仿真建议先从一维单目标场景跑通全链路再逐步增加目标数量、噪声和MIMO复杂度这样每一步的改动都有明确的观察指标出问题也容易定位。
返回列表