DFE判决反馈均衡器:原理、LMS实现与MATLAB仿真调试
简介:“基于MATLAB的判决反馈均衡器”是一份面向通信工程学习者与初学者的实践型代码包,聚焦多径衰落与符号间干扰条件下的均衡问题,帮助读者理解前向均衡、判决器与反馈滤波器协同工作的完整流程。压缩包共76个文件,约375KB,以47个.m脚本和函数为主,辅以15个.eps结果图、4个.bak备份、2个.c与2个.h接口文件及少量工程文件,覆盖信道建模、MMSE/ZF系数计算、硬/软判决、迭代更新与误码率评估等环节,并含PAM/QAM星座与信道仿真模块,便于按模块阅读和调试。已有1797人学习下载,适合作为课程设计、实验复现与算法入门的参考。读者可从中获得可运行的MATLAB实现、滤波器设计思路与性能分析图,并通过备份与预览文件对照排查,较直观地掌握DFE消除ISI的机制,也能借此提升通信系统仿真与编程排错能力。
1. 判决反馈均衡器:为什么"拿自己的输出喂自己"不是循环论证
判决反馈均衡器最让人起疑的地方,是它拿自己的输出喂自己。一个均衡器本来要猜发送端发了什么,可它在判断下一个符号时,居然把前面已经判断出来的符号当成已知条件,塞进反馈滤波器里减掉。第一次看到这个结构的人多半会想:这不是循环论证吗,猜错了岂不是越错越离谱。恰恰相反,这看起来像自我指涉的设计,正是线性均衡器在深衰落信道上怎么调都调不好时的解药。判决反馈 均衡的核心思路只有一句:把信道造成的码间干扰拆成"当前符号之前"和"之后"两段,后一段用已经判决出来的符号重建再减掉。因为判决值里几乎没有噪声,减的过程就不会像线性均衡那样把噪声一起放大。代价是误码传播,这是它难以避免的副作用,也是整篇文章要反复琢磨的那笔账。
2. 前馈加反馈的结构:DFE 到底在减掉什么
2.1 信道 ISI 的因果结构:pre-cursor 与 post-cursor
先把一个具体信道摆出来。假设离散时间信道冲激响应是 h = [0.3, 1, 0.5],采样点对齐在中间那个最大抽头上,那么第 k 个接收样本可以写成 y(k) = 0.3·s(k+1) + 1·s(k) + 0.5·s(k-1) + n(k)。中间那项是想要的符号,0.5·s(k-1) 是上一个符号拖过来的尾巴,0.3·s(k+1) 是下一个符号提前渗进来的成分。前一项叫 post-cursor(后游标),后一项叫 pre-cursor(前游标)。这个命名不是学术洁癖,它直接决定了两种干扰在物理上能不能被"消掉"。
post-cursor 之所以可消,是因为在时刻 k 做判决时,s(k-1) 已经被判决过了。均衡器手里有一个关于 s(k-1) 的估计值,把它乘上 0.5 再减掉,逻辑上完全成立。pre-cursor 就没这么好命:时刻 k 时 s(k+1) 还没来,你根本不知道它是什么,怎么减。所以线性均衡器里的前馈部分必须同时处理这两类干扰,而它对 pre-cursor 的处理方式是"用未来的输入样本"——y(k+1) 里含有 0.3·s(k+1),如果输出相对输入延迟了 D 个符号,y(k+1) 相对输出时刻 k-D 就变成了过去。这就是用延迟换因果性的典型手法,也是前馈滤波器为什么必须允许有非因果抽头的原因。
理解了这一层,DFE 的整体结构就顺了:前馈滤波器(FBF)横跨 pre-cursor 和 post-cursor,负责把信道"压"成一个残余的小尾巴;反馈滤波器(FBF 的另一半)只处理 post-cursor,输入是已经判决出来的符号,抽头数 Nb 大致对应信道后游标的长度。两块拼起来,目标是让均衡后的整体响应逼近一个纯延迟。
这里有个容易看走眼的地方:反馈滤波器是严格因果的,只有 z⁻¹ 到 z⁻ᴺᵇ,没有 z⁺。这不是实现上的偷懒,而是物理约束——你不能用一个还没判决的符号去消除它造成的干扰。前馈可以"看未来"(靠延迟),反馈绝对不行。
2.2 前馈只能折中,反馈才能"只减不加"
线性均衡器的困境可以用一句话说清:它想求信道响应的逆,但信道的逆不一定存在,或者存在但极不稳定。零强迫(ZF)均衡直接取 W(z) = 1/H(z),如果 H(z) 在单位圆附近有个深零点,W(z) 在那里就会鼓出一个巨大的峰,把该频段的噪声成倍放大。MMSE 线性均衡稍微聪明一点,它在"消干扰"和"不放大噪声"之间做加权折中,代价是留下一截永远消不干净的残余 ISI,误码率曲线在信噪比高到一定程度后会走平,出现所谓的天花板效应。
DFE 的反馈支路绕开了这个折中。因为反馈滤波器的输入是判决值,而判决值已经过期,才被确定下来,切片器(slicer)这个非线性环节把带噪的软值变成了干净的硬符号。换句话说,反馈路径上传递的信息里没有加性噪声。这在数学上等价于:反馈部分做的是"减去一个确定量",而不是"乘以一个可能放大的传递函数"。噪声增强这个机制在反馈支路上压根不存在。
常见的理论处理思路是谱分解。把信道加噪声的总谱写成 S(z) = N₀ + H(z)H*(1/z*),然后分解成 S(z) = γ·G(z)·G*(1/z*),其中 G(z) 是最小相位、因果、可逆且稳定的部分。MMSE-DFE 的前馈滤波器取匹配滤波再串上 1/G(z) 的形式,反馈滤波器取剩下的最大相位部分减一(即 B(z)-1 那种结构)。这样前馈侧不会去逆一个深零点,反馈侧把剩余的因果 ISI 精确抵消。我一般会这么理解:线性均衡是"用一个滤波器硬扛整个信道",DFE 是"用两个滤波器分工,把不能安全逆的部分交给非线性判决去处理"。
分工的边界在哪?就在 pre-cursor 和 post-cursor 的分界线上。前馈能做非因果,所以它接管 pre-cursor;反馈只能因果,所以它接管 post-cursor。这个划分不是人为约定,是因果性逼出来的唯一解。
2.3 噪声增强消失了,误码传播来了
DFE 的收益很实在:在同样的信道和信噪比下,MMSE-DFE 的稳态 MSE 通常比 MMSE 线性均衡低一截,在深衰落信道上前者优势更明显。但它自己也在承担风险。当判决正确时,反馈支路干净得像理想信道;当判决错误时,这个错误会体现在反馈寄存器里,被抽头加权后减进后续若干个输出,把后面几个符号也带到错误的方向上去。这就是误码传播(error propagation)。
误码传播的直接后果是错误不再独立,而是成簇出现。这一点在仿真里极其明显:同一段数据的误码率数字可能和线性均衡差不多,但错误的位置分布完全不同——线性均衡的错误零零散散,DFE 的错误往往三五个扎堆。如果你的系统上层还有信道编码,这种成簇错误会比随机错误更难被纠回来,因为交织深度不够时,一簇错误会全部落在同一个码字里。
所以评价 DFE 不能只看平均误码率。至少还要看两个量:错误簇的长度分布,以及在不同信噪比下簇长的变化趋势。这两个量决定了它到底能不能用在实际链路上。后面第 4 章会用几行代码把这件事量化出来。
注意:反馈抽头的能量越大,误码传播的"杀伤半径"越长。调节 Nb 的时候,收益和风险是同时增长的,不存在只增不减的区间。
3. 系数怎么学出来:LMS 在判决反馈结构里的两个模式
3.1 误差从哪里来:训练模式与判决模式的分水岭
DFE 的抽头系数不是解析算出来的,实际系统里绝大多数用自适应算法在线更新,最常用的就是 LMS 及其变种。LMS 的更新式只有一行:w(n+1) = w(n) + μ·e(n)·x(n)。所有复杂度都藏在 e(n) 的定义里。对 DFE 来说,误差有两个来源,对应两种工作模式。
训练模式(training mode)下,发送端先发一段已知序列,接收端拿本地生成的同一个序列当期望响应,e(n) = d(n) - z(n),其中 d(n) 是已知符号,z(n) 是均衡器输出。这个阶段误差是"真"误差,梯度方向可信,系数能稳定收敛。判决模式(decision-directed mode)下,已知序列没了,只能拿切片器的输出当期望响应,e(n) = ŝ(n) - z(n),其中 ŝ(n) = sign(z(n))(BPSK 情形)。这时候误差是"自以为的"误差——判决对了它就是对的,判决错了它会把系数往错误方向推。
这个分水岭决定了一件很关键的事:训练序列不是可有可无的启动开销,它是让系数进入正确盆地的前提。训练太短,系数还没收敛就闭眼跑,误码率高到判决模式根本拉不回来;训练太长,频谱效率下降。工程上常见的做法是先粗后细:训练阶段用较大步长快速收敛,切到判决模式后把步长降一个数量级慢慢磨。这种变步长策略在 MATLAB 里就是两行 if,但它对稳态性能的影响比很多人预想的大。
还有一个细节常被忽略:训练模式下,反馈寄存器里应该推入已知的训练符号,而不是切片器的输出。因为训练符号是 100% 正确的,用它重建的 post-cursor 干扰也是准确的,这等效于给反馈支路开了个"外挂"。有些实现图省事,两种模式都往反馈线里塞 sign(z),结果就是训练期收敛慢、稳态 MSE 偏高,排查半天还以为是步长问题。
3.2 步长 μ 的稳定边界与归一化
LMS 的收敛条件在教科书里写得很清楚:0 < μ < 2/λ_max,其中 λ_max 是输入自相关矩阵的最大特征值。落到实际参数上,一个常用的保守估计是 μ ≤ 1/(Nf · σx²),Nf 是前馈抽头数,σx² 是输入样本的平均功率。超出这个边界,系数不会收敛到最优解,而是在最优解附近来回震荡,甚至直接发散到无穷大,在 MATLAB 里表现为 MSE 曲线一路爬升然后出现 NaN。
这个边界是理论值,实际用起来还得再打个折。原因有两层:一是 DFE 的反馈支路让整个系统变成了非线性时变系统,LMS 的线性收敛分析严格来说只在"判决全对"的假设下成立;二是输入样本之间高度相关(过采样后尤其严重),自相关矩阵的条件数很差,收敛速度会被最慢的那个特征方向拖住。所以实践中步长通常取理论上限的十分之一到五分之一,宁可慢一点也别震荡。
条件数差的问题可以用归一化 LMS(NLMS)缓解:把更新式改成 w(n+1) = w(n) + μ·e(n)·x(n)/(‖x(n)‖² + δ),分母里的 δ 是个很小的正数,防止输入能量接近零时除爆。NLMS 的等效步长随输入能量自适应,对突发型信号和功率波动大的场景更稳。代价是多了一次除法和一次范数计算,在 MATLAB 里这点开销可以忽略,但在定点硬件上要留意除法的代价。
3.3 一段能跑起来的最小闭环
光讲结构容易飘,下面这段代码把信道、噪声、DFE、LMS、误码统计串成一个闭环。它不长,但每一个参数都对应前面讲的一个机制,改任何一个都能看到可解释的变化。
% 最小 DFE 闭环:BPSK + 三抽头信道 + LMS 双模式更新 rng(7); N = 20000; bits = 2*randi([0 1],N,1) - 1; % BPSK 符号,取值 ±1 h = [0.3 1 0.5]; % 前游标 0.3,主抽头 1,后游标 0.5 y = conv(bits,h) + 0.05*randn(N+2,1); y = y(2:N+1); % 对齐到主抽头,去掉卷积尾巴 Nf = 5; % 前馈抽头数,需覆盖 pre-cursor + 主抽头 Nb = 2; % 反馈抽头数,对应后游标长度 mu = 0.02; % 步长,约取稳定上限的 1/5 trainLen = 2000; % 训练符号数 wf = zeros(Nf,1); wf(2) = 1; % 前馈中心初始化为主抽头 wb = zeros(Nb,1); d = zeros(Nb,1); % 反馈延迟线,存已判决/已训练符号 symHat = zeros(N,1); mseLog = zeros(N,1); for n = Nf:N xf = y(n:-1:n-Nf+1); % 前馈快照:当前 + 过去 Nf-1 个样本 z = wf'*xf - wb'*d; % 反馈项是减,抵消 post-cursor if n <= trainLen e = bits(n) - z; % 训练模式:用已知符号算真误差 d = [bits(n); d(1:end-1)]; % 反馈线推入已知符号,不推判决值 else bh = sign(z); % 判决模式:切片器输出当期望响应 e = bh - z; d = [bh; d(1:end-1)]; % 反馈线推入判决值,误差从此可传播 end wf = wf + mu*e*xf; % 前馈 LMS 更新 wb = wb + mu*e*d; % 反馈 LMS 更新 symHat(n) = z; mseLog(n) = e^2; end err = sign(symHat(trainLen+1:N)) ~= bits(trainLen+1:N); ber = mean(err); idx = find(err); gaps = diff(idx); % 错误间隔分布,用来看是否成簇 fprintf('BER = %.4e, 错误簇数 = %d\n', ber, sum(gaps==1)+1);几个参数值得单独说明。Nf = 5对应的是"前馈要横跨的跨度":pre-cursor 占 1 个抽头,主抽头 1 个,再加几个冗余让 LMS 有余量去微调相位。Nb = 2不是随便写的,信道只有 1 个后游标,理论上 Nb=1 就够,取 2 是给定时误差留余量。mu = 0.02对应前面说的"稳定上限打个折"——这个例子里输入功率约 1.34,Nf=5,上限大约 0.3,0.02 是它的十几分之一,收敛慢但稳。
代码里最值得盯的是d = [bits(n); d(1:end-1)]和d = [bh; d(1:end-1)]这两行,它们分别对应训练模式和判决模式,是整段代码里唯一体现"反馈支路信息质量不同"的地方。把训练模式那行改成也推sign(z),你会立刻看到 MSE 收敛变慢,这就是前面说的那个坑。
最后那句统计错误间隔的gaps = diff(idx)是观察误码传播的入口。如果错误完全独立,间隔近似服从几何分布;如果存在传播,gaps==1的比例会显著偏高,也就是出现连续错误。
4. 数据流与时序:MATLAB 里那些不写出来就会错位的细节
4.1 过采样与符号同步:为什么必须先降采样再均衡
真实接收机拿到的不是符号速率上的一个点,而是每个符号若干个采样点。有的实现图省事,直接把过采样数据丢进 DFE,让 LMS 自己去学——这在仿真里偶尔能跑通,但抽头会学出一组"每隔 M 个抽头才有能量"的稀疏解,收敛极慢,而且对采样相位极其敏感。正确的顺序是先做符号同步(或者至少做过采样域的信道估计加降采样),把数据降到符号速率,再进 DFE。
这个顺序背后的机制不复杂:DFE 的反馈支路假设"相邻寄存器里存的是相邻符号"。如果输入是 4 倍过采样,寄存器里相邻两项其实是同一个符号的不同相位,反馈滤波器减的就不是 post-cursor,而是一堆没有物理意义的组合。系数当然也能收敛到某个解,但那个解跟你想要的均衡器已经没关系了。
在 MATLAB 仿真里,最容易翻车的地方是conv带来的群延迟。y = conv(bits, h)之后,序列长度变成 N+length(h)-1,主抽头对应的位置偏移了 length(h)-1 个样本。如果不做对齐直接送进 DFE,训练序列和接收序列就错位了,LMS 会在一个完全错误的相位上挣扎,误码率稳定在 0.5 附近,看起来像"算法不收敛",实际上是数据没对齐。上面代码里那句y = y(2:N+1)就是干这个的:h 有三个抽头,主抽头在索引 2,所以从第 2 个样本开始截,截 N 个。
更稳妥的做法是用互相关找对齐点,而不是硬编码索引:
% 用训练序列的前 200 个符号做互相关,自动找最佳采样点 probe = bits(1:200); [c, lag] = xcorr(y(1:400), probe); [~, pk] = max(abs(c)); offset = lag(pk); % 主抽头相对起点的时间偏移 yAligned = y(1+offset : offset+N); % 按偏移截取,长度与 bits 对齐xcorr的第二个返回值lag给出每个相关值对应的相对位移,取模最大的那个位置就是主抽头落点。这段代码在信道抽头未知、或者信道是实测数据时特别有用,因为它不依赖你手写索引。代价是多算一次相关,N=20000 的规模下也就几毫秒。
提示:如果你的误码率曲线在不同随机种子下剧烈跳动、均值稳定在 0.3~0.5 之间,先别怀疑算法,先检查对齐。
4.2 反馈延迟线的长度与抽头数的关系
反馈延迟线d的长度必须严格等于反馈抽头数 Nb。这两者一旦不一致,MATLAB 会在wb'*d那一行报维度错误,属于"一眼能看出"的问题。真正隐蔽的是另一种:延迟线长度对了,但语义错了。
举个具体例子。假设信道后游标有两个,h = [0.2 1 0.6 0.3],那么 y(k) 里含有 0.6·s(k-1) + 0.3·s(k-2)。反馈滤波器有两个抽头 wb = [w1; w2],输入 d = [ŝ(k-1); ŝ(k-2)],输出 w1·ŝ(k-1) + w2·ŝ(k-2)。理想情况下 w1 收敛到 0.6、w2 收敛到 0.3,减掉之后 post-cursor 就干净了。这里的关键是延迟线里第一个元素必须是"上一个符号"而不是"当前符号"——如果实现时不小心把当前判决也推进去,反馈滤波器就会试图用当前符号去减当前符号造成的干扰,而当前符号的干扰本来就在主抽头里,减两次的结果是整体增益被吃掉一块,表现为输出幅度系统性偏小、误码率在低信噪比下异常高。
验证方法很土但有效:训练收敛后打印 wb,看它是否接近信道后游标的负值(取决于你的减号约定)。如果 wb 的符号或量级明显不对,八成是延迟线的推进时序有问题。
4.3 用错误间隔分布量化误码传播
前面提过,DFE 的错误会成簇。这件事可以被量化,而且只需要几行代码。思路是:对每一次错误,看它后面紧跟着的那个符号是否也错,统计"连续错误"的长度分布。
% 基于上一节的 err 计算连续错误长度分布 runLen = []; cnt = 0; for k = 1:numel(err) if err(k) cnt = cnt + 1; elseif cnt > 0 runLen = [runLen; cnt]; cnt = 0; end end if cnt > 0, runLen = [runLen; cnt]; end histogram(runLen, 'BinMethod', 'integers'); xlabel('连续错误长度'); ylabel('出现次数'); fprintf('平均簇长 = %.2f, 最长簇 = %d\n', mean(runLen), max(runLen));这段统计的价值在于,它能告诉你反馈抽头的能量是否过头了。如果max(runLen)明显超过 Nb,说明错误在反馈寄存器里"接力"了好几轮,超出了单次反馈能解释的范围——这通常意味着某个抽头系数被学得过大,或者信道存在非线性。如果簇长集中在 1~2,说明误码传播被控制住了,DFE 工作在健康区间。
对比实验也很简单:把 Nb 从 1 逐步加到 6,每个值跑一遍,画一条"平均簇长 vs Nb"的曲线。你会看到一条先降后升的 U 形——前期增加反馈抽头确实消掉了更多 ISI,簇长下降;超过信道实际后游标长度后,多余的抽头只会把判决噪声注入反馈路径,簇长重新爬升。这条 U 形曲线的拐点,就是 Nb 的合理取值。
5. 排查清单:DFE 调不出来时按这个顺序看
5.1 现象:误码率恒在 0.5 附近,怎么调步长都没用
原因几乎总是数据没对齐。conv的群延迟、filter的状态残留、过采样降采样的相位偏移,任何一个环节错位都会让训练序列和接收序列完全对不上,LMS 学到的是一组无意义的系数,切片器输出近似随机。
解决顺序:先用xcorr找主抽头位置,打印出来和预期比对;确认y截取后的长度与bits严格相等;再检查降采样时用的是哪个相位(y(1:M:end)和y(M:M:end)结果完全不同)。这三步做完,九成的"不收敛"会当场消失。
5.2 现象:增加反馈抽头 Nb 后性能反而变差
原因是过参数化。反馈滤波器每多一个抽头,就多一条把判决噪声注入输出通路的渠道。当 Nb 超过信道后游标的实际长度时,多出来的抽头没有真实 ISI 可以抵消,LMS 只能把它们学成接近零;但在收敛过程中它们会随机游走,游走幅度正比于步长,这些抖动直接污染输出。
解决办法是先做信道估计(用训练序列做最小二乘或简单的相关法),数出后游标有几个非零抽头,Nb 就取那个数加 1 作为余量。不要凭感觉给一个大值然后指望 LMS 自己剪枝,它没有稀疏约束,做不到。
5.3 现象:MSE 曲线前期下降,后期一路爬升直到 NaN
典型的大步长发散。μ 超过了 2/λ_max,系数在最优解附近震荡,幅度越来越大。在 DFE 里这个边界比线性均衡更严格,因为反馈支路的非线性会在某些样本上放大误差。
处理方式:先把 μ 砍到原来的十分之一,确认曲线能平稳收敛,再逐步往上加,找到"刚好不震"的位置再退回一档。如果输入功率波动大,直接换 NLMS,用 ‖x(n)‖² 归一化,比手动调 μ 省事得多。另外检查一下输入数据里有没有异常大的尖峰(比如同步头没去掉),单个超大样本足以让 LMS 瞬间跑飞。
5.4 现象:切换判决模式后误码率突然飙升
训练长度不够。系数在训练结束时还没进入收敛的稳态,一闭眼就跑,误判的符号被推进反馈线,错误立刻开始传播,然后越滚越大。
判断依据很简单:把训练阶段的 MSE 曲线画出来,看最后 20% 是不是已经平坦。如果还在明显下降,就加长训练序列。经验值是训练符号数至少覆盖 LMS 收敛时间常数的 5 倍以上,而收敛时间常数约等于 1/(μ·λ_min),λ_min 是最小特征值——这个量在强相关输入下可能很小,所以实际训练长度往往比理论估计还要长。另一个补救手段是保留一个很小的步长在判决模式下继续微调,让系数在运行中慢慢修正。
5.5 现象:仿真结果和理论曲线差 3 dB 以上
先怀疑噪声功率的定义。awgn函数默认按信号功率加噪,如果你的信号经过卷积后功率变了(h 的范数不是 1),实际信噪比就不是你设定的那个值。正确做法是先归一化 h:h = h / norm(h),再按Eb/N0换算噪声方差。
第二个可疑点是切片器的判决门限。BPSK 用sign没问题,但如果信道或均衡器引入了直流偏置,零门限就不再是最优的。检查方法是统计判决前软值的均值,如果明显偏离零,说明有残留偏置,加一个去均值步骤或者改用自适应门限。
6. 设计取舍:前馈抽头、反馈抽头与训练长度怎么互相拉扯
DFE 的参数没有一组"通用最优值",只有一组针对当前信道的平衡点。这三个参数之间的关系可以用一张表说清楚。
| 参数 | 调大的收益 | 调大的代价 | 经验取值 |
|---|---|---|---|
| 前馈抽头 Nf | 覆盖更长的 pre-cursor,相位容差变大 | 收敛变慢,稳态失调噪声正比于 Nf·μ | 信道前游标长度 + 3~4 |
| 反馈抽头 Nb | 消掉更多 post-cursor,残余 ISI 下降 | 误码传播半径变长,判决噪声注入变多 | 后游标非零抽头数 + 1 |
| 步长 μ | 收敛快,跟踪时变信道能力强 | 稳态失调大,超限直接发散 | 稳定上限的 1/10 ~ 1/5 |
| 训练长度 | 系数收敛更充分,切换更平滑 | 频谱效率下降,时变信道下训练过期 | 收敛时间常数的 5 倍以上 |
这张表最有意思的一行是前馈抽头。很多人下意识觉得抽头越多越好,实际上 LMS 的稳态失调噪声(excess MSE)近似正比于 μ·Nf·σx²,抽头数翻倍,稳态误差也跟着涨。在信噪比很高的场景下,这个代价是实打实的:多出来的抽头带来的 ISI 消除收益,可能还抵不过它引入的失调。所以 Nf 的选择原则是"刚好覆盖信道记忆长度再留一点余量",不是"能塞多少塞多少"。
反馈抽头的取舍更微妙。它同时影响两个方向相反的指标:消 ISI 的能力和误码传播的风险。Nb 在信道后游标长度以内时,收益占主导;超过之后,风险占主导。这就是第 4 章那条 U 形曲线的来源。如果你的系统后面接的是强纠错码,可以适当容忍长一点的簇,把 Nb 调大换取更低的原始误码率;如果用的是短码或没有交织,Nb 就得往保守了取。
还有一条容易被忽略的替代路径:MLSE(最大似然序列估计)。它用维特比算法在网格上搜索最可能的符号序列,从根本上避免了误码传播这一固有缺陷,代价是复杂度随信道记忆长度指数增长,O(M^L)。DFE 的复杂度是线性的 O(Nf+Nb)。所以在信道记忆长度只有两三个符号的场合(比如短距铜缆、某些低速无线链路),DFE 的性价比远高于 MLSE;信道记忆一长,MLSE 就跑不动了,DFE 依然是现实选择。这条复杂度曲线才是 DFE 在过去几十年里一直没被淘汰的真正原因,而不是它的性能有多极致。
验证一套 DFE 参数是否合理,我习惯看三个东西,而不是只看误码率一个数字:MSE 收敛曲线是否在训练结束前已经平坦、错误簇长度分布是否被压在 Nb 以内、以及把信道抽头扰动 ±10% 后误码率是否还能维持在同一个量级。第三条最容易被跳过,但它最能暴露参数是不是刚好卡在某个"脆"的平衡点上。
血泪经验是:早期我做过一个仿真,误码率曲线漂亮得不像话,结果换了一组随机种子直接崩了,查了两天才发现是训练序列刚好和信道的某个周期性成分"对上"了,属于幸存者偏差。从那以后我每次搭 DFE 仿真,都强制先把对齐用互相关验一遍、再用三组不同种子各跑一次,任何一组崩了就当作参数不成立处理,不再拿单次结果说事。希望帮到你。
本文还有配套的精品资源,点击获取