简介:面向无线通信与信号处理学习者,这是一份基于MATLAB的4元阵列LMS自适应波束形成实现,聚焦低旁瓣与高增益波束设计,可用于理解LMS算法在阵列信号处理中的迭代权重更新与性能权衡。压缩包仅1个文件,为约1KB的m脚本,涵盖阵列几何初始化、信号模型构建、LMS迭代、波束方向图绘制及MSE评估等完整流程,方便快速运行与二次开发。已有124人学习下载。运行该脚本可直观观察主瓣与旁瓣随迭代的变化,自主调整学习率、阵元间距等参数,探索不同设定下的波束性能;对初学者而言,是一份能串联自适应滤波理论与实际波束赋形的紧凑实验案例,也能为后续扩展至归一化LMS或快速LMS提供基础。
1. 4 元阵列的 LMS 波束形成:低旁瓣不是窗函数的专利
相控阵波束指向算法通常默认阵元数够多,但很多实际前端只有 4 个阵元。4 元阵列自由度低,想同时做到低旁瓣和高增益,固定窗函数往往顾此失彼。LMS 波束形成不直接控制权值,而是通过迭代误差把输出能量压向期望方向,既能保留主瓣增益,又能自适应地压低旁瓣。标题里的 lms_4array 就是把 LMS 用在 4 元阵列上的典型做法。我一般不会一上来就调窗函数,而是先跑通 LMS 迭代,再拿旁瓣电平当指标去卡参数。这里分享的是一套可以在本地复现的仿真流程,适合雷达、通信、声呐以及做相控阵校准的工程师。
2. LMS 波束形成的 4 元阵列模型与旁瓣抑制原理
2.1 4 元均匀线阵的信号模型
4 元均匀线阵(ULA)是自适应波束形成里最精简的模型。阵元间距按半个波长布置,期望信号从方向 θs 入射,一个干扰从 θj 方向进入。第 m 个阵元接收到的信号可以写成:
x_m(n) = s(n) · e^{jπ m sinθs} + j(n) · e^{jπ m sinθj} + n_m(n)
这里指数项里的 π 来源于半波长间距对应的空间相位差。把 4 个阵元的接收信号写成向量 x(n) = [x0(n), x1(n), x2(n), x3(n)]^T,阵列流形矢量 a(θ) = [1, e^{jπ sinθ}, e^{j2π sinθ}, e^{j3π sinθ}]^T。波束形成的权值 w 也是 4 维复数向量,输出为:
y(n) = w^H x(n)
LMS 做的是在线估计权值,不需要像采样协方差求逆那样做矩阵求逆,这在小阵列里非常划算。4 元阵的协方差矩阵是 4×4,但 LMS 只做向量点乘和标量乘法,计算量远低于 MVDR 的 O(M^3) 量级。对于实时性要求高的嵌入式前端,这是一个明显优势。
2.2 LMS 迭代与旁瓣电平的关系
LMS 波束形成本质上是一个自适应滤波器。设 d(n) 是期望方向的参考信号,误差定义为:
e(n) = d(n) - w^H(n) x(n)
代价函数 J = E{|e(n)|²},梯度下降迭代公式:
w(n+1) = w(n) + μ x(n) e*(n)
其中 μ 是步长。这个迭代的含义很直接:当输出 y(n) 与参考信号不一致时,误差越大,权值修正幅度越大。稳态时,输出信号尽可能接近参考信号,所有与参考信号不相关的分量都会被抑制。旁瓣泄漏可以看作来自非期望方向的“干扰”,而 LMS 并不知道哪个是干扰、哪个是旁瓣,它只知道这些分量拉高了误差。
需要澄清一个常见误解:LMS 并不显式地约束旁瓣电平,它的“低旁瓣”是平稳迭代后误差最小化的副产品。仿真中经常观察到,在纯 Gaussian 噪声背景下,LMS 稳态权值的方向图会自然形成较深的旁瓣零陷。原因在于旁瓣区域的响应如果太高,对应的信号分量会进入输出,与参考信号叠加后产生大误差,LMS 会持续调整权值直到这些分量被抑制。因此,只要快拍数足够,LMS 在 4 元阵上也能得到比常规窗函数更低的旁瓣。
2.3 为什么固定窗在 4 元阵上会失效
固定窗如 Chebyshev 或 Taylor 窗,设计时直接指定旁瓣电平,然后根据阵列口径计算权值。4 元阵只有 3 个有效自由度(一个自由度被期望方向增益为 1 约束占用),能实现的旁瓣电平有明确上限。要压低旁瓣,权值比会变得很大,而权值比越大,白噪声增益越高,输出信噪比反而下降。这就是“高增益低旁瓣”在少阵元时很难用单程加权实现的原因。
LMS 则走了另一条路:它利用时间上的快拍迭代,用时间自由度换取空间自由度。每一时刻它都在更新权值,实际上是让波束方向图适应协方差矩阵的实时状态。固定窗在均匀噪声下设计,遇到非均匀干扰或者阵元幅相误差时,旁瓣会立刻抬高;LMS 能感知这些误差,把权值重新分配到误差最小的解上。所以,4 元阵上做“高增益低旁瓣”,自适应处理通常比固定窗更可靠。
3. 用 Python 把 lms_4array 低旁瓣波束仿真跑通
3.1 仿真场景与参数表
先把仿真参数固定下来,用统一参数复现 LMS 行为。下面这张表是 4 元阵仿真的常用起点,信噪比和干噪比都按典型相控阵场景设置。
| 参数 | 取值 | 说明 |
|---|---|---|
| 阵元数 M | 4 | 4 元均匀线阵 |
| 阵元间距 | 0.5 λ | 半波长,避免栅瓣 |
| 快拍数 N | 2000 | 足够迭代稳态的采样点数 |
| 期望方向 θs | 30° | 波束主瓣指向 |
| 干扰方向 θj | -10° | 旁瓣区干扰 |
| SNR | 10 dB | 期望信号与噪声比 |
| INR | 20 dB | 干扰与噪声比 |
| 步长 μ | 0.001 | 梯度下降步长 |
| 参考信号 d(n) | 30°方向复正弦 | 与期望信号同频同相 |
所有角度都用度表示,进入公式前转弧度。参考信号用本地载波生成,频率与期望信号相同。这样 LMS 有明确的学习目标:将输出信号匹配到本地参考相位上。
3.2 LMS 波束形成核心代码
仿真代码如下,使用 numpy 生成基带信号,迭代 2000 次,最后返回稳态权值和方向图数据。
import numpy as np import matplotlib.pyplot as plt M = 4 N = 2000 mu = 0.001 theta_s = np.deg2rad(30) theta_j = np.deg2rad(-10) snr = 10.0 inr = 20.0 # 阵列流形矢量 def steervec(theta, M): m = np.arange(M) return np.exp(1j * np.pi * m * np.sin(theta)) # 基带信号生成 n = np.arange(N) s = np.exp(1j * 0.1 * n) # 期望信号 j = np.exp(1j * 0.15 * n) # 干扰信号 noise = (np.random.randn(M, N) + 1j * np.random.randn(M, N)) / np.sqrt(2) a_s = steervec(theta_s, M).reshape(-1, 1) a_j = steervec(theta_j, M).reshape(-1, 1) # 接收数据:信号按SNR、干扰按INR叠加 sig_power = np.mean(np.abs(s)**2) noise_power = 1 s_amp = np.sqrt(noise_power * 10**(snr/10)) j_amp = np.sqrt(noise_power * 10**(inr/10)) X = s_amp * a_s @ s.reshape(1, -1) + j_amp * a_j @ j.reshape(1, -1) + noise # 参考信号:与期望信号同频同相 d = s # LMS 迭代 w = np.zeros(M, dtype=complex) for i in range(N): x = X[:, i] y = np.conj(w) @ x e = d[i] - y w = w + mu * x * np.conj(e) # 方向图扫描 theta_scan = np.linspace(-90, 90, 181) G = np.zeros_like(theta_scan, dtype=float) for idx, th in enumerate(theta_scan): a = steervec(np.deg2rad(th), M) G[idx] = np.abs(np.conj(w) @ a)**2 G_db = 10 * np.log10(G / G.max() + 1e-12) print("稳态权值 w =", w)代码里最关键的是迭代循环中的w = w + mu * x * np.conj(e)这一行。e是当前快拍的误差,x是接收向量,两者相乘得到梯度估计。步长mu控制修正幅度,np.conj(e)是因为复数梯度的共轭形式。接收数据生成时,信号、干扰、噪声功率都经过显式换算,让仿真能复现不同信噪比下的行为。
方向图扫描用 181 个角度点覆盖 -90° 到 90°,计算每个角度上的阵列响应功率。最后做归一化,单位转成 dB。这一步用来测量旁瓣电平,是评估 LMS 是否达到低旁瓣目标的核心。
3.3 方向图扫描与旁瓣测量
扫完方向图后,接着计算峰值旁瓣电平。常见做法是排除主瓣附近的几个波束宽度,在其他角度区域找最大值。
# 排除主瓣区域(±5°),计算峰值旁瓣电平 mainbeam = (abs(theta_scan - np.deg2rad(30)) < np.deg2rad(5)) sidelobe_gain = G_db.copy() sidelobe_gain[mainbeam] = -np.inf psll = np.max(sidelobe_gain) print("峰值旁瓣电平 PSLL = {:.2f} dB".format(psll))这里mainbeam掩码把主瓣 5° 范围内的数据排除掉,剩余区域的最大值就是 PSLL。仿真输出通常能看到 PSLL 在 -12 到 -18 dB 之间,具体数值取决于步长和快拍数。如果 PSLL 高于 -10 dB,说明 LMS 还没收敛,需要增加快拍数或调小步长。方向图曲线可以用plt.plot(theta_scan, G_db)画出,观察主瓣是否指向 30°,旁瓣是否有明显的非对称凹陷。
4. 低旁瓣高增益的 4 个必调参数与常见坑
4.1 步长 μ:收敛速度与旁瓣振荡的平衡
步长是 LMS 最敏感的参数。理论上步长应满足 0 < μ < 2/λ_max,λ_max 是接收信号协方差矩阵的最大特征值。实际使用中,我一般取理论上限的 1/10 到 1/20,避免稳态权值抖动导致旁瓣电平起伏。
| 步长 μ | 收敛速度 | 稳态旁瓣 | 风险 |
|---|---|---|---|
| 0.01 | 快 | -10 dB 左右,波动大 | 权值振荡,方向图不稳定 |
| 0.001 | 中等 | -14 dB 左右 | 推荐起点 |
| 0.0001 | 慢 | -16 dB 左右 | 快拍数需增加到 5000 以上 |
步长过大时,LMS 在最优权值附近来回跳动,等效于给权值叠加了一个随机扰动,旁瓣电平会被抬高。步长过小则收敛时间变长,在快拍数有限的场景下,权值还没收敛就被截断,方向图同样不理想。判断收敛的一个技巧是观察权值向量的范数是否稳定,如果还在单调变化,说明需要更多快拍或更大步长。
4.2 参考信号与期望方向失配
LMS 的旁瓣抑制能力完全依赖于参考信号与期望信号的相关性。参考信号必须与期望方向入射的信号频率、相位一致。如果参考信号方向匹配,但相位没有补偿,LMS 会把期望信号本身当作误差,最后在期望方向形成一个零陷。这就是新手常遇到的“主瓣没了”的问题。
相控阵波束扫描相位计算在这里派上用场。4 元阵期望方向为 θs 时,相邻阵元的补偿相位是 π sinθs。本地参考信号可以直接用np.exp(1j * π * 0 * sinθs)的单路信号,也可以对第一阵元接收信号做延时对齐。更稳妥的做法是取期望方向信号的复包络样本直接作为参考,避免相位模糊。
注意参考信号不要带噪声,也不要带干扰分量。如果参考信号从实际接收信号中提取,需要先做滤波,否则 LMS 会尝试复制干扰成分,旁瓣反而抬高。
4.3 权值初始化与对角加载抑制小特征值噪声
LMS 权值初始化为零向量虽然简单,但收敛过程会经历一个“旁瓣扫描”阶段,方向图中可能出现瞬时的高旁瓣。更常见的做法是初始化为常规延时补偿权值:
w(0) = a(θs) / M
这样一开始主瓣就指向期望方向,LMS 只需要做修正,旁瓣不会大起大落。在 4 元阵上,这个初始化对低旁瓣目标非常有用。
当接收信号存在强干扰时,协方差矩阵会有小特征值。LMS 迭代中这些小特征值对应方向上的权值会持续漂移,最终放大噪声,造成“增益损失”。工程上可以在误差项里加一个对角加载正则:
e(n) = d(n) - w^H(n) x(n) + β w^H(n) w(n)
或者在迭代更新中每次减去一小部分权值范数。β 取 0.01 到 0.1 之间。这样权值不会无限长得过大,保住了高增益。注意 β 太大会把 LMS 变成泄漏 LMS,主瓣增益下降,旁瓣抑制能力也减弱。
4.4 快拍数选择的经验公式
4 元 LMS 的收敛速度大约需要 10 倍于自由度数量的时间常数。时间常数近似为 1/(μλ_eff),λ_eff 是协方差矩阵的主特征值。仿真经验是快拍数至少取 10/μ,才能看到稳态方向图。如果 μ=0.001,快拍数就是 10000 量级;对实时系统来说,这个数据块长度意味着 LMS 更适合慢变信道,或者用块处理方式定期更新权值。快拍数不够时,方向图会像噪声一样抖动,PSLL 会随随机种子大幅变化。解决办法是多跑几次仿真取统计平均,或者增大 μ 换取更快的初始收敛后切换到小步长平滑。
5. 旁瓣电平测量与 LMS 权值做相控阵扫描的进阶做法
5.1 用峰值旁瓣电平和积分旁瓣电平卡指标
低旁瓣不能只看方向图“感觉低”,要用数值指标卡。峰值旁瓣电平(PSLL)是主瓣以外最大副瓣的增益,积分旁瓣电平(ISLR)衡量所有旁瓣能量之和与主瓣能量的比值。ISLR 对分布式杂波更敏感,雷达里常用它评估抑制杂波能力。计算时方向图功率要在线性域求和,不能直接在 dB 域平均。LMS 权值的方向图通常主瓣较窄,ISLR 会比均匀加权低几个 dB。
5.2 LMS 权值与 Chebyshev 窗的旁瓣对比
固定 Chebyshev 窗在 4 元阵上可以设计到 -20 dB 旁瓣,但权值比会达到 1 比 3 以上,白噪声增益线性度下降。LMS 稳态权值的幅度分布往往更均匀,这有助于保持高增益。仿真对比时,用同样的 4 元阵列、同样的期望方向,分别计算 Chebyshev 权和 LMS 权的方向图。LMS 权在干扰方向会出现明显零陷,而 Chebyshev 权没有,这解释了为什么 LMS 在干扰环境下有效旁瓣更低。两者的主瓣宽度差别不大,但 LMS 的旁瓣通常更“碎”,即存在多个深度不一的凹陷而不是平滑的 -20dB 平台。
5.3 一个实用技巧:用 LMS 稳态权值作为 MVDR 的初值
LMS 稳态权值质量高,但稳态后仍然有梯度噪声。一个省事的进阶做法是把 LMS 跑完得到的 w 作为 MVDR 的初始解,再用采样协方差矩阵做一步 Newton 修正。公式是:
w_mvdr = w_lms - (R w_lms - r) / (w_lms^H R w_lms)
其中 R 是采样协方差,r 是期望方向与接收信号的互相关向量。这一步能进一步压低旁瓣,同时保持 LMS 的鲁棒性。实际给相控阵前端下发权值时,记得对 w 做相位解卷绕,把相邻阵元的相位差换算成移相器可量化的小数,避免相位跳变破坏波束指向。
最后提一个容易忽略的验证点:方向图扫描间隔不要用 1°,换成 0.1° 再测一次 PSLL。LMS 形成的窄零陷可能正好落在 1° 间隔的缝隙里,造成旁瓣“假低”。密扫后仍低于指标值,才真正算低旁瓣达标。
本文还有配套的精品资源,点击获取