4. 前馈滤波器(FFF)与反馈滤波器(FBF)的联动
好,咱们来聊聊DFE最核心的部分。
前面我们把FFF和FBF拆开讲了。说白了,它们就像一对搭档。一个负责扫清前方的路障,一个负责擦掉身后的脚印。只有配合好了,均衡器才能真正干活。
我个人习惯把这种联动叫做“你推我拉”。FFF先把主径信号稳住,把大部分前导干扰给干掉。然后FBF再出手,把尾巴上的后导干扰给清掉。你想想看,如果两个滤波器各干各的,互不搭理,那效果肯定打折扣。
4.1 为什么必须联动?
我刚开始做DFE那会儿,犯过一个低级错误。
我当时想,为什么不把FFF和FBF的系数一起调?直接扔给自适应算法不就完了?结果收敛速度慢得让人抓狂,而且动不动就发散。
后来我才明白。FFF和FBF的“视野”不一样。
- FFF看的是未来:它处理的是当前判决时刻之前进来的信号样本。
- FBF看的是过去:它处理的是已经判决过的符号。
它们的时间基准不同。如果联动不当,FBF会把FFF已经处理过的信号当成新的干扰来抵消。这就成了“左手跟右手打架”。
核心原则:FFF和FBF必须在一个统一的时钟节拍下工作。FFF的输出,减去FBF的输出,才是送给判决器的净信号。
4.2 联动的数学模型
我们用一个简单式子就能说清。
假设FFF有 N_f 个抽头,FBF有 N_b 个抽头。
FFF的输出是:
y_fff(k) = Σ w_fff(i) * x(k - i) , i = 0 到 N_f-1
FBF的输出是:
y_fbf(k) = Σ w_fbf(j) * d(k - j - 1) , j = 0 到 N_b-1
注意!这里 d(k-1) 是上一个时刻的判决结果。FBF永远不使用当前时刻的判决。
最终送往判决器的信号就是:
y(k) = y_fff(k) - y_fbf(k)
一个小技巧:写代码时,记得把FBF的初始输出设为0。不然上电一瞬间,FBF里全是垃圾,会把信号带偏。
4.3 联动中的时序问题
嗯,这里要注意。时序是联动的命门。
我在项目里见过一个案例。有人把FBF的加法器放错了流水线位置。结果每个符号都多延迟了一个时钟周期。均衡器不仅没均衡好,反而把误码率搞高了。
正常的联动时序应该是这样:
- FFF采样:在当前时钟上升沿,FFF准备好它的输出。
- 减法运算:FFF输出减去FBF输出。
- 判决:对减法结果做硬判决。
- FBF更新:把判决结果送入FBF的移位寄存器,并计算下一拍的FBF输出。
这个流程必须在一个时钟周期内完成。如果你用FPGA做,记得给加法器加一级流水线。但代价是多一个周期的延迟。
避坑指南:我曾经在高速SerDes项目里,因为时序收敛问题,不得不把FBF的反馈路径打了两拍。结果引入了额外的码间干扰。后来我只能重新调整FFF的抽头,才把损失补回来。所以,打拍子一定要谨慎。
4.4 联动中的稳定性
为什么DFE一定要保证前馈路径的误差足够小?
因为FBF是一个反馈系统。如果它收到的判决结果是错的,它就会把错误“传下去”,形成错误传播。
FFF的作用就是阻断这个传播链。FFF先工作,把信道中的大尾巴干扰削到足够小。这样判决器犯错的可能性才能降低。FBF只是做最后的“精细清理”。
| 特性 | 前馈滤波器 (FFF) | 反馈滤波器 (FBF) |
|---|---|---|
| 信号来源 | 原始接收信号 | 判决输出 |
| 处理目标 | 前导干扰 + 主径 | 后导干扰 |
| 稳定性风险 | 低(无反馈回路) | 高(有反馈回路) |
| 对判决错误敏感度 | 低 | 高 |
| 在联动中的角色 | 主攻手,消除大部分干扰 | 辅助,精细清理残余干扰 |
你想想看,如果FFF处理得不好,判决器老是判错。FBF就会把一堆错误反馈回来。系统就会像喝醉了一样晃来晃去。
4.5 联动下的系数更新
最后说一下系数更新时的联动。
大部分自适应算法(比如LMS)是同时更新FFF和FBF系数的。但更新的误差信号却只有一个。
error(k) = d(k) - y(k)
这个 error 同时用来更新 w_fff 和 w_fbf。
我建议在更新时,把FFF的步长设得比FBF稍大一点。这样做的好处是,FFF能快速把信道的主要特征跟踪上。FBF则慢一点,主要用来削尾。
我曾经试过把步长设成一样大。结果在信道突变时,FBF反应过激,把系统搞得不稳定。后来我把FBF的步长设为FFF的0.8倍,情况就好多了。
记住:FFF和FBF的系数不是独立的。它们共享一个误差信号。调整其中一个,必然会影响到另一个。这就是联动的本质。
我跟你讲,画图只是辅助理解。真正把联动理清楚,还是得靠动手算。
你在仿真器里试试。把FFF抽头固定住,只调FBF。看看误码率变化。再把FBF固定,只调FFF。两者的配合感觉,一下子就体会到了。