
简介本资源是一套面向通信工程与信号处理方向学习者、研究生及科研人员的宽带空时波束形成抗干扰算法MATLAB仿真代码聚焦于均匀线阵下的空时联合处理核心原理验证与性能分析。压缩包共3个文件2个MATLAB函数文件1个说明文本总大小仅3KB轻量易部署其中主函数实现权值计算、SNR/INR/SINR评估、自相关矩阵构建及空时方向图可视化辅助函数用于灵活生成复数点频有用信号与干扰信号所有关键参数如阵元数、空时阶数、入射角度、信干噪比等均开放可调便于开展多场景对比实验。代码注释详尽、逻辑清晰横纵坐标物理意义明确能直观验证抗干扰效果是深入理解宽带阵列信号处理中空时域联合抑制机制的理想教学与研究范例。目前已有229人学习下载。 做空时波束形成这事起因其实很简单我在做一个雷达抗干扰的预研项目时发现常规的空域 MVDR 波束形成在干扰方向很近或者干扰是宽带信号的情况下性能掉得惨不忍睹。后来把每个阵元后面接上一段延迟抽头线做空时二维联合处理零陷深度和输出信干噪比立刻就不一样了。当时我把整套 MATLAB 仿真代码整理了一下这几个月陆陆续续有做 GNSS 抗干扰和通信抗干扰的朋友找我要源码和思路索性写一篇完整的拆解把空时波束形成从原理到仿真实战一次讲透。这篇内容不是一个 demo 演示而是一份可以直接拿去改、拿去跑的工程化代码拆解。无论你是刚接触阵列信号处理的研一新生还是已经写过不少空域波束形成、现在想往空时二维拓展的工程师里面涉及的信号建模、协方差估计、对角加载、性能评估这些环节我都会按实际仿真时的思路一步步说清楚包括那些文档里基本不会写、但你不注意就一定会被坑到的细节。1. 空时波束形成解决什么问题为什么值得做仿真1.1 空域波束形成的三个典型失效场景先说说我为什么一开始会被空域滤波坑到。传统空域波束形成可以理解成“靠空间角度来筛信号”核心假设是干扰和期望信号来自不同方向那么我只要在干扰方向形成零陷在期望方向保持增益就能把干扰压下去。这个思路在干扰源和目标角度差得足够远时非常好用但工程上至少有以下三种情况会让它直接失效第一干扰方向与期望信号方向非常接近甚至只差一两度。阵列的角度分辨力是有限的孔径越大分辨力越高但实际天线口径就那么点当干扰落在主瓣内部时一般的自适应算法要么抑制不了要么为了抑制干扰把主瓣也撕裂了。第二干扰是宽带信号。空域滤波本身是没有频率选择能力的它只能从空间方向区分来波。如果某个方向的干扰和期望信号在频带上严重重叠空域自适应权值会让整个方向响应畸变导致期望信号也被消掉一部分。第三干扰数量超过阵列自由度。一个 M 元阵列最多只有 M-1 个自适应自由度来了 M 个强干扰时就已经非常勉强来 M1 个基本就废了。这时候空时处理的价值就出来了。它把维度从“空间角度”扩展到“空间角度时间频率”等效自由度从 M-1 提升到 ML-1其中 L 是每个阵元后面接的抽头数。多出来的这些自由度可以同时对付不同方向、不同频率的干扰这是它相比纯空域最本质的优势。1.2 空时联合处理到底在做什么想理解空时处理可以先看一个生活化的例子。你在一场很吵的聚会上想听清对面人说话耳朵只能靠方向来“聚焦”但如果环境里有个和你朋友方向几乎一样的喇叭在放音乐你是不是很难只靠转头来屏蔽它这时候如果你能分辨音调、音色、频率成分即使方向和朋友完全重合你依然可以用“频率”这一维把音乐滤掉只留下人声。空时波束形成做的就是这件事。它的物理结构是每个阵元后面接一条由 L-1 个延迟单元组成的抽头延迟线每个抽头处都有一个可调复数权值。这样一来阵列输出就不只是某一时刻各阵元的加权和而是把过去 L 个时刻的空间快拍一起加权求和。相当于在每一个空间通道后面又加了一个 L 阶 FIR 滤波器可以按频率来整形响应。用数学一点的语言描述空域导向矢量只描述信号到达各阵元的相位差空时导向矢量则把这一步扩展成一个 MN 维向量把“到达各阵元的相位差”和“信号在时间维上的相对延迟”同时编码进去。最终形成的方向图是“角度-频率”二维响应你既可以在某个角度上形成零陷也可以在一个指定的频率偏移处形成零陷两者互不影响自由度大大增加。1.3 应用场景和为什么一定要先做 MATLAB 仿真空时波束形成在工程上最常见的应用是雷达的地杂波抑制也就是著名的 STAP 技术。地面或海面的强杂波回波在角度和多普勒两个维度上都有分布单靠空域滤波很难区分低速目标和强杂波空时联合处理则可以同时在角度和多普勒维形成凹陷把慢动目标从杂波背景里挑出来。同样的思路在卫星导航抗干扰里也大量使用。导航接收机面临的干扰往往是大功率宽带压制干扰或窄带扫频干扰并且可能同时从多个方向进来。加装抗干扰天线的接收机内部核心算法就是空时自适应处理。相比纯空域抗干扰阵空时可以同时抑制窄带和宽带干扰通常只需要 4 到 7 个阵元、每通道 3 到 5 个抽头就能获得 40dB 以上的干扰抑制比。通信领域里的干扰消除也类似尤其是多径和同频干扰同时存在的场景。那为什么在写 FPGA 或 DSP 代码之前一定要先把 MATLAB 仿真跑通因为空时处理的参数空间实在太大了。阵元数、抽头数、快拍数、对角加载量、干扰个数、干扰带宽任何一个参数变化都会直接影响收敛速度和零陷深度。这些东西不在仿真里先摸一遍直接上硬件等于盲人摸象调一次板子的成本够你在 MATLAB 里试几千组参数了。2. 仿真核心模块设计与关键参数解析2.1 信号模型与默认参数设置我在仿真里使用的信号模型是这样的有一个 M 元均匀线阵阵元间距取半波长每个阵元后接 L-1 个延迟单元构成 L 阶抽头延迟线基带采样率记为 Fs期望信号、窄带干扰和宽带干扰同时进入阵列接收数据中还叠加了复高斯白噪声。默认参数我列在这儿程序里都做成了可配置变量参数符号默认值说明阵元数M8均匀线阵抽头数L5每个阵元的时域滤波阶数快拍数N1000训练样本数阵元间距d0.5 lambda半波长期望信号角度theta_s10°与阵列法线夹角期望信号 SNRSNR0 dB单阵元输入信噪比窄带干扰角度theta_j-30°干扰来波方向窄带干扰 INRINR40 dB单阵元输入干噪比宽带干扰角度theta_j2-5°宽带干扰来波方向宽带干扰 INRINR230 dB宽带干扰干噪比加性噪声-复高斯单位功率白噪声这里有一个很重要的细节窄带干扰我直接用复正弦叠加随机初相建模宽带干扰则采用高斯白噪声通过一个带通 FIR 滤波器来生成占用带宽设置为信号带宽的 60% 左右。很多初学者图省事把宽带干扰也建成几个单频点叠加这样空时处理依然能抑制但体现不出宽带干扰和空域处理的对抗关系仿真结论会失真。2.2 空时数据矩阵的构造方法空时处理的第一步也是新手最容易写错的一步是把原始空域快拍转换成空时快拍。假设 t 时刻的 M 维空域快拍记为 x(t)那么空时快拍要包含当前时刻和之前 L-1 个时刻的快拍拼成一个 ML 维向量。这里的物理含义是每个阵元上做一个长度为 L 的滑窗把最近 L 个采样时刻的数据全部纳入一次自适应处理。写成 MATLAB 很简单% 假设 X 是 M x N 的复矩阵N 为总采样快拍数 % 构造空时快拍矩阵 X_st尺寸为 (M*L) x (N-L1) X_st zeros(M*L, N-L1); for t 1 : N-L1 x_tmp zeros(M*L, 1); for l 0 : L-1 x_tmp(l*M1 : (l1)*M) X(:, t L-1 - l); end X_st(:, t) x_tmp; end这种循环写法直观但大数据量下效率低。实测中我一般用更高效的方式先对每个阵元的数据做循环移位让每一行对应一个延迟时间然后再拼接。核心逻辑是一样的都是把多时刻的阵列快拍沿时间维展开。构造好 X_st 之后样本协方差矩阵就是 R_hat X_st * X_st / (N-L1)。这里有一个关键点希望你能记住如果直接用原始快拍 X 做协方差估计得到的是纯空域协方差后面就算你强行把权值向量加长也无法形成真正的时间维描述处理结果和空域 MVDR 没有本质区别。2.3 协方差估计、对角加载与稳健求权空时 MVDR 的核心优化问题和空域版本形式一致都是求解如下问题在期望方向-频率响应的约束下最小化输出功率。写成方程就是min w R w约束条件为 w s_st 1其中 s_st 是空时导向矢量。求解结果也很标准w inv(R) s_st / (s_st inv(R) s_st)但工程仿真的第一课就是千万不要直接对原始样本协方差矩阵求逆。原因有两个一是当快拍数不足或者存在强相关干扰时协方差矩阵会病态甚至奇异MATLAB 求逆直接报 warning二是在低快拍场景下估计误差会导致自适应方向图畸变凹口偏移干扰抑制性能大幅下降。我通常的做法是加对角加载也就是给协方差矩阵的对角线加上一个小的常数值% 对角加载系数设置经验值一般取噪声功率的 1~10 倍 gamma 1e-3 * trace(R_hat) / (M*L); % 相对加载 R_dl R_hat gamma * eye(M*L); w (R_dl \ s_st) / (s_st * (R_dl \ s_st));注意我这里用了矩阵左除而不是求逆MATLAB 里左除在数值稳定性上比 inv 好很多尤其是对病态矩阵。对角加载量的选取是个平衡问题加载太小起不到正则化作用加载太大则自适应零陷变浅。一般来说加载量取噪声功率量级或者用 trace 均值乘以一个 0.001 到 0.01 的系数在这个范围内做参数扫描看输出 SINR 的曲线选择最优值。这个细节是我在实际项目里对比了很多组实验后得到的经验比教科书里那些理论推导要实用得多。2.4 输出信干噪比与理论最优值判断空时算法写没写对不能光看方向图上有没有凹口更可靠的是看输出 SINR 是否接近理论最优。仿真输出表达式为SINR_out P_s * abs(w * s_st)^2 / (w * R_u * w)其中 P_s 是期望信号功率R_u 是干扰加噪声协方差矩阵不含期望信号。理论最优输出 SINR 用标准公式计算SINR_opt P_s * s_st * inv(R_u) * s_st我每次跑完仿真都会把 SINR_out 和 SINR_opt 打印出来对比如果两者差距在 1dB 以内说明自适应权值逼近最优解如果偏差很大优先检查空时导向矢量方向和协方差矩阵构造。3. 完整 MATLAB 实现过程可运行版本3.1 工程文件结构建议一个能长期复用的仿真工程我不建议把所有代码堆在一个脚本里。我的习惯是把数据生成、空时处理、结果绘图分成三个模块方便后续替换信号模型或者算法做对比。目录结构大致如下stap_demo/ ├── main_stap_demo.m % 主脚本参数配置调用流程 ├── utils/ │ ├── gen_source_data.m % 生成期望信号和干扰 │ ├── build_st_snapshot.m % 构建空时快拍 │ ├── st_steering_vec.m % 空时导向矢量 │ └── compute_weights.m % MVDR对角加载求解权值 └── results/ % 保存仿真图和数据这样拆的好处是改信号模型时只动 gen_source_data.m换算法时只动 compute_weights.m主脚本基本不用动可读性也高得多。3.2 主流程代码与关键解释主脚本的逻辑并不复杂从上到下依次是参数配置、数据生成、空时处理、性能评估、画图。% main_stap_demo.m clear; clc; close all; rng(2025); % 固定随机种子便于复现 % ---------- 1. 参数配置 ---------- M 8; % 阵元数 L 5; % 抽头数 N 1000; % 总快拍数 fs 40e6; % 采样率 fc 1.5e9; % 载频仿真中用于计算波长 lambda 3e8 / fc; d lambda / 2; % 阵元间距 theta_s 10; % 期望信号角度 SNR_dB 0; % 期望信号信噪比 theta_j -30; % 窄带干扰角度 INR_dB 40; % 窄带干扰干噪比 theta_b -5; % 宽带干扰角度 INR_b_dB 30; % 宽带干扰干噪比这里固定随机种子是很多人会忽略的细节。自适应仿真的性能曲线本身带随机性如果不固定 rng你每次跑出来的 SINR 曲线都是抖的就很难判断是算法改好了还是随机波动。固定种子之后才能保证不同算法之间的对比是在同一组噪声和干扰样本上进行的。接着是数据生成部分我把期望信号设置成一个随机相位调制的窄带信号干扰生成参考 2.1 节中的方式% 期望信号随机复包络等功率 Ps 10^(SNR_dB/10); s sqrt(Ps) * exp(1i * (2*pi*rand(N,1) 0j)); % 空域导向矢量 a_s exp(1i * 2*pi * d/lambda * (0:M-1) * sind(theta_s)); % 阵列接收到的期望信号 X_s a_s * s.; % 窄带干扰 Pj 10^(INR_dB/10); f_j 5e6; % 干扰频偏相对中心频率 j_nb sqrt(Pj) * exp(1i * (2*pi*f_j/fs * (0:N-1) 2*pi*rand)); a_j exp(1i * 2*pi * d/lambda * (0:M-1) * sind(theta_j)); X_j a_j * j_nb.; % 宽带干扰高斯白噪声经过带通滤波模拟占一定带宽的干扰 Pb 10^(INR_b_dB/10); j_bb sqrt(Pb) * randn(1, N64); bw_filt designfilt(bandpassfir, FilterOrder, 32, ... CutoffFrequency1, 2e6, CutoffFrequency2, 8e6, ... SampleRate, fs); j_bb filter(bw_filt, j_bb); j_bb j_bb(33 : 33N-1); a_b exp(1i * 2*pi * d/lambda * (0:M-1) * sind(theta_b)); X_b a_b * j_bb; % 噪声 Pnoise 1; X_n sqrt(Pnoise/2) * (randn(M,N) 1i*randn(M,N)); % 总接收数据 X X_s X_j X_b X_n;窄带干扰这里加了一个 5MHz 的频偏宽带干扰带宽设为 2 到 8MHz这样在空时二维谱图上两者的位置区别很明显也方便后面和纯空域做对比。然后是核心的空时处理链路。先构造空时导向矢量再构建空时快拍、估计协方差、加载求权% ---------- 2. 空时导向矢量 ---------- st_vec st_steering_vec(theta_s, 0, M, L, d, lambda, fs); % ---------- 3. 构建空时快拍 ---------- X_st build_st_snapshot(X, L); % ---------- 4. 协方差估计与求权 ---------- w compute_weights(X_st, st_vec); % ---------- 5. 提取干扰加噪声协方差用于性能评估 ---------- % 重新生成不含期望信号的干扰加噪声部分 X_un X_j X_b X_n; X_st_un build_st_snapshot(X_un, L); R_u X_st_un * X_st_un / size(X_st_un, 2);这里要特别说明评估输出 SINR 时必须用“不含期望信号”的干扰加噪声协方差不能直接使用包含所有分量的 R_hat否则期望信号本身会被当成干扰来计算数值会偏离实际性能。3.3 三个核心函数逐一说明空时导向矢量是这次代码里最容易写错的地方。s_st 等于时域导向矢量与空域导向矢量的克罗内克积时域导向矢量描述的是信号在抽头延迟线上的相位变化。对基带信号而言如果期望信号无频偏则时域导向矢量是常规的延迟相位矢量如果期望信号有频偏 f_s则每个抽头的相位差是 exp(1i * 2pif_s/fs * l)。function st_vec st_steering_vec(theta, f_s, M, L, d, lambda, fs) a_space exp(1i * 2*pi * d/lambda * (0:M-1) * sind(theta)); t_delay (0:L-1); a_time exp(-1i * 2*pi * f_s/fs * t_delay); st_vec kron(a_time, a_space); end这里的顺序我习惯用 kron(a_time, a_space)也就是每个时间延迟都对应整组空域导向矢量这和快拍构造时“同一时刻各阵元数据整体排列”的顺序保持一致。如果顺序对不上后面约束条件就全错了这是最容易犯的低级错误。构建空时快拍的函数和我在 2.2 节里给的一致但实际工程里我会把循环方式优化成一种更高效的写法function X_st build_st_snapshot(X, L) [M, N] size(X); n_out N - L 1; X_st zeros(M*L, n_out); for l 0 : L-1 X_st(l*M1 : (l1)*M, :) X(:, L-l : end-l); end end这样每次复制一个 M 行连续块比内层再套一层循环快很多。等数据量特别大的时候还可以考虑直接预分配好分块 Hankel 矩阵但一般仿真规模用上面这个写法就够了。求权值的函数也打包起来方便后续和其他算法做统一接口function w compute_weights(X_st, st_vec) R X_st * X_st / size(X_st, 2); gamma 1e-3 * trace(R) / length(st_vec); R_dl R gamma * eye(length(st_vec)); invR_s R_dl \ st_vec; w invR_s / (st_vec * invR_s); end3.4 结果图像与判读方法仿真跑完我会画三张图。第一张是角度-频率二维响应图横轴是方向角纵轴是归一化频率颜色深浅代表响应增益。这张图最能直观说明空时处理的优势期望信号位置应该在增益最高的地方窄带干扰和宽带干扰所在的角度-频率位置应该有明显的深色凹槽。第二张是输出 SINR 随快拍数的收敛曲线对比空域 MVDR 和空时 MVDR。第三张是不同抽头数 L 下最终 SINR 的柱状图。画二维响应图时有个技巧不要在整个角度-频率平面网格上暴力遍历那样计算量很大。先固定几个关心的频点做角度切面再固定几个角度做频率切面组合起来判断响应是否合理。实际项目里我一般先看 -30° 干扰方向在 5MHz 频偏处的响应增益是不是低于 -40dB再看 10° 期望方向在中心频率处的增益是否接近 0dB两个条件同时满足才说明这组权值真正做到了“角度频率”双重抑制。4. 典型场景下空时对比空域的性能分析4.1 对比实验设计为了说明空时处理到底强在哪我在仿真里设置了三组有代表性的对比场景让空域 MVDR 和空时 MVDR 跑同样的输入数据对比最终输出 SINR 和方向图零陷深度场景 A单个窄带干扰角度 -30°频偏 5MHz远离期望信号方向。这是最经典的场景空域和空时应该都能较好抑制。场景 B干扰角度与期望信号仅差 1°即干扰在 11°但频偏比较大为 10MHz。这个场景下空域应该崩因为干扰和信号角度几乎重合空时则有机会靠频率维把二者分开。场景 C一个 -30° 窄带干扰加一个 -5° 宽带干扰同时存在。空域的 M-1 自由度还不够用空时则应该从容应对。下面表格是我在某次固定随机种子下跑出来的典型结果实际数值会随随机种子有少许浮动但趋势是确定的场景空域 MVDR 输出 SINR (dB)空时 MVDR 输出 SINR (dB)空域是否形成正确零陷A单一窄带干扰2225是B角度接近频偏-219否主瓣畸变C窄带宽带混合824部分失效有个现象值得注意场景 A 里空域表现其实也不错因为干扰角度离得远空域自由度足够。很多初学者跑通这个场景后就觉得算法没问题其实恰恰是这种“看起来不错”的场景最容易掩盖问题。真正能拉开差距的是场景 B 和场景 C。4.2 为什么空时在场景 B 和 C 里明显占优场景 B 里干扰和期望信号只差 1°阵列的瑞利分辨率大概 2 度多一点干扰基本落在主瓣内部。空域 MVDR 试图在主瓣内部形成零陷结果是主瓣被深深撕裂副瓣电平抬高期望信号增益也掉了好几 dB输出 SINR 反而比直接不做自适应还差。空时处理则完全不同。它可以在角度接近的分量之间依靠频率偏移把两者分开。干扰有 10MHz 频偏而期望信号在中心频率上所以空时权值等价于在期望信号方向保持一个通带同时在干扰的方向和频率上形成二维零陷。即使角度方向接近频率维的自由度也能完成分离。场景 C 体现的是自由度优势。空域只有 M-17 个自由度两个干扰加一个期望信号约束勉强能算出权值但其中一个干扰是宽带信号会在很宽的角度响应范围内产生残余泄漏。空时自由度是 ML-139 个处理两个乃至四五个干扰都非常从容。顺便说一句这也解释了为什么工程上很少用纯空域做多干扰强对抗场景自由度完全不够用。4.3 抽头数、快拍数、对角加载量的敏感性抽头数 L 不是越大越好。每增加一个抽头自由度增加 M 个但同时也意味着协方差矩阵维度增大需要的训练样本量、求逆计算量都跟着涨。我在 8 阵元配置下试过 L 从 1 到 10 的变化结论是 L 在 4 到 7 之间时输出 SINR 提升最明显再往上就基本饱和有时还会因为样本不足导致协方差估计质量下降。快拍数和自由度之间的关系有一个经验公式样本数至少要在协方差矩阵维度的 2 到 3 倍以上。对 40 维的空时协方差矩阵来说N 低于 100 的时候输出 SINR 比理论最优值低 5dB 以上是很正常的。对角加载量则是一个“安全阀”在低快拍下给的系数可以稍微大一点比如 trace 均值乘以 0.01虽然会牺牲一点零陷深度但能换来自适应方向图的稳定性。5. 新手最容易踩的坑与排查技巧5.1 协方差矩阵奇异或病态权值爆炸症状很直接MATLAB 输出矩阵接近奇异警告或者算出来的 w 里面某些元素幅值达到 10 的几十次方。本质原因是训练样本数不足、干扰样本相关性强或者抽头数过大导致协方差矩阵不满秩。解决思路从简单到复杂排列先加对角加载这能解决绝大部分问题如果还不行检查 X_st 的维度是否 40x900 左右样本数远大于维度数最后考虑用伪逆 pinv 代替左除但我不建议把它当首选因为 pinv 本质上也是一种粗暴的正则化手段方向图质量通常不如对角加载。5.2 期望信号自消现象当你发现输出 SINR 反而比输入 SNR 还低方向图中期望信号方向出现了一个诡异的凹陷大概率就是信号自消。这可能是因为训练快拍里包含了较强的期望信号分量自适应算法为了“抑制”它而把它当成干扰来处理或者空时导向矢量与实际信号有失配比如角度、频率稍有偏移也会触发自消。工程上的处理方式有两个方向一是尽量让训练样本中不包含期望信号这在雷达 STAP 里通常通过距离波门选择只含杂波的样本二是在算法层面对权值做额外约束比如增加更多线性约束点、使用对角加载增大信号方向的鲁棒性。仿真中如果发现自消最简单的快捷验证方式是把输入 SNR 调低到 -10dB看自消现象是否消失如果是说明协方差里期望信号分量太大需要考虑用不含信号的样本来估计协方差。5.3 宽带干扰建模错误导致结论失真我在 2.1 节强调过宽带干扰要用随机噪声通过带通滤波器来产生而不能用几个离散正弦叠加。原因很简单用离散正弦叠加生成的信号在频域是稀疏的空时自适应只需要几个频率点就能完美抑制而真实宽带干扰在每个频点上都有连续能量自适应滤波器需要在整个频段内部署零陷难度完全不同。如果你发现自己不管怎么调参数对宽带干扰也只能压到 -20dB 左右第一件事就是检查干扰是不是真的“宽带”带宽是否占据了信号带宽的一半以上。另一个相关问题是宽带干扰的角度扩展。真实干扰源不是理想点源可能会有几度的角度扩展这在仿真里可以建模成多个连续角度的入射信号叠加。如果角度扩展范围太大空时零陷会被拉宽深度变浅属于正常现象不用慌。5.4 延迟抽头顺序混乱导致结果错误这个坑非常隐蔽而且不会报错。kron 的计算顺序、快拍矩阵的行排列顺序、导向矢量里的延迟顺序三者在代码里必须完全一致。我曾经有一次在重构代码时把 kron 参数从 (a_time, a_space) 换成了 (a_space, a_time)结果所有仿真曲线看起来都很正常但期望信号方向增益变成了 -3dB整整调了一天才定位到问题。建议固定一套顺序规范如果快拍函数里是“先空间后时间”的排列那么导向矢量也用“先时间后空间”的克罗内克积顺序来匹配如果快拍里是“先时间后空间”导向矢量就要反过来用“先空间后时间”。最好在代码注释里把维度排列写清楚不然隔一个月再回头读代码真的会忘。5.5 性能评估指标口径不统一最后一个坑在评估环节。不同的人用不同的公式算输出 SINR有的用包含期望信号的协方差有的用不含期望信号的协方差算出来的数值差可能高达 5 到 10dB。我建议统一采用“输出 SINR 用不含期望信号的干扰加噪声协方差来计算”这个口径同时把理论最优值也打印出来作为算法收敛性能的锚点。只要实现了理论最优值的 90% 以上这个算法在仿真层面的调优就算完成了。我个人在实际操作中的体会是跑空时波束形成的 MATLAB 仿真最重要的并不是把代码调通一次而是建立一套“对比-验证-定位”的工作习惯每次修改算法或参数都同时比较空域与空时、仿真值与理论值并且把方向图、收敛曲线、零陷深度这些指标固化成一个标准测试流程。这样后续换信号模型、换干扰类型、换约束准则时你才能快速看出变化在哪个环节。这套代码再往后扩展可以加入子阵空时处理来降低计算量也可以把 MVDR 换成 LCMV 增加多约束点或者在协方差估计环节引入稀疏重构类算法来处理单快拍场景。方向很多但基础的空时数据构造和导向矢量定义不会变把这一层打扎实了后面都是锦上添花。本文还有配套的精品资源点击获取