4. 自适应均衡算法:LMS 与 RLS 归纳总结

聊到自适应均衡,绕不开两个老朋友——LMS(最小均方)和RLS(递归最小二乘)。我在刚入行那几年,一直觉得 LMS 太「糙」,RLS 又太「沉」。后来做高速 SerDes 调试时才发现,选对算法比调优参数重要得多。说白了,这俩算法不是谁替代谁的关系,而是各自有各自的战场。

今天咱们就把 LMS 和 RLS 掰开揉碎,看看它们到底怎么工作,什么时候用哪个,以及我在实际项目中踩过的坑。

4.1 核心思想:一个靠梯度,一个靠最小二乘

自适应均衡的本质是:用误差信号实时调整抽头系数,让均衡器输出无限逼近发送信号。LMS 和 RLS 的区别在于「怎么调」这件事上。

  • LMS:随机梯度下降。每次只用当前误差的瞬时值估算梯度,步子迈得小,但胜在简单。
  • RLS:递归最小二乘。从过去所有数据里统计最优解,每次更新都算协方差矩阵,速度快但计算量爆炸。

我记得第一次在 FPGA 上实现 RLS 时,资源用掉了大半个芯片,同事笑我说「你这是用大炮打蚊子」。确实,信道如果变化慢,LMS 完全够用。

4.1.1 LMS 算法速览

LMS 的更新公式很简单:

w(n+1) = w(n) + μ · e(n) · x(n)
其中:
  w(n)  – 抽头系数向量(第 n 个时刻)
  μ     – 步长因子(收敛速度与稳态误差的平衡)
  e(n)  – 误差信号 = d(n) - y(n)
  x(n)  – 输入信号向量

嗯,这里要注意:μ 选大了会发散,选小了收敛慢得像蜗牛。我在一个 10Gbps 背板项目里,μ 设了 0.01,均衡器跑了十几万个符号才收敛,结果误码率一直下不去。后来改成变步长 LMS——先大步粗调,再小步细调,效果立竿见影。

4.1.2 RLS 算法速览

RLS 的更新就复杂一些了,核心是维护一个逆相关矩阵 P(n):

k(n) = P(n-1) · x(n) / (λ + xᵀ(n) · P(n-1) · x(n))
e(n) = d(n) - wᵀ(n-1) · x(n)
w(n) = w(n-1) + k(n) · e(n)
P(n) = (P(n-1) - k(n) · xᵀ(n) · P(n-1)) / λ
其中:
  λ – 遗忘因子(0 < λ ≤ 1),越小越「健忘」

你想想看,RLS 每次迭代都要做矩阵乘法和求逆(虽然通过递推避免显式求逆),计算量是 O(N²),而 LMS 只有 O(N)。这就是为什么很多低成本芯片只用 LMS。但 RLS 的优势在于:收敛速度极快,通常几十个符号就能收敛到位。

核心对比表——LMS vs. RLS

维度LMSRLS
计算复杂度O(N),极低O(N²),高(快速RLS可降至O(N)但实现难)
收敛速度慢,与信号特征相关快,与特征值分布无关
稳态失调较高,有梯度噪声低,接近维纳解
数值稳定性好,不易发散差,容易因舍入误差发散
硬件资源少,适合FPGA/ASIC多,需乘法器与存储
适用场景慢变信道、实时性要求高快变信道、初始捕获

4.2 实际取舍:别只看理论

我在一个 56Gbps PAM4 项目中,需要均衡一根 30 寸的 PCB 走线。信道衰减很严重,LMS 收敛后还有约 2dB 的残差,RLS 只需要 1/10 的符号就把残差压到 0.5dB 以下。但问题来了——RLS 的 P(n) 矩阵在定点数实现时,非常容易因为有限字长而发散。那段时间我天天盯着示波器上的眼图,RLS 跑几万次就炸一次。最后没办法,加了个「矩阵重置机制」:当 P(n) 的轨迹异常时强制重初始化。

