4. LMS算法在DFE系数收敛中的应用
咱们调试DFE抽头系数,最常用的自适应算法就是LMS。别小看它,虽然简单,但用好了很稳。我个人习惯把LMS看作一个“边走边问路”的过程:每次来一个符号,估一下当前误差,然后朝着让误差最小的方向调整系数。
4.1 LMS迭代公式——就一行,但门道不少
标准的LMS迭代公式长这样:
w(n+1) = w(n) + μ · e(n) · x(n)
这里:
- w(n):当前时刻的抽头系数向量
- μ:步长,也叫收敛因子
- e(n):误差信号,等于期望信号 d(n) 减去均衡器输出 y(n)
- x(n):输入信号向量(就是DFE前馈和反馈的寄存器值)
说白了,每一次迭代都用当前误差和输入信号去修正系数。为什么是乘积?因为误差和输入的相关性决定了应该往哪个方向调。
关键点:LMS更新的是瞬时梯度,不是统计平均梯度。这也是它简单但收敛慢的根本原因。
记得我调试第一版DFE时,以为套公式就行,结果收敛到一半就炸了。后来才明白——输入信号能量太大,μ没做归一化。嗯,下面咱们细说。
4.2 步长μ——牵一发动全身
μ直接影响收敛速度和稳态误差。选大了,收敛快但抖动大;选小了,稳如老狗但半天不收敛。你想想,是不是有点像PID调参?
| μ 取值 | 收敛速度 | 稳态误差 | 是否容易发散 |
|---|---|---|---|
| 太大(如 > 2/λ_max) | 快,但可能跳过最优值 | 大,甚至发散 | 极高 |
| 适中(约 0.01 ~ 0.1 归一化后) | 较快 | 可接受 | 低 |
| 太小(如 0.001) | 极慢 | 小 | 极低 |
如何选初始μ? 我建议先用归一化LMS(NLMS),把μ变成无量纲的。公式:
μ_hat = μ / (||x(n)||² + ε)
这样不管信号幅度多大,步长都稳定。ε是防止除零的小数,比如1e-6。
实战技巧:如果你发现系数在某个值附近来回跳,没必要求助大牛,试试把μ减半。我有好几次就是靠这招把收敛曲线抹平的。
4.3 实现细节——不只是乘加
LMS实现看似简单,但在定点DSP或FPGA里坑不少。我罗列几个关键点:
- 数据对齐:误差信号e(n)和输入x(n)必须在时间上对齐。DFE里反馈回路有延迟,别把旧的e和新的x乘在一起。
- 系数初始化:一般把主抽头设成1,其余设0。千万别全0,不然误差信号一直小,系数永远调不过来——我吃过这亏。
- 步长归一化:前面提过,NLMS是工业标配。如果硬要定步长,至少保证输入信号功率变化不大。
- 溢出保护:乘法后累加可能溢出,尤其在16-bit定点。必须做截位或饱和处理。
避坑指南:我曾经在FPGA上做LMS,没做溢出保护,结果收敛后系数自动变成0x7FFF——饱和了。那个Debug查了两天,最终发现是乘加器的位宽不够。
4.4 收敛曲线——看得见的收敛性
调试时我喜欢用示波器看误差信号的均方根曲线,或者直接看抽头系数变化的轨迹。一个好的收敛过程应该是:
- 初期误差快速下降
- 中期缓慢逼近
- 后期在最优附近小幅度抖动
如果曲线出现“长时间平坦然后突然跳变”,大概率是信号相关矩阵的特征值分散太大(即条件数大)。这时LMS收敛慢,可以考虑用变换域LMS或RLS。不过那是第5章的内容了,这里先不管。
4.5 知识体系总图
4.6 代码示例——一个简短的NLMS实现
下面给一个MATLAB风格的伪代码,展示实际在DFE里怎么更新前馈和反馈系数。你可以在仿真里跑一下,看看收敛效果。
% 参数
mu = 0.1; % NLMS步长(无单位)
ff_len = 8; % 前馈抽头数
fb_len = 4; % 反馈抽头数
w_ff = zeros(ff_len,1); w_ff(1) = 1; % 初始化
w_fb = zeros(fb_len,1);
% 主循环
for n = 1:N
% 构造输入向量
x_ff = rx_signal(n:-1:n-ff_len+1);
x_fb = decision(n-1:-1:n-fb_len); % 判决后反馈
% 均衡输出
y_ff = w_ff.' * x_ff;
y_fb = w_fb.' * x_fb;
y_out = y_ff + y_fb;
% 判决
d_out = sign(y_out); % 假设BPSK
% 误差
err = d_out - y_out;
% 归一化步长
norm_factor = x_ff' * x_ff + x_fb' * x_fb + 1e-6;
mu_eff = mu / norm_factor;
% 更新系数
w_ff = w_ff + mu_eff * err * conj(x_ff);
w_fb = w_fb + mu_eff * err * conj(x_fb);
end
个人经验:这个循环里我故意把w_ff(1)=1,不然DC分量为零,均衡器可能输出全零。另外判决反馈信号x_fb必须用判决后的值,不能是未判决的y_out——否则就是正反馈,发散。我当年犯过这个错,半夜调得怀疑人生。
4.7 收敛速度优化——调制步长
有时固定步长不能满足工程需求:初始要快,稳态要准。一个流行的做法是变步长LMS:刚开始用大μ加速,误差小了再切小μ。但切换要平滑,不然会产生跳变。
我只说一种简单有效的:
- 检测误差的能量,做滑动平均
- 当平均误差下降很快时,保持大μ
- 当平均误差趋于平稳,逐渐减小μ
注意:变步长时,如果信道突然变化(比如雷雨天通信质量骤降),大μ会重新放大,但切换逻辑要能快速响应。我见过一个设计,变步长时滤波时间常数太长了,信道都变了10ms它还没反应过来,导致大量误码。
好了,LMS在DFE中的应用就聊到这儿。把步长整明白,数据对齐整对,调试成功率至少提高五成。接下来你可以拿示波器或者仿真器看看你的系数长什么样——心里有数,手里不慌。