
简介面向雷达信号处理学习者的MIMO雷达波束形成MATLAB资料包紧扣MIMO雷达多天线收发原理与波束形成核心环节适合电子信息、通信工程专业学生及雷达算法入门者对照学习。压缩包共2个文件包含1个MATLAB脚本和1篇PDF文献脚本用于完成波束形成权值计算与信号合成仿真PDF则对比MIMO雷达与相控阵雷达的性能差异并结合MUSIC算法展示高分辨率波达方向估计在实际多径场景中的应用。整套资源仅187KB轻量易得便于快速开展原理验证与算法复现。目前已有616人在CSDN学习下载。通过研读该资料读者可系统理解MIMO雷达信号模型与空间分集增益掌握最小均方误差、最大似然及MUSIC等典型波束形成权值设计思路并借助MATLAB代码直观观察波束扫描与零陷抑制效果为后续深入阵列信号处理研究、课程设计或毕业设计提供可运行参考与理论支撑。1. 先别急着写代码MIMO雷达波束形成到底在解决什么问题在阵列信号处理里MIMO雷达这几年几乎成了“方向图自由”的代名词。它最反直觉的一点是发射端不是所有阵元发同一个波形而是每个阵元发互不相同的正交波形接收端靠匹配滤波把这些波形分开再按相位关系加权求和等效出一根比物理孔径大得多的虚拟阵列。换句话说波束形成这件事在MIMO雷达里从“接收端单边做”变成了“发射端给自由度、接收端做合成的双边问题”。这套思路直接带来两个实际收益一是可以用少量物理阵元获得更大的虚拟孔径角分辨率明显提升二是发收联合设计之后波束可以在发射端和接收端同时形成抗干扰的灵活性比传统相控阵高不少。这篇文章写给三类人刚接触MIMO雷达、被“正交波形、虚拟阵元、等效孔径”这些词绕晕的研究生要在MATLAB里快速跑通一个波束形成Demo、验证算法效果的工程师以及准备做雷达信号级仿真、需要把参数和坑都摸清楚的开发者。2. MIMO雷达原理正交波形、虚拟阵列与波束形成的数学基础2.1 正交波形如何撑起MIMO雷达的空间自由度传统相控阵雷达的发射端所有阵元辐射同一个波形只是相位不同这叫“相干发射”。MIMO雷达的出发点正好相反每个发射阵元给独立波形而且波形之间满足正交性。正交的意义在于接收端可以用匹配滤波把每个发射通道“拆开”——第m个发射波形和对应的匹配滤波器输出就相当于单独拿到了这个发射阵元的回波信息。为什么正交波形能带来空间自由度关键在波形分集。考虑Nt个发射阵元、Nr个接收阵元如果发射波形互不相关那么接收端能分离出Nt×Nr个通道。经典相控阵只有Nr个接收通道因为发射端不区分。MIMO雷达把发射端的分集能力变成了等效的“多发多收”通道这些通道再做相干处理就可以合成虚拟阵列。正交波形的选择有讲究。常用的是Hadamard码、Gold码、ZCZ序列也可以设计正交频分OFDM波形。MATLAB里最容易复现的是Hadamard矩阵因为行与行天然正交代码只有一行Nt 8; % 发射阵元数 codeLen 64; % 单个码片长度 H hadamard(codeLen); % 64x64哈达玛矩阵 txCode H(1:Nt, :); % 取前8行作为8个发射波形这段代码的逻辑是每个发射阵元占用Hadamard矩阵的一行发射周期内发射这行序列。由于H矩阵任意两行点积为零发射波形满足正交。codeLen要大于等于Nt且必须是2的幂否则hadamard函数直接报错。波形长度直接影响距离分辨力和多普勒容忍度这个在第四章参数部分会展开。2.2 虚拟阵列为什么8个阵元能当16个用虚拟阵列是MIMO雷达最容易被误解的地方。它不是“凭空多了阵元”而是发射-接收通道组合后在空间上形成了等效的阵元位置。假设发射阵元位置是xt_mm1..Nt接收阵元位置是xr_nn1..Nr双程相位对应的等效位置是xt_m xr_n。也就是说用Nt个发射阵元和Nr个接收阵元的任意组合等效成一个包含Nt×Nr个“虚拟阵元”的阵列但其中很多位置会重合。举个最常见的配置收发共址、都采用间距为d的半波长均匀线阵。发射阵元在0, d, 2d, ..., (Nt-1)d接收阵元在0, d, 2d, ..., (Nr-1)d。那么虚拟位置xt_m xr_n的取值范围是从0到(NtNr-2)d但中间很多数值重复。如果NtNr4虚拟阵元数量不是16而是7个独立位置幅度加权后可以等效成7个阵元的均匀线阵。这就是“8个阵元当16个用”这个说法的修正版物理上8个阵元虚拟通道有16个但独立空间自由度只有7到15个取决于排列方式。实现虚拟阵列的关键在接收端的信号重组。匹配滤波之后每个发射通道m和接收通道n的组合对应一个虚拟阵元位置它在方向theta上的相位是exp(j * 2π * (xt_m xr_n) * sin(theta) / lambda)。把这些通道按相位补偿后求和得到的就是MIMO雷达的合成波束输出。2.3 从发射到接收波束形成的信号模型波束形成的本质是加权求和。常规波束形成CBF也叫延迟求和波束形成本质是对各阵元接收信号做相位补偿让目标方向的信号同相叠加噪声和来自其他方向的干扰因相位不一致被压低。MIMO雷达的波束形成和普通阵列的差别在于每一对“发射-接收”通道都要做匹配滤波然后拿到一个虚拟阵元信号再对这个虚拟阵列做加权。用一个点目标的基带信号模型来说明。第m个发射波形为sm(t)目标在角度theta、距离R处。接收端第n个阵元收到的信号是所有发射波形经目标反射后的叠加每个通道的时延由双程距离决定。匹配滤波后第m-n通道的输出近似为xm_n alpha * exp(j * 2π * (xt_m xr_n) * sin(theta) / λ) 噪声alpha包含路径损耗、反射系数和波形能量。把这个式子对m1..Nt、n1..Nr展开就得到了虚拟阵列的快拍向量。对某个期望方向theta0做MIMO波束形成就是构造加权向量w其中第(m,n)个元素为exp(-j * 2π * (xt_m xr_n) * sin(theta0) / λ)然后做内积。这个操作在各方向上扫描一遍就画出了波束方向图。3. 用MATLAB跑通最小MIMO波束形成代码与参数3.1 发射端正交波形生成与回波构造这一节给一个能直接跑的完整MATLAB脚本。它不依赖Phased Array System Toolbox只用基础函数目标是最小化“环境依赖”让你在MATLAB 2020b到2026b都能跑通。仿真场景8发8收、半波长布阵、载频10GHz、Hadamard正交波形、单个点目标。%% MIMO雷达波束形成最小Demo clear; clc; close all; c 3e8; fc 10e9; % 载频 10GHz lambda c / fc; d lambda / 2; % 半波长阵元间距 Nt 8; Nr 8; % 发射与接收阵元数 codeLen 64; % 波形码长 H hadamard(codeLen); txCode H(1:Nt, :); % 8x64 发射波形矩阵 targetAngle 30 * pi / 180; % 目标角度 30度法线为0度 targetRange 500; % 目标距离 500m % 阵元位置 xt (0:Nt-1) * d; xr (0:Nr-1) * d; % 构造接收信号点目标未考虑多普勒 fs 4 * codeLen; % 每个码片内采样4个点 t (0:codeLen*4-1) / fs; % 数字化时间轴 txWave zeros(Nt, length(t)); for m 1:Nt % 将码序列按每码片4个采样点扩展为连续波形 txWave(m,:) reshape(repmat(txCode(m,:), 4, 1), 1, []); end这段代码先把波形扩展成带采样的发射信号。之所以每个码片内采4个点是为后续匹配滤波做粗时间对准。真正仿真的回波应该包含传播时延但这里为了聚焦波束形成直接用相位模型构造虚拟阵列快拍避免把距离维处理复杂化。3.2 匹配滤波与虚拟阵列快拍构造匹配滤波是为让每个发射通道的回波“对号入座”。理想情况下用第m个发射波形做模板和所有接收通道做相关输出就只保留第m个发射通道的能量。MATLAB里用互相关函数实现%% 匹配滤波分离各发射通道 rxChan zeros(Nt, Nr, codeLen); for m 1:Nt for n 1:Nr % 用相位模型直接生成匹配滤波后的输出跳过距离维 phase exp(1j * 2 * pi * (xt(m) xr(n)) * sin(targetAngle) / lambda); rxChan(m,n,:) phase * txCode(m,:); end end %% 构造虚拟阵列快拍 snap zeros(Nt*Nr, 1); idx 0; for m 1:Nt for n 1:Nr idx idx 1; % 用第一个码片对应的输出作为该虚拟阵元的快拍值 snap(idx) rxChan(m,n,1); end end %% 虚拟阵列流形矩阵扫描方向用 thetaScan (-90:0.5:90) * pi / 180; A zeros(Nt*Nr, length(thetaScan)); idx 0; for m 1:Nt for n 1:Nr idx idx 1; A(idx,:) exp(1j * 2 * pi * (xt(m) xr(n)) * sin(thetaScan) / lambda); end end这里的做法省掉了脉冲压缩和距离维处理直接用匹配滤波后的首码片幅度作为虚拟阵元的快拍值。如果你手里有完整的回波数据正确做法是先对每个接收通道做匹配滤波再取峰值处的复数值作为该虚拟阵元的快拍。这样构造出来的snap就是后续所有波束形成算法的输入。3.3 波束方向图绘制看到主瓣与栅瓣有了虚拟阵列流形矩阵A和快拍向量snap常规波束形成的方向图输出就是一个矩阵乘法%% 常规波束形成CBF扫描 w zeros(Nt*Nr, length(thetaScan)); for k 1:length(thetaScan) w(:,k) A(:,k); % 每个扫描角度的导向向量 end pattern w * snap; % 各扫描方向的输出 pattern abs(pattern); pattern pattern / max(pattern); plot(thetaScan*180/pi, 20*log10(pattern), LineWidth, 1.5); xlabel(扫描角度 (deg)); ylabel(归一化方向图 (dB)); grid on; ylim([-60 0]);这段代码中w的每一列是扫描角度对应的导向向量w * snap相当于把快拍投影到每个方向的导向向量上得到的pattern就是空间谱。注意这里快拍snap本身来自真实目标角度30度所以pattern应该在30度处出现峰值。如果峰值不在30度优先检查相位符号——这是MIMO雷达最容易翻车的地方。运行结果中你会看到两个现象主瓣宽度比相同物理孔径的相控阵窄旁瓣水平大约在-13dB附近这与均匀加权阵列的理论旁瓣一致。如果阵元数翻倍NtNr16虚拟孔径接近线性增长主瓣会更窄但栅瓣出现条件同时变得敏感尤其是阵元间距稍大于半波长时。4. 参数调优阵元数、载频与波形长度怎么定4.1 阵元间距d与栅瓣的边界条件MIMO雷达的虚拟阵列出现栅瓣的条件和普通阵列一样等效阵元间距超过半波长。差别在于MIMO的等效阵元位置是由xt_m xr_n决定的不是简单的物理阵元间距。如果发射阵元间距dt和接收阵元间距dr都等于lambda/2虚拟阵元位置可能出现间隔为lambda/2的均匀排列安全但如果dt或dr大于lambda/2虚拟阵列里某些相邻位置的间隔就会大于半波长方向图就会出现栅瓣。实际工程中很多人会把收发阵元间距做成一样大以为这样最简单。但为了压低旁瓣或扩展无模糊角度范围常见的做法是让接收阵元间距为lambda/2发射阵元间距更大一些这样虚拟阵元内部会出现“空洞”需要用加权或非均匀布阵去处理。MATLAB里验证栅瓣很简单把d改成0.6*lambda再跑一遍方向图观察是否有第二个等高峰值出现。栅瓣对MIMO雷达的杀伤力比相控阵更大因为虚拟通道数多栅瓣不只影响一个方向它会在一组离散角度上同时出现。所以参数配置上阵元间距优先取lambda/2如果要增大孔径多增加阵元数而不是加大阵元间距。4.2 波形正交性对波束形成结果的影响Hadamard码在理论上完美正交但放到实际系统里有三个问题一是多普勒频移会破坏正交性二是目标回波有幅度差异强目标的多普勒泄漏会淹没弱目标通道三是Hadamard码的峰均比高功放非线性会带来波形畸变。多普勒对正交性的破坏最隐蔽。当目标径向速度大时匹配滤波后的输出不是干净的相位项而是叠加了一个多普勒频移项不同发射通道之间的正交性下降虚拟阵列快拍里会出现“串扰分量”。仿真中要加入多普勒的话可以在回波模型里乘一个exp(j2πfd*t)因子然后观察波束方向图的旁瓣抬升。常规做法是缩短波形长度、用多普勒容忍性更好的相位编码替代Hadamard码或者在接收端做多普勒补偿后再匹配滤波。波形长度的选择也很关键。码长增加每个虚拟通道的处理增益提升但会带来两个代价数据率降低多普勒模糊变近。在MATLAB仿真里codeLen64是一个均衡选择它能保证8个发射波形有足够的处理增益又不至于让多普勒模糊在低速度时就出现。如果你仿真多目标场景建议分别测试codeLen32、64、128下的旁瓣水平。4.3 快拍数与信噪比的下限经验波束形成算法的统计性能依赖快拍数。常规波束形成对快拍数要求低但MIMO雷达匹配滤波后每个虚拟阵元只拿到一个复数值当存在干扰时需要用协方差矩阵做自适应处理快拍数不足就是灾难。简单估算一下Nt*Nr64个虚拟阵元协方差矩阵是64x64至少需要128个快拍才能让矩阵满秩推荐4到10倍虚拟阵元数的快拍量。信噪比方面MIMO雷达的波束形成增益理论上是10log10(NtNr)分贝。但要注意如果波形不完全正交这部分增益会打折而且不同通道的幅度失配会直接抬高方向图旁瓣。所以仿真里给回波加噪声时建议分别验证高信噪比比如20dB以上和低信噪比0dB附近下的方向图形态观察旁瓣抬升这是判断波束形成算法稳健性的常用手段。5. MATLAB里MIMO波束形成的4个常见坑现象、原因与解决办法5.1 相位差符号写反波束指向镜像翻转现象目标明明设置在30度方向图峰值出现在-30度镜像位置。原因导向向量中exp(jφ)与exp(-jφ)的符号约定不统一。发射阵元和接收阵元位置都为正但相位表达式里写成了exp(j * 2π * (xt xr) * sin(theta) / lambda)而最终加权时又用exp( -j * 2π * (xt xr) * sin(thetaScan) / lambda)如果扫描方向thetaScan和快拍生成时的目标角度theta用同一套符号方向图会翻转。这类问题在代码里属于“玄学级”难查因为不报错结果还对称。解决把相位表达式统一写成exp(j * 2π * (xt xr) * sin(theta) / lambda)扫描方向也保持一致。调试时设置目标角度为一个小角度比如5度观察峰值在哪一侧就能快速判断符号是否一致。5.2 匹配滤波后幅度差异导致波束畸变现象方向图主瓣位置正确但左右旁瓣不对称或者主瓣宽度比理论值大。原因实际回波中不同发射通道和接收通道的链路增益不一致导致虚拟阵元的幅度不一致。直接对虚拟阵列做均匀加权主瓣和旁瓣都会失真。加上Hadamard码本身的峰均比问题功放压缩后波形失真进一步放大幅度差异。解决在构造虚拟阵列快拍之前做幅度校正。用一段无源校准数据或对已知强目标回波做归一化求得每个虚拟通道的幅度校正系数乘到快拍上。这个校准过程在MATLAB里就是一行snap_cal snap ./ calVector。如果只是仿真确保回波模型信噪比一致即可。5.3 阵列雷达坐标系下角度定义的混乱现象方向图在0度附近出现“平顶”或者在90度边缘出现异常高旁瓣。原因MATLAB的sin(theta)在theta接近±90度时变化率变缓导向向量之间趋于相关导致这些角度附近的方向图失真。另一个常见原因是坐标系定义雷达习惯以法线方向为0度而数学计算有时用端射方向为0度。两种定义混用时代码里同一变量在不同位置被赋予了不同含义。解决所有角度统一用“法线为0度、左侧为负、右侧为正”的约定扫描范围控制在-80度到80度不要硬扫到±90度。加一条注释在代码开头所有theta都是相对于阵列法线的角度。如果是MATLAB工具箱注意phased.URA等对象的坐标系统默认是z轴方向的法线转成方位角俯仰角时要先确认坐标系。5.4 快拍数不足导致自适应算法矩阵奇异现象常规波束形成正常换成MVDR或最小方差算法后输出变成NaN或者方向图出现极高随机尖峰。原因协方差矩阵R由有限快拍估计得到虚拟阵元数64时快拍数远小于64会导致R奇异即使快拍数大于64条件数也可能很差求逆结果不稳定。这类问题在自适应波束形成里最常见也是“黑匣子”感最强的部分。解决先检查条件数cond(R)大于1e10就要处理。最可靠的后悔药是对角加载在R的对角线上加一个小的正则项R_loaded R delta * eye(N)delta通常取0.01到0.1倍的trace(R)/N。对角加载会稍微抬基底噪底和旁瓣但能换来算法稳定性工程上几乎必加。6. 从固定波束到自适应LCMV波束形成器的MATLAB升级路径把常规波束形成换掉MVDR是MIMO雷达抗干扰最常用的升级路径。它的目标函数是在期望方向增益为1的约束下使输出功率最小。等价于通过协方差矩阵求一个最优权向量R snap * snap; % 单快拍时协方差矩阵秩为1需要多快拍累积 R (X * X) / K; % K为累积快拍数 w_mvdr inv(R delta * eye(N)) * A(:, tIdx) / (A(:, tIdx) * inv(R delta * eye(N)) * A(:, tIdx));其中tIdx是期望方向的索引。验证时把目标放在30度、干扰放在-20度对比CBF和MVDR的方向图你会看到MVDR在-20度附近形成明显的零陷深度一般在-30dB到-50dB之间取决于快拍数和信噪比。这是判断自适应算法是否生效最直观的方式。LCMV和MVDR的差别在于可以加多个约束同时控制多个方向的响应。如果你的接收数据是实采信号用MVDR前务必做两个检查一是快拍里是否有直达波或强杂波这些都会污染协方差矩阵二是对角加载的系数不要调过头否则零陷会变浅失去自适应意义。我个人的使用习惯是先跑CBF确认方向和阵列配置没问题再切自适应参数上先固定快拍数K512、对角加载系数delta0.001再按实际方向图微调。有些资深的雷达工程师会把对角加载系数也做自适应但那是另一套循环逻辑没必要在第一个版本里引入。MIMO雷达波束形成的核心思路并不复杂发射端用正交波形分集接收端匹配滤波后合成虚拟阵列再做加权求和。真正花时间的永远是匹配滤波校准、角度定义统一、协方差矩阵条件数这几个细节。如果你能从第四节参数边界开始做再用第五节避坑清单检查一遍再复杂的自适应算法也只是换一个权向量计算函数的问题。希望这些参数思路和踩坑记录能帮你少走一段弯路。本文还有配套的精品资源点击获取