简介这份资源面向无线通信、雷达系统与阵列信号处理方向的学习者和工程师聚焦窄带波束形成的MATLAB仿真实现帮助读者理解从常规波束形成到自适应算法的完整技术脉络。压缩包共5个文件全部为m脚本体积约4KB分别对应常规波束形成、LMS与RLS自适应算法、LCMV约束最小方差以及Capon谱估计等典型方法覆盖预定义权值、动态权值调整与干扰抑制等核心环节。资源已有1414人学习下载说明其在教学与入门实践中具有一定参考价值。读者可借助这些脚本模拟多天线阵列、生成输入信号、计算并应用波束权值进而观察不同算法下的波束图案与旁瓣表现对比收敛速度与计算复杂度的差异。对于希望快速搭建实验平台、验证波束形成原理或改进现有策略的研究者而言这是一份便于上手且结构紧凑的实践素材。1. 窄带波束形成与常规波束形成从 MATLAB 仿真到方向图验证阵列信号处理里窄带波束形成是最先要啃下来的一块硬骨头。所谓窄带指的是信号带宽远小于载波频率各阵元接收到的同一信号只差一个相位包络基本不变——这个假设一旦成立后面所有的加权求和才有意义。常规波束形成CBF就是最朴素的实现给每个阵元乘一个相位补偿权值让期望方向的信号同相叠加其他方向相互抵消。听起来简单但真正动手写 MATLAB 的时候阵元间距怎么设、扫描角度怎么取、权值用共轭转置还是直接点乘每一步都有讲究。这份资源围绕窄带波束形成和常规波束形成的 MATLAB 实现展开适合正在做阵列信号处理课程设计、水声通信仿真或者雷达方向图验证的从业者。如果你手上有一组均匀线阵数据想快速跑出方向图、验证权值设计对不对接下来的内容能直接抄作业。2. 均匀线阵建模阵元间距、导向矢量与扫描角度的参数设定2.1 窄带假设下的信号模型怎么建窄带波束形成的核心假设是信号到达不同阵元的时间差只体现为载波相位的差异包络不变。数学上一个来自角度 θ 的远场窄带信号在第 m 个阵元上的接收可以写成 s(t)·exp(-j·2π·d·m·sinθ/λ)其中 d 是阵元间距λ 是波长。把所有阵元的相位因子排成一个列向量就是导向矢量 a(θ)。这个向量是后续所有波束形成操作的基石写错了后面全盘皆输。我一般会先确定三个参数阵元数 N、阵元间距 d、信号波长 λ。工程上 d 通常取半波长即 d λ/2目的是避免空间混叠——如果 d 大于半波长方向图会出现栅瓣把真实来波方向搞乱。扫描角度范围一般取 -90° 到 90°步长 0.1° 或 0.5° 看精度需求。下面这段代码把导向矢量矩阵建出来每一列对应一个扫描角度。% 均匀线阵导向矢量矩阵构建 N 16; % 阵元数 d 0.5; % 阵元间距单位波长 theta -90:0.1:90; % 扫描角度范围单位度 theta_rad deg2rad(theta); % 阵元位置索引从0到N-1 m (0:N-1).; % 导向矢量矩阵 A尺寸 N x length(theta) % 每一列对应一个角度的导向矢量 A exp(-1j * 2 * pi * d * m * sin(theta_rad));这段代码里m是列向量sin(theta_rad)是行向量两者相乘得到 N×L 的相位矩阵。注意指数上的负号——它对应的是阵列接收信号的相位延迟如果你在发射端做波束形成符号要反过来。d用波长归一化这样不用单独代入 λ 的具体数值换频率时只改 d 的物理值再归一化即可。theta的步长决定了方向图的分辨率0.1° 足够画出光滑曲线但如果你要做实时处理步长可以放到 1° 减少计算量。2.2 常规波束形成的权值计算与方向图合成常规波束形成的权值就是导向矢量的共轭。对于扫描角度 θ₀权值向量 w a(θ₀)/N除以 N 是为了归一化增益让主瓣峰值保持在 0 dB。把权值作用到导向矢量矩阵上得到的就是阵列响应B(θ) wᴴ·a(θ)。对所有扫描角度算一遍就得到方向图。% 常规波束形成扫描角度 theta0 处的权值 theta0 0; % 假设期望方向为0度 theta0_rad deg2rad(theta0); m (0:N-1).; % 期望方向的导向矢量 a0 exp(-1j * 2 * pi * d * m * sin(theta0_rad)); % 权值导向矢量共轭并归一化 w a0 / N; % 计算阵列响应 B w * A; % 1 x length(theta) 复数 B_db 20 * log10(abs(B) eps); % 转dB加eps防止log0 % 画方向图 figure; plot(theta, B_db, LineWidth, 1.5); xlabel(角度 (度)); ylabel(归一化幅度 (dB)); title(常规波束形成方向图); grid on; ylim([-40, 0]);这里w是共轭转置A是前面建的导向矢量矩阵。abs(B)取模得到幅度20*log10转成 dB。加eps是防止某些角度响应恰好为零时 log 报错。画出来的图主瓣在 0° 处峰值 0 dB第一副瓣大约 -13 dB——这是均匀加权线阵的固有特性想压低副瓣就得换窗函数比如切比雪夫窗或汉明窗那是后面进阶的事。提示如果你的方向图主瓣不在设定角度上先检查sin里的符号和m的起始值。阵元索引从 0 开始还是从 1 开始会影响相位参考点但不影响方向图形状只影响整体相位。2.3 阵元数、间距对方向图的影响怎么量化阵元数 N 决定主瓣宽度和增益。N 越大主瓣越窄阵列增益越高但计算量和硬件成本也上去了。阵元间距 d 影响栅瓣位置d λ/2 时无栅瓣d λ 时在 ±90° 附近出现栅瓣d λ 时栅瓣进入可见区。下面这张表把几个典型参数下的主瓣宽度和第一副瓣电平列出来方便选型时参考。阵元数 N阵元间距 d主瓣宽度-3dB第一副瓣电平80.5λ约 12.8°-13.2 dB160.5λ约 6.4°-13.2 dB320.5λ约 3.2°-13.2 dB161.0λ约 3.2°出现栅瓣主瓣宽度近似为 0.886·λ/(N·d) 弧度换算成度再除以 cosθ₀扫描到端射时会展宽。第一副瓣电平由加权方式决定均匀加权固定 -13.2 dB。如果你需要更低副瓣比如 -30 dB就得用切比雪夫加权代价是主瓣展宽。这些量化关系在写报告或做方案时直接引用比只贴一张图更有说服力。3. 从仿真到验证MATLAB 代码实现、LMS 自适应与常见翻车点3.1 完整可运行的窄带波束形成脚本把前面的片段串起来加上信号源和噪声就是一个完整的仿真脚本。我习惯把参数集中放在开头后面只引用变量名这样改参数不用满篇找。下面这个版本包含信号生成、阵列接收、波束形成和方向图绘制直接复制到 MATLAB 里就能跑。% 窄带波束形成完整仿真 clear; close all; clc; % 参数区 N 16; % 阵元数 d 0.5; % 阵元间距波长归一化 theta_s 20; % 信号来波方向度 theta_scan -90:0.1:90; % 扫描角度 SNR 10; % 信噪比 dB fs 1000; % 采样率 t (0:999)/fs; % 时间向量 f0 100; % 信号频率 % 信号生成 s exp(1j*2*pi*f0*t); % 窄带复指数信号 m (0:N-1).; a_s exp(-1j*2*pi*d*m*sind(theta_s)); % 信号方向导向矢量 X a_s * s; % N x T 阵列接收无噪声 % 加噪声 noise (randn(N, length(t)) 1j*randn(N, length(t))) / sqrt(2); noise noise * norm(X(:)) / norm(noise(:)) * 10^(-SNR/20); X X noise; % 常规波束形成 theta_rad deg2rad(theta_scan); A exp(-1j*2*pi*d*m*sind(theta_scan)); w exp(-1j*2*pi*d*m*sind(theta_s)) / N; % 指向信号方向 B w * A; B_db 20*log10(abs(B) eps); % 绘图 figure; plot(theta_scan, B_db, b, LineWidth, 1.5); hold on; xline(theta_s, r--, Signal Direction); xlabel(角度 (度)); ylabel(幅度 (dB)); title([常规波束形成方向图, N, num2str(N), , SNR, num2str(SNR), dB]); grid on; ylim([-50, 0]);这段脚本的关键点sind是直接输入角度制省去deg2rad噪声按信噪比缩放保证SNR参数真实有效w指向theta_s所以主瓣应该对准 20°。跑完你会看到主瓣在 20° 处副瓣在 -13 dB 左右。如果主瓣偏了检查theta_s和w里的角度是否一致。3.2 LMS 自适应波束形成怎么接进来常规波束形成的权值是固定的依赖来波方向已知。实际场景里方向可能估计不准或者有干扰。LMS最小均方自适应波束形成通过迭代更新权值让输出误差最小化不需要精确知道来波方向。核心迭代公式是 w(n1) w(n) μ·e*(n)·x(n)其中 μ 是步长e(n) 是期望信号与阵列输出的差。% LMS自适应波束形成 mu 0.001; % 步长 w_lms zeros(N, 1); % 初始权值 y zeros(1, length(t)); % 输出 e zeros(1, length(t)); % 误差 % 期望信号假设已知参考信号 d_ref d_ref s; % 这里直接用源信号作参考 for n 1:length(t) x_n X(:, n); % 当前快拍 y(n) w_lms * x_n; % 阵列输出 e(n) d_ref(n) - y(n); % 误差 w_lms w_lms mu * conj(e(n)) * x_n; % 权值更新 end % 用收敛后的权值画方向图 B_lms w_lms * A; B_lms_db 20*log10(abs(B_lms) eps); figure; plot(theta_scan, B_lms_db, r, LineWidth, 1.5); xlabel(角度 (度)); ylabel(幅度 (dB)); title(LMS自适应波束形成方向图); grid on; ylim([-50, 0]);步长mu的选取是 LMS 最玄学的地方太大收敛快但稳态误差大太小收敛慢但精度高。经验值是0 mu 1/(N·P_x)P_x 是输入信号功率。我一般先取 0.001 跑一遍看误差曲线是否单调下降如果震荡就减半。参考信号d_ref在实际中通常用训练序列仿真里直接用源信号。LMS 收敛后的方向图会在信号方向形成主瓣同时在干扰方向形成零陷——这是它比常规波束形成强的地方。3.3 避坑与排查方向图不对时先查这五条现象一方向图主瓣不在设定角度偏移了好几度。原因通常是sin和sind混用或者角度制转弧度时漏了deg2rad。MATLAB 的sin吃弧度sind吃角度混用必翻车。解决统一用sind/cosd或者在脚本开头把角度全部转弧度并注释清楚。现象二方向图出现多个大瓣分不清主副瓣。这是栅瓣原因是阵元间距 d 大于半波长。解决把 d 改回 0.5λ 以下或者用非均匀阵比如稀布阵打破周期性。如果必须用大间距扫描范围要限制在无栅瓣区间内。现象三LMS 误差曲线不收敛一直震荡。步长 mu 太大超过了稳定条件。解决按mu 1/(N·P_x)估算上限先取上限的十分之一跑稳定后再逐步加大。另外检查输入信号是否归一化量级太大也会导致发散。现象四方向图峰值不是 0 dB而是负数或正数。权值归一化没做对。常规波束形成里w a0/N除以 N 是为了峰值归一。如果你忘了除峰值会是 10*log10(N) dB。解决确认权值归一化因子或者画图前手动减掉最大值。现象五加噪声后方向图副瓣抬高主瓣变胖。这是正常的信噪比越低方向图越差。如果副瓣抬高到跟主瓣差不多说明 SNR 太低或者快拍数不够。解决提高 SNR、增加阵元数或增加快拍数做平均。单次快拍的方向图随机性很大通常要对多个快拍的自相关矩阵做平均再画图。注意仿真里用randn生成噪声每次结果略有不同。要复现完全一致的结果在脚本开头加rng(0)固定随机种子。4. 进阶技巧用自相关矩阵平均和窗函数压低副瓣4.1 多快拍自相关矩阵平均让方向图更稳单快拍方向图抖动大工程上更常用的是对多个快拍求自相关矩阵 R E[x·xᴴ]然后用 R 做波束形成。在 MATLAB 里用X * X / T估计 RT 是快拍数。基于 R 的常规波束形成权值不变但方向图用w * R * w计算输出功率画出来更平滑。% 多快拍自相关矩阵平均 T size(X, 2); R X * X / T; % N x N 自相关矩阵 % 基于R的波束形成输出功率 P_cbf zeros(1, length(theta_scan)); for k 1:length(theta_scan) a_k exp(-1j*2*pi*d*m*sind(theta_scan(k))); P_cbf(k) real(w * R * w); % 这里w仍指向theta_s end P_cbf_db 10*log10(P_cbf / max(P_cbf) eps); figure; plot(theta_scan, P_cbf_db, LineWidth, 1.5); xlabel(角度 (度)); ylabel(归一化功率 (dB)); title(基于自相关矩阵的波束形成); grid on; ylim([-50, 0]);注意这里用的是10*log10而不是20*log10因为 P 是功率量。real取实部是因为数值误差可能引入极小虚部。自相关矩阵平均后方向图副瓣更干净主瓣更稳定。快拍数 T 越大估计越准但计算量也越大。一般 T 取 100 到 1000 之间看信号变化快慢。4.2 切比雪夫窗加权把副瓣压到 -30 dB均匀加权的副瓣固定在 -13.2 dB很多场景不够用。切比雪夫窗可以在给定副瓣电平下让主瓣最窄。MATLAB 里用chebwin(N, atten)生成窗函数atten 是副瓣衰减 dB 数。把窗系数乘到权值上方向图副瓣就压下去了。% 切比雪夫加权 atten 30; % 副瓣衰减30dB win chebwin(N, atten); % 生成窗函数 w_cheb (a0 .* win) / N; % 加权权值 B_cheb w_cheb * A; B_cheb_db 20*log10(abs(B_cheb) eps); figure; plot(theta_scan, B_db, b--, theta_scan, B_cheb_db, r, LineWidth, 1.5); legend(均匀加权, 切比雪夫加权); xlabel(角度 (度)); ylabel(幅度 (dB)); title(窗函数加权对比); grid on; ylim([-60, 0]);跑出来你会看到切比雪夫加权的副瓣降到 -30 dB但主瓣比均匀加权宽了大约 1.5 倍。这就是副瓣与主瓣宽度的权衡没有免费午餐。atten参数可以调常见值 20、30、40 dB。注意chebwin返回的是列向量跟a0点乘时维度要匹配。如果 N 是奇数chebwin也能处理但中心阵元权值最大两边对称递减。4.3 验证方向图是否正确的三个硬指标写完代码别急着截图交差先过这三条验证第一主瓣峰值必须在 0 dB 附近偏差超过 0.5 dB 说明归一化有问题第二主瓣宽度跟理论值 0.886·λ/(N·d·cosθ₀) 对得上偏差超过 10% 检查扫描步长和角度定义第三副瓣电平跟加权方式匹配均匀加权 -13 dB切比雪夫按设定值。这三条过了方向图基本可信。我自己的习惯是每次改完参数先把theta_s设成 0°、30°、60° 各跑一遍看主瓣是否跟着移动、宽度是否随扫描角展宽。端射方向±90°附近主瓣会展得很宽这是正常物理现象不是代码 bug。从那以后我每次交报告前都强制走一遍这三条验证省得被导师问住。希望帮到你。本文还有配套的精品资源点击获取