第 4 章 自适应均衡理论:LMS 算法推导、收敛条件、步长选取

这一章咱们聊聊 LMS 算法。说白了,它就是自适应均衡最核心的那套迭代方法。我刚入行那会儿,觉得这玩意儿不就是个公式反复算嘛,后来踩过坑才明白——步长选不对,项目白干;收敛条件不清楚,调试两眼抓瞎。所以这章我会把推导过程、收敛条件和步长选取的经验,掰开了讲清楚。

4.1 LMS 算法推导

先回忆一下,最小均方误差(MMSE)准则下,我们要找到一组滤波器系数 w,让误差信号 e(n) = d(n) – wTx(n) 的均方值最小。直接求解维纳-霍夫方程需要求自相关矩阵的逆,实时通信根本扛不住。LMS 算法的聪明之处在于:用瞬时梯度代替统计梯度,每次迭代只用一个样本更新权值。

推导过程

代价函数(瞬时)定义为:J(n) = |e(n)|²。对 w 求梯度:

∇J(n) = -2 e(n) x(n)

然后沿着负梯度方向更新权值,步长为 μ:

w(n+1) = w(n) + μ e(n) x(n)

这就是最经典的 LMS 迭代公式。我习惯把 w(0) 初始化为全零向量,但注意如果信道有直流偏移,最好初始化一个很小的非零值,否则收敛会慢。

伪代码示例

初始化: w = [0, 0, ..., 0]  (长度 N)
for n = 0, 1, 2, ...:
    y(n) = w^T * x(n)
    e(n) = d(n) - y(n)
    w = w + μ * e(n) * x(n)
end

你看,每次只需要一次点积、一次误差计算、一次向量加法,计算量 O(N)。这在硬件上非常友好——我在 FPGA 上实现过 32 阶 LMS,一个时钟周期就能跑完一次迭代。

我的调试习惯:先在 Matlab 里跑一遍浮点 LMS,观察误差曲线。如果误差下降曲线非常陡但后期抖动大,说明步长偏大;如果下降慢吞吞,步长就偏小。我个人习惯用归一化 LMS(NLMS)做原型验证,再根据定点需求调整增益。

4.2 收敛条件

LMS 的收敛分析分为两个层面:均值收敛和均方收敛。你想想看,如果均值都不收敛,那滤波器系数永远在乱飘。

  • 均值收敛:要求步长 μ 满足 0 < μ < 2 / λ_max,其中 λ_max 是输入自相关矩阵的最大特征值。实际操作中,λ_max 很难预先知道,我们通常用输入功率的近似代替:μ < 2 / (N·P_x),P_x 是输入信号平均功率。
  • 均方收敛:这个条件更严格。经验上取 μ 在 1 / (10·N·P_x) 到 1 / (N·P_x) 之间比较安全。我记得有一次项目里,信道衰落特别快,我按照均值收敛范围选了 μ,结果误码率忽高忽低——后来才发现均方收敛没有满足,滤波器系数方差太大。
收敛条件步长上限典型范围备注
均值收敛2 / λ_max0 < μ < 2/(N·P_x)必要条件,较宽松
均方收敛约 1 / (2N·P_x)0 < μ < 1/(N·P_x)实际建议在此区间
工程经验—0.001~0.1(归一化后)取决于信噪比和阶数

嗯,这里要注意一个坑:如果输入信号是高度相关的(比如多径信道中的有色噪声),自相关矩阵特征值分散,λ_max 可能很大。这时你用总功率近似会得到偏小的步长上限,但实际还能收敛,只是慢。我曾经被这个问题误导过——以为步长不够大,结果调大了反而发散。后来老老实实做特征值估计才搞定。

4.3 步长选取

步长是 LMS 里唯一可以调的“旋钮”。太小,收敛慢,跟不上信道变化;太大,稳态失调大,甚至发散。我刚才说的经验范围归一化后是 0.001~0.1,但具体取值还要看三个因素:

  • 信道变化速度:移动通信中多普勒频移大,需要较大步长,比如 0.05~0.1。
  • 信噪比:低 SNR 下,噪声功率大,步长应偏小,避免梯度噪声放大。
  • 滤波器阶数:阶数越高,每个权值更新的积累效应越强,步长要相应减小。

变步长 LMS 简介

固定步长总有些尴尬——想要快速跟踪,就要大步长;想要低失调,就要小步长。变步长算法(比如 NLMS、VS-LMS)可以动态调整:初始阶段用大步长,收敛后用步长缩小。我最喜欢 NLMS,因为它用输入功率归一化,天然对信号幅度不敏感。公式很简单:

w(n+1) = w(n) + (μ₀ / (δ + ||x(n)||²)) e(n) x(n)

其中 μ₀ 通常在 0.1~1 之间,δ 是一个小正数防止除零。我在实际项目中遇到过一个问题:用 NLMS 时,当输入信号非常微弱(比如静音段),||x(n)||² 接近于 0,导致步长瞬间变得极大,滤波器系数被“打飞”。后来我加了一个下限保护:当范数小于某个阈值时,用固定小步长替代——效果立竿见影。

避坑指南:我曾经在一款卫星通信均衡器里使用固定步长 LMS,步长取 0.02,仿真完美。但上板后误码率偶尔突跳。排查了三天,发现是 ADC 采样时钟有微小抖动,导致输入信号功率波动,等效于步长在变。最终解决办法是先用 AGC 把信号功率稳定到固定水平,再调步长。所以调试时一定先确认前端信号是否稳定。

本章核心总结

  • LMS 公式:w(n+1) = w(n) + μ e(n) x(n),推导自瞬时梯度下降。
  • 收敛条件:均值收敛 μ < 2/λ_max;工程上取 μ 约为 1/(10·N·P_x)。
  • 步长选取:固定步长简单但僵化;变步长(NLMS)更鲁棒,但要注意保护低能量输入。
  • 实际调试:先用 Matlab 扫步长范围,观察误差曲线;硬件实现时分段验证,警惕信号功率波动带来的等效步长变化。
LMS 自适应均衡迭代流程 输入 x(n) 期望 d(n) y(n)=wᵀx(n) e(n)=d(n)-y(n) w(n+1)=w(n) + μ e(n) x(n) 同样输入用于更新 下一时刻迭代 步长 μ 控制 太大发散,太小收敛慢