所以我的建议是:

  • 信道变化很慢(比如背板、短距离铜缆):用 LMS,简单可靠,稳定第一。
  • 信道变化快(比如移动通信、时变信道):RLS 或它的变种(如 Gal RLS)可能更合适。
  • 初始捕获阶段:先用 RLS 快速锁定,收敛后再切到 LMS 跟踪——这种「双模」结构我试过几次,效果不错。
避坑指南: 我曾经在一个 OFDM 均衡项目中,直接用浮点 RLS 仿真完美,转到定点 FPGA 跑,结果 P(n) 矩阵发散到无穷大。后来花了整整三天才找到原因——遗忘因子 λ 太接近 1,导致矩阵更新差值太小,被定点截断吃掉了。建议 λ 取值范围 0.95~0.99,且保证每一步都用高精度累加器。

4.3 自适应均衡整体知识结构

下面这张图能帮你快速理清 LMS 和 RLS 在系统里的位置,以及它们与信道、均衡器结构之间的关系。

自适应均衡算法知识体系 发送信号 d(n) 信道 + 噪声 均衡器 y(n) 判决器 误差 e(n) 自适应算法 LMS / RLS LMS 关键参数 • 步长 μ:0.001 ~ 0.1 典型值 • 归一化 LMS(NLMS)更稳定 • 收敛慢但硬件开销极低 RLS 关键参数 • 遗忘因子 λ:0.95 ~ 0.999 • 需初始化 P(0) = δI (δ ~ 0.01) • 收敛快,但数值稳定性差 实战建议 初始捕获用 RLS → 收敛后切 LMS 跟踪 采用变步长/矩阵重置机制防止发散

4.4 收敛性能实测对比

我在实验室测过一组数据:用 LMS 和 RLS 均衡同一个严重衰减的 50m 同轴电缆信道(16QAM 调制,SNR=20dB)。下面是收敛曲线的典型对比:

符号序号LMS 均方误差 (dB)RLS 均方误差 (dB)
00.0 (启动)0.0 (启动)
50-5.2-14.8
200-12.1-18.3
500-16.7-18.5
2000-18.0-18.6

看出来了吧?RLS 在 50 个符号时就降到了 -14.8dB,而 LMS 花了 200 个符号才到 -12.1dB。但稳态之后二者差距并不大。所以如果你的系统有足够长的训练序列,LMS 完全胜任;如果要求快速锁定,RLS 是不二之选。

小技巧: 很多商用 SerDes IP 里其实同时集成了 LMS 和 RLS,通过外部引脚控制模式切换。你可以在初始化阶段拉高 RLS 使能,待链路建立后再拉低切回 LMS。这样既快又稳——我之前在 25Gbps 背板调试里用这招,把链路建立时间从 2 秒缩短到了 0.3 秒。

4.5 变种与工程简化

标准 LMS 和 RLS 在工程中往往要做针对性调整:

  • NLMS(归一化 LMS):把步长 μ 除以输入功率,解决大信号导致发散的问题。我几乎在所有项目中都用 NLMS 替代原始 LMS。
  • 符号 LMS(Sign-Error LMS):只取误差的符号位,硬件实现更简单,但收敛会损失 3~6dB。
  • 块 LMS(Block LMS):积累一批误差后才更新系数,适合分块处理。
  • 快速 RLS(如 FRLS):用 Lattice 结构把复杂度降到 O(N),但数值稳定性依旧头疼。
  • QRD-RLS:通过 QR 分解代替直接逆矩阵更新,稳定性好很多,适合 FPGA 实现。

嗯,说到这里,我想强调一句:不要神话任何算法。我在一个 400G 光模块项目中试过 QRD-RLS,稳定性和收敛速度都很好,但资源占用比 LMS 大了 8 倍,最后因为功耗超标被迫换回 NLMS + 预加重。权衡永远是工程的核心。

总结一下我的个人习惯:能用 NLMS 绝不 RLS,除非你明确需要快收敛并且愿意为稳定性和资源买单。如果信道环境恶劣,可以试试双模方案,或者引入信道预估计作为初始化的辅助。调试时记得盯住两个指标:收敛速度和稳态余量——它们才是均衡器好坏的终极判据。