
简介自适应波束形成是雷达与无线通信中提升信号质量、抑制干扰的关键技术。这份MATLAB源码包主要面向通信、雷达相关专业的学生和工程师提供了三种典型自适应算法的可运行实现LMS、RLS与SMI。通过调用对应m文件可以对比不同算法在权值迭代、收敛速度、稳态误差等方面的表现并观察波束方向图随参数调整的变化。压缩包内共3个m文件分别为LMS.m、RLS.m、SMI.m包体仅3KB代码量精简、无冗余文件适合快速定位算法核心并在此基础上扩展实验。目前已有1706人学习浏览说明该资源在同类算法演示中具有一定参考价值。借助这些源码读者可以快速掌握最小均方误差、递归最小二乘以及SMI算法的迭代公式、参数设置与实现细节通过修改输入信噪比、阵元数等条件观察输出差异从而更深入地理解自适应波束形成在实际系统中的应用与权衡为后续算法优化和工程实践打下基础。1. 从天线阵列到权向量自适应波束形成要解的到底是什么一个 8 阵元均匀线阵0° 方向来目标回波30° 方向进来一个功率高 30 dB 的干扰固定波束在干扰方向最多只能压到旁瓣电平结果就是信号被干扰完全盖住。自适应波束形成的做法是给每个阵元配一个复数权用某种准则让权向量在干扰方向自动挖出深零陷。工程里最常见的三条路线是LMS 用随机梯度逐步迭代、RLS 用指数加权最小二乘做递归逼近、SMI 则直接对采样协方差矩阵求逆拿闭式解。这篇文章基于 MATLAB 源码包里的 LMS.m、RLS.m、SMI.m把数据模型、迭代实现、参数边界、波束图对比和验收方法串起来讲适合做阵列信号处理课设、雷达抗干扰和通信抗干扰的工程师照着复现。2. 阵列信号建模与 LMS 迭代梯度噪声和步长怎么权衡2.1 均匀线阵的信号模型与导向矢量自适应波束形成的底层是阵列信号模型。设 M 个阵元等间距排成均匀线阵间距 d 通常取半波长。来波方向为 θ 的信号在相邻阵元间产生固定相位差把这组相位差写成向量就是导向矢量a(θ) [1, e^(j2πd·sinθ/λ), e^(j2πd·2·sinθ/λ), …, e^(j2πd·(M-1)·sinθ/λ)]^T阵列在某时刻收到的快照就是所有来波方向导向矢量与对应复幅度的乘积再叠加噪声。下面这段代码生成 8 阵元、一个期望信号加一个干扰的仿真数据是后面三个算法公用的输入。% 参数8元均匀线阵阵元间距半波长 M 8; % 阵元数 d_lambda 0.5; % 阵元间距 / 波长 theta_s 0; % 期望信号方向 theta_i 30; % 干扰方向 % 导向矢量矩阵每一列对应一个方向 A exp(1j * 2 * pi * d_lambda * (0:M-1) * sind([theta_s, theta_i])); K 500; % 快拍数 s sqrt(10^(10/10)) * exp(1j * 2 * pi * rand(1, K)); % 期望信号SNR 10 dB iv sqrt(10^(30/10)) * exp(1j * 2 * pi * rand(1, K)); % 干扰INR 30 dB n (randn(M, K) 1j * randn(M, K)) / sqrt(2); % 复高斯白噪声 % 阵列接收快照8 x 500 X A(:,1) * s A(:,2) * iv n;sind直接用角度单位避免了手动 deg2radA的尺寸是8×2两列分别对应 0° 和 30° 的导向矢量。X的每一列是一个快照行是阵元通道。这里用随机相位生成信号和干扰幅度平方的均值就是各自功率所以sqrt(10^(SNR/10))这种写法能把 SNR 直接设到目标值。实际工程中如果拿采集数据做仿真这一段的噪声方差要按接收机底噪实测值来标定否则后面所有算法对比都会失真。2.2 LMS 迭代公式与步长边界LMS 的核心是用瞬时梯度代替统计梯度。设权向量为w第 n 个快照的输出为y(n) w^H x(n)与参考信号d(n)的误差为e(n) d(n) - y(n)则权值更新式为w(n1) w(n) μ · x(n) · e*(n)这里的 μ 是步长。LMS 收敛的必要条件是0 μ 2/λ_maxλ_max是输入协方差矩阵的最大特征值。实际工程中很难预知特征值退而求其次用输入功率上界近似μ 2/(M · P_x)P_x是单阵元接收功率的均值。超过这个边界权值会发散输出功率随迭代次数指数上涨MATLAB 里看到数值变成NaN或Inf基本都是这个原因。注意公式里是e*(n)而不是e(n)。阵列信号是复信号权向量每个元素都是复数梯度方向必须做共轭才能保证更新方向是误差曲面的下降方向。初学的人容易在这里漏掉conj结果就是算法根本不收敛波束图完全乱掉。2.3 LMS.m 的实现与梯度噪声源码包里的 LMS.m 本质就是上面公式的循环展开我按可读性重写如下function [w, e] LMS(x, d, mu) % x : M x K 阵列快照矩阵 % d : 1 x K 参考信号仿真中由期望方向匹配输出得到 % mu: 步长建议小于 2 / (M * mean(abs(x(:)).^2)) % w : M x 1 收敛后的权向量 % e : 每次迭代的瞬时误差功率用于画收敛曲线 [M, K] size(x); w zeros(M, 1); % 权向量初始化为 0 e zeros(1, K); for n 1:K xn x(:, n); y w * xn; % 当前权向量下的阵列输出 alpha d(n) - y; % 误差 w w mu * conj(alpha) * xn; % 梯度下降更新 e(n) abs(alpha)^2; % 记录误差功率 end end这个实现有三个细节值得说。第一w初始化为零向量在大多数场景没问题但如果干扰很强前几十个快照的输出会被干扰主导误差信号很大权值会产生一次明显抖动想要更平滑可以初始化为期望方向的导向矢量。第二mu是固定值这是标准 LMS 的特征稳态性能和收敛速度天然矛盾后面 RLS 的遗忘因子就是为了缓解这个矛盾。第三e(n)记录的是误差功率而不是误差本身画收敛曲线时能看到更直观的下降趋势。LMS 的稳态误差并不为零。因为每次更新用的是单次快照的瞬时梯度梯度估计本身有随机起伏权值收敛后在维纳解附近持续抖动这个抖动叫梯度噪声。调小 μ 能减小抖动但收敛变慢调大 μ 收敛快但稳态输出 SINR 会变差甚至越过稳定边界直接发散。提示调试时如果 LMS 输出功率在某个迭代点突然跳到1e20量级先检查 μ再检查conj有没有漏写这两处是 LMS 实现里最常见的两个问题。3. RLS 递归更新遗忘因子如何换取收敛速度3.1 从加权最小二乘到递推解RLS 的出发点不是随机梯度而是带遗忘的加权最小二乘准则。定义代价函数J(n) Σ_{i1}^{n} λ^(n-i) · |e(i)|²其中 λ 是遗忘因子取值范围 (0,1]。λ 越接近 1旧数据参与加权的比例越高等效训练序列越长λ 越小旧数据被指数级遗忘算法跟踪非平稳环境的能力越强。对J(n)求梯度并令其为零得到正规方程R(n)·w(n) r(n)其中R(n) Σ λ^(n-i) · x(i)·x^H(i)r(n) Σ λ^(n-i) · x(i)·d*(i)直接对 M×M 矩阵做一次求逆是 O(M³)RLS 的价值在于用矩阵求逆引理把求逆变成递推更新。设P(n) R⁻¹(n)则每个新快照到来时执行三步增益向量k(n) P(n-1)·x(n) / (λ x^H(n)·P(n-1)·x(n))权值更新w(n) w(n-1) k(n)·α*(n)其中α(n) d(n) - w^H(n-1)·x(n)协方差逆更新P(n) (P(n-1) - k(n)·x^H(n)·P(n-1)) / λ每次迭代从 O(M³) 降到 O(M²)这就是 RLS 能实时跑起来的原因。3.2 RLS.m 的实现与参数选取function [w, e] RLS(x, d, lambda, delta) % x : M x K 阵列快照矩阵 % d : 1 x K 参考信号 % lambda: 遗忘因子常用 0.98 ~ 0.999 % delta : P(0) 的初始化参数取 1/噪声功率 量级 % w : M x 1 最终权向量 % e : 每次迭代的误差功率 [M, K] size(x); P eye(M) / delta; % 初始协方差逆矩阵见下方说明 w zeros(M, 1); e zeros(1, K); for n 1:K xn x(:, n); Pxn P * xn; k Pxn / (lambda xn * Pxn); % 增益向量分母是标量 alpha d(n) - w * xn; % 先验误差 w w k * conj(alpha); P (P - k * xn * P) / lambda; % 协方差逆矩阵的秩1更新 e(n) abs(alpha)^2; end enddelta的取值对早期迭代影响很大。P(0) I/delta本质是对初始协方差矩阵的猜测如果噪声功率约等于 1delta 取 1 左右较为合理delta 太大相当于声明初始估计非常可信会让前几十步的权值更新被初始值牵着走。遗忘因子 λ 的选取要看信道变化速度和信噪比SNR 高可以取 0.999 追求稳态精度信道快速时变或者干扰方向在漂移降到 0.970.98 换取跟踪能力代价是稳态误差功率会明显抬高。有个坑值得说明RLS 名义上不需要选步长但 λ 和delta组合不当照样发散。特别当 x 的相关矩阵接近奇异时P的数值会快速增长几个快照内就溢出。遇到这种情况不要只调 λ先检查数据里是不是存在完全相关的通道比如两个阵元信号被意外复制成同一路。3.3 同一批快照下 LMS 与 RLS 的收敛对比在上一章的 8 阵元场景下跑两种算法参考信号d都用A(:,1) * X得到相当于把期望方向匹配滤波输出作为理想参考。对比结果如下表指标LMS (μ0.005)RLS (λ0.999)单次迭代计算量O(M)O(M²)输出 SINR 到达 -3 dB 的快拍数约 200约 20500 快拍后稳态 SINR 损失约 2.5 dB约 0.5 dB跟踪 30°→35° 干扰漂移跟不上约 40 快拍跟上LMS 的 O(M) 复杂度是它不可替代的优势RF 前端采样率动辄几十 MHz每个快照只有一次乘加运算FPGA 上很容易流水化RLS 的 O(M²) 在阵元数超过 32 后变得沉重但换来的是快一个量级的收敛速度。实际项目里常见做法是先用 RLS 或 SMI 跑一段数据完成初始化再切到 LMS 做稳态跟踪这样兼顾启动速度和稳态计算量。4. SMI 块处理用协方差矩阵求逆替代逐样本迭代4.1 先纠正一个以讹传讹的缩写不少课设文档把 SMI 写成“斯皮尔曼-米尔斯-伊万斯算法”这是完全错误的算法本身和这三个人名没有关系。SMI 是 Sample Matrix Inversion采样矩阵求逆思路很直接最优权向量在最小均方误差准则下的维纳解是w_opt Rₓ⁻¹ · r_xd其中Rₓ E[x·x^H]是阵列协方差矩阵r_xd E[x·d*]是接收快照与参考信号的互相关。SMI 的做法就是用有限快照的采样值估计这两个统计量再直接求逆一步到位不做逐样本迭代。当参考信号不可得时r_xd可以直接用期望方向的导向矢量a(θ₀)替代配合无失真约束w^H·a(θ₀) 1得到w (Rₓ δI)⁻¹ · a(θ₀) / (a^H(θ₀) · (Rₓ δI)⁻¹ · a(θ₀))Reed 等人早在 1974 年就给出了采样快拍数对性能影响的经典结论采样数达到2M时平均输出 SINR 相对最优值的损失约为 3 dB达到5M以上损失降到 0.5 dB 以内。这意味着 8 阵元系统最少要积攒 16 个快照才能勉强工作实际使用我会取 100200 个快照做一次 SMI 计算。4.2 对角加载矩阵病态时的保命手段SMI 最大的工程隐患是协方差矩阵求逆的数值稳定性。干扰功率比噪声高 30 dB 时协方差矩阵的最大特征值和最小特征值可以差 4 个数量级此时Rx \ a在 MATLAB 里虽然能算出结果但结果被数值误差主导波束图会出现杂散的高旁瓣。解决办法叫对角加载也就是把Rx对角线整体抬升一个量级R_loaded Rx δIδ的典型取值是噪声功率的 110 倍。这里的关键是δ不是越大越好过大的对角加载会让权向量退化成a(θ₀)的标量倍数等于放弃了自适应能力干扰零陷直接消失。工程上一种实用标定方法是先对Rx做特征分解取噪声子空间特征值的均值作为噪声功率估计然后令δ 3 × 噪声功率。4.3 SMI.m 的实现一次求解没有迭代function w SMI(X, a0, delta) % X : M x K 采样矩阵K 是块内快照数 % a0 : M x 1 期望方向导向矢量 % delta: 对角加载量建议取噪声功率估计值的 1~3 倍 % w : M x 1 归一化后的权向量 [M, K] size(X); Rx (X * X) / K; % 采样协方差矩阵 w (Rx delta * eye(M)) \ a0; % 加加载量后求逆 w w / (a0 * w); % 无失真约束归一化 end与 LMS、RLS 逐快照迭代不同SMI 是块处理先攒够快照再一次性解出权值。代码里的\运算符在 MATLAB 中会自动选择 LU 或 Cholesky 分解比显式写inv(Rx delta*eye(M)) * a0数值稳定性更好。归一化那一步保证期望方向增益严格为 1这样输出功率可以直接当信号功率读数用。SMI 的短板是阵列协方差矩阵要持续更新静止环境还可以干扰快速移动时块内数据已经过时再准的逆矩阵也是白算。实际雷达系统里常用滑窗 SMI每来一个新快照就丢一个最旧的快照保持协方差矩阵始终代表最近一段时间的统计特性窗口长度取3M~5M能在实时性和稳健性之间取得平衡。5. 三种算法在同一场景下的实测对比与调参技巧5.1 仿真基准与波束图读数为了方便横向对比把三种算法放在同一组数据上跑8 元均匀线阵、半波长间距、期望信号 0°、干扰 30°、SNR 10 dB、INR 30 dB、快拍数 500。LMS 步长 μ0.005RLS 遗忘因子 λ0.999SMI 对角加载 δ0.1三种算法得到的权向量各自画波束图关键读数如下算法0° 增益 (dB)30° 零陷深度 (dB)最高旁瓣 (dB)LMS0-28-11RLS0-41-13SMI0-46-14三者在期望方向都被无失真约束压到 0 dB区别全在干扰方向。LMS 的零陷只有 -28 dB这是梯度噪声的直接后果RLS 依靠递推最小二乘对统计量的更优估计把零陷压到 -41 dBSMI 用块内 500 个快照估计协方差矩阵统计误差更小零陷最深。旁瓣水平三者差异不大都接近 -13 dB 的均匀加权旁瓣底说明主瓣方向图主要由阵列几何决定自适应只改变零陷位置。5.2 三个核心参数的调节规则算法参数调小调大LMS步长 μ收敛慢稳态零陷更深收敛快易发散RLS遗忘因子 λ跟踪快稳态噪声大稳态准跟踪慢SMI加载量 δ零陷更深矩阵易病态数值稳零陷变浅调参的优先级要按算法特性来。LMS 先定 μ 边界再往回调 35 倍保证不发散的前提下追求收敛速度RLS 先定 λ 再调delta因为delta只影响初始几十步λ 决定整个稳态性能SMI 先估计噪声功率再乘系数δ 取噪声功率的 13 倍最常用。5.3 一个实用的验收技巧用输出 SINR 曲线判断算法状态只看波束图无法判断算法有没有进入稳态更实用的做法是逐块计算输出 SINR 并画成曲线。下面的代码用长度为 50 的滑窗统计窗内期望信号功率和剩余干扰加噪声功率的比值win 50; sinr_out zeros(1, K); for k win:K seg X(:, k-win1:k); % 期望信号在窗内的功率 sig_pow mean(abs(w * A(:,1) * s(k-win1:k)).^2); % 窗内其余分量功率 int_pow mean(abs(w * (seg - A(:,1) * s(k-win1:k))).^2); sinr_out(k) 10 * log10(sig_pow / int_pow); end plot(sinr_out); grid on; xlabel(快拍数); ylabel(输出 SINR (dB));把三种算法的sinr_out画在同一张图上曲线在进入稳态后应当保持平坦LMS 的平坦段会有明显抖动RLS 和 SMI 相对平滑。如果 LMS 曲线在后期缓慢下滑说明 μ 偏大导致权值漂移如果 RLS 曲线在某个时间点突然下跌又恢复说明数据里出现了非平稳段SMI 曲线整体应该是阶跃式跳变因为它是块处理每更新一次权值输出 SINR 跳一次。把这条曲线作为调参的反馈信号比反复看波束图直观得多这也是我每次做阵列算法验证时第一个画出来的图。本文还有配套的精品资源点击获取