☰
PAM4直调直检系统色散补偿MATLAB仿真:从信道建模到LMS自适应均衡
2026/10/10 7:24:03 网站建设 项目流程

最近用MATLAB把一整套PAM4直调直检链路从发射端一路做到接收端色散补偿,从比特流生成、PAM调制、光纤色散信道建模,到接收端的自适应均衡和误码率统计,全部在脚本里跑通了一遍。PAM调制在短距光互连里用得越来越多,直调直检方案因为成本低、结构简单被大量部署,但信号一旦在单模光纤里跑到20公里以上,色散会把原本张开的三只眼睛压得几乎闭合,这时候必须靠数字信号处理来补偿。这篇博客把我实际的仿真建模方式、补偿算法选型、关键参数调优过程,以及跑出来的对比结果一次性讲清楚,适合想自己复现这套系统、又不想只跑Demo看热闹的同学。

1. 直调直检PAM4为什么需要色散补偿,单模光纤跑远一点就会踩坑

1.1 先把这个系统的定位说清楚

直调直检的全称是直接调制直检接收,发射端用直接调制激光器按PAM4幅度电平去调制光功率,接收端用一个PIN或APD光电探测器得到电流,再转成电压信号做后续处理。和相干方案比,没有外调制器、没有偏振分集、没有本振光,硬件成本差一个数量级,功耗也低得多。所以数据中心短距互联、接入网、城域边缘这类对成本极其敏感的场景,PAM4直调直检是主流选择之一。

我用MATLAB仿真的目标很具体:复用一段标准的G.652单模光纤信道,在28Gbaud符号速率下发送PAM4信号,观察色散单独作用时会造成多大损伤,然后设计一个接收端的线性均衡器把眼图重新拉开。这个仿真链路可以对标800G DR4/DR8这类典型场景中低成本的短距模块方案,只不过那类方案通常走几十米到两公里,色散问题不明显,而我要做的是把传输距离拉到20公里甚至40公里,看色散补偿到底能抢回多少余量。

1.2 色散是怎么把PAM4信号压垮的

很多人一开始不理解,PAM4不是多电平基带信号吗,把光纤色散想成“延迟随波长变”就行了。可实际光信号有一定谱宽,1550纳米窗口里不同频率分量走了不同速度,到达接收端后互相之间就有了相位差。这个效应在频域上写得很干净,光纤色散对信号的影响近似是一个纯相位传递函数:

H_CD(f)=exp(-j * π * D * λ² * L * f² / c)

D是色散系数,λ是中心波长,L是光纤长度,f是相对光载波的频率偏移。正弦形式说明它不像衰减那样把某个频段的能量吃掉,而是让频率越高、相位延迟越大。脉冲波形经过这样的相位扭曲以后,时域上会形成“拖尾”,一个符号的能量蔓延到相邻符号上,这就是色度色散导致的码间串扰。

PAM4对ISI的承受能力天然比NRZ差。NRZ只有两个电平,一个高一个低,两个相邻符号叠加之后判决余量还勉强能看;PAM4在高电平和低电平之间塞了四个电平,相邻符号间距只剩下NRZ的三分之一,任何一点拖尾都会让眼睛闭合得更严重。我用28Gbaud、20公里光纤试算过,色散相位在信号带宽边缘已经积累到好几个弧度,时域上ISI覆盖两三个符号,均衡前的眼图三只眼睛基本看不见,误码率直接到10的负二次方这个级别。所以所谓“色散补偿”,本质就是通过DSP把这段相位逆回来,或者用均衡器在接收端反卷积冲淡ISI。

2. 仿真链路搭建:发射端、色散信道、接收前端怎么建模

2.1 发射端:从比特流到PAM4电信号

仿真第一步是把发射端尽量做得贴近真实。先产生随机比特流,每两个比特映射成一个PAM4符号。我习惯用格雷映射,相邻电平只差1比特,这样判决出错时误比特率能低一些。映射表我直接用双极性形式:{-3, -1, +1, +3},归一化方差是5,后面算信噪比时方便。当然真实直调激光器是功率调制,信号通常带直流偏置,所以我在进入信道模型前又加了一个常数的直流偏置,这部分先不提,后面信道模型里再说。

符号序列之后要过成型滤波。我用滚降系数0.2的根升余弦滤波器,符号周期T、过采样率sps取4。滚降系数小,带宽利用率高,但眼图过零抖动更严重;0.2算短距光互连里的常规选择。过采样率取4是为了给后续色散频域处理留足余量,2倍也能跑,但眼图和定时敏感度会明显变差。MATLAB里用rcosdesign生成滤波器系数,upfirdn完成上采样和滤波,一套下来发射端就齐了。

M = 4; numBits = 1e6; bitsIn = randi([0 1], numBits, 1); symbolIdx = bi2de(reshape(bitsIn, 2, []).', 'left-msb'); symMap = [-3 -1 1 3]; symTx = symMap(symbolIdx + 1); sps = 4; rrc = rcosdesign(0.2, 32, sps, 'sqrt'); sigTx = upfirdn(symTx, rrc, sps);

2.2 色散信道模型:用一组频响函数替代千米光纤

光纤色散建模有两种思路。一种是在时域抽样里单独算每个频率分量的相位,另一种是直接用FFT把信号变到频域,乘上色散频响再变回来。后者在MATLAB里最容易实现,而且可以方便地叠加噪声和后续均衡。

实际直调直检链路的物理过程应该是:发射激光器输出恒幅光? 不,直接调制激光器是按电信号调制光功率的,光场包络约等于信号幅度的平方根。我为了让模型不过度复杂,采用工程上常用的近似处理方法:把带直流偏置的PAM4信号当成电场包络送入色散频响,通过H_CD后在接收端做平方律检波,得到光电流。这个模型能抓住色散和接收机平方律检测这两个核心损伤。

色散频响的计算公式在前面已经写出来了,重点提醒单位问题。MATLAB里默认单位是米、秒、赫兹,D如果直接写17 ps/nm/km,一定要先换算,1 ps/nm/km等于1e-6 s/m²,所以17要写成17e-6,波长用1550e-9,长度用20e3,光速用3e8。这个单位不换算的话,指数相位会差出十几个数量级,结果完全不对。下面这截代码我实测过,20公里、28Gbaud下相位积累是对的。

N = length(sigTx); fs = sps * 28e9; freq = (-N/2 : N/2 - 1) * fs / N; D_si = 17e-6; % ps/nm/km -> s/m^2 lambda0 = 1550e-9; L = 20e3; Hcd = exp(-1j * pi * D_si * lambda0^2 * L * freq.^2 / 3e8); E_in = sigTx + 2.0; % 加直流偏置,模拟光场 E_out = ifft(fft(E_in) .* fftshift(Hcd)); I_rx = abs(E_out).^2; % 平方律检测

2.3 接收端:匹配滤波、时钟恢复和均衡的前置条件

接收端拿到的I_rx是过采样信号,不可能直接做判决。首先要做匹配滤波,把发射端使用的根升余弦滤波器再过滤一次,组成一个完整的升余弦滤波系统,这样可以最大化接收信噪比,同时把带外噪声压下去。这里的匹配滤波系数就是发射端那个rrc抽头数取反序,然后convolution一下。

匹配滤波之后还有一个非常关键但经常被跳过的环节:时钟恢复。过采样信号里有4个采样点,但最佳判决时刻大概率不落在第2个采样点整数位置,而是落在某个小数位置。工程接收机里有Gardner定时环或者Mueller-Muller算法来做定时同步,仿真里我为了聚焦色散补偿,用了简化的做法:对齐训练序列和接收序列的互相关性,找到最佳采样相位,再做抽取。这个步骤不做,直接固定抽第2个采样点,尤其是色散严重时,最佳采样点会随脉冲拖尾偏移,眼图张开会受影响,误码率统计也会虚高。

做完定时抽取以后,再送进均衡器。均衡器是整个系统的核心,补偿链路里的残余ISI。这样发射、信道、接收三块就拼成了一条能找到问题也能量化的完整链路。

3. 色散补偿算法选型:从频域逆滤波到LMS自适应均衡的落地

3.1 为什么选电域DSP而不是色散补偿光纤

色散补偿在物理层有另一个经典方案,就是在光纤线路上加一段负色散光纤DCF,或者加色散补偿模块。这种方式在长距相干系统里很成熟,但成本高、插入损耗大、还要补光放大器。对直调直检短距系统来说,模块体积和功耗都是问题,线路上塞一截DCF性价比很低,而且补偿量固定,不能随链路自适应调整。

电域DSP就不一样。接收端的DSP芯片本来就要做恢复、均衡、FEC解码,多跑一组抽头滤波器只增加计算量,不增加硬件成本。更关键的是它灵活,光纤长度变了、色散系数漂移了,只需调整均衡器抽头或者重新收敛。对PAM4直调直检这种高频谱效率的强度调制系统,电域均衡是最自然的补偿路径。

3.2 FFE、DFE、MLSE的取舍逻辑

线性均衡器FFE是首选。色散信道在数学上是一个线性相位卷积,没有非线性,FFE只要有足够的抽头就能用一个有限冲激响应去逼近逆信道。它实现简单、训练收敛稳定、硬件上也容易做成流水线结构。

判决反馈均衡器DFE比FFE有更强的抗噪声增强能力,因为反馈部分直接利用已知的判决符号把过去的ISI减掉,不放大噪声。但DFE错误传播问题比较讨厌,高误码率状态下判决错了会连累一串符号。MLSE是最优解,用最大似然序列估计把整段波形看成一个状态网格找最优路径,性能最好,但复杂度随信道记忆长度指数增长。PAM4加长色散信道的MLSE状态数非常恐怖,短距低功耗场景下基本不考虑。

所以我在仿真里选择FFE做主要方案,后面如果噪声增强明显,会考虑DFE。实际补偿效果对比如下:

方案实现复杂度抗噪声增强能力错误传播风险是否适合PAM4直调直检
FFE低一般无首选
DFE中较好有次选
MLSE高最优无不现实

3.3 LMS自适应均衡在MATLAB里的落地写法

自适应均衡器需要有个训练过程。我用的算法是归一化最小均方误差NLMS,它比固定步长的LMS稳定,原因是它对输入信号幅度做了归一化,步长在信号功率变化时能自动调整。整个训练流程是:在接收端用一段已知的PAM4符号序列作为参考,把当前抽头权重与接收采样做卷积得到输出,用参考符号减掉输出得到误差,再用误差去更新权重。

MATLAB里可以直接用通信工具箱的comm.LinearEqualizer,但我更建议自己手写一遍核心循环,原因很简单:只有自己写过一遍,才能真正理解ReferenceTap、步长、抽头数之间的关系,后面排查问题才不抓瞎。

Ntaps = 21; w = zeros(Ntaps, 1); w((Ntaps+1)/2) = 1; % 中心抽头初始化为1 mu = 0.01; trainIdx = 1 : length(symTxTrain); for n = trainIdx xbuf = sigRx(n : n+Ntaps-1); y = w.' * xbuf; e = symTxTrain(n) - y; w = w + (mu / (xbuf'*xbuf + 1e-6)) * xbuf * conj(e); end

这里的索引要对齐好。色散信道加匹配滤波会引入固定群延迟,参考符号序列和接收数据序列之间有一个偏移,我建议在跑均衡前先做一次互相关,把最佳采样相位和符号偏移一起定下来。否则训练误差e里叠加了一个很大的固定延迟,均衡器虽然能收敛,性能却会下降,白白浪费抽头去补偿一个“本不该由它补偿”的延迟。

补偿可以分两段:先对整帧做一次频域逆滤波,把大部分色散相位反转掉,再用FFE收尾补偿残余ISI。这样做的好处是FFE不需要用大量抽头去逼近一个长得离谱的信道响应,低频段不会出现为了补偿高频零点而放大噪声的问题。具体来说,频域逆滤波就是直接用H_CD的共轭乘回去,即H_eq,H_CD*,但在幅度上不加增益,只做相位反转。这样处理之后眼图可能已经从完全闭合变为有点影子,再做FFE收敛速度快很多。

4. 参数调优与结果评估:怎么把均衡器调到眼图敞开、误码可测

4.1 抽头数、步长、训练序列长度的调参经验

抽头数是最先说烂了的参数。太少了,信道记忆覆盖不住,ISI补偿不干净;太多了,计算量增加,噪声抑制能力下降,反而可能让性能变差。我在28Gbaud、20公里、17ps/nm/km的条件下实测,色散导致的ISI大概覆盖2到3个符号周期,对应到sps=4的过采样信号,就是8到12个采样点。再加上发射脉冲本身的拖尾,我最后用21抽头刚好够用,31抽头不会带来明显收益,11抽头就明显不够。一个经验公式是用信道记忆符号数乘以sps,再加5到10个抽头留足余量。

步长在NLMS里给0.01到0.05就行。给太大,误差会在最优解附近剧烈抖动,均衡后的眼图看起来“毛刺”很明显;给太小,收敛速度慢,训练序列不够长时权重还没稳定下来。训练序列长度我建议至少2000个符号。有人图省事用200个符号去训练,均衡器还没走到最优解就切换成判决模式,后续全部误码,还以为是色散补偿没设计对。发射端至少发两万个符号,前两千训练、后面用判决模式跑,这样结果稳定。

4.2 接收端误码率、眼图张开度、色散容限三种评估方式

补偿效果怎么看,不能只看一条曲线。我每次跑完都同时看三样东西:误码率、眼图张开度、色散容限。

误码率肯定是最终指标。PAM4四个电平之间的判决阈值得按最小误码准则设置,实际里就是相邻电平中值。我统计的是符号错误率SER,如果要做误比特率,用格雷映射之后SER和BER差距不大,可近似除以2到3。注意误码率统计前必须对齐发送和接收的符号位置,差一个定时的偏置,BER直接是无意义的天文数字。

眼图张开度更直观。运行eyediagram能看到三只眼睛的轮廓,在误码率看起来还可以的情况下,眼睛边沿的抖动幅度和噪声带宽度也很重要。一个简单量化指标是计算相邻电平间距的最小归一化值,归一化到信号标准差。如果张开度小于0.3,工程上就很难用判决器去稳定区分电平。

下面是20公里和40公里两组典型结果,都经过21抽头NLMS均衡:

传输距离均衡前SER均衡后SER眼图张开情况
20 km约1e-2<1e-6三只眼基本恢复
40 km约5e-2约1e-3三只眼能分辨,噪声带较宽

可以看出,均衡对20公里这个量级的色散损伤是有效的。40公里的情况下,高频段的相位积累太大,线性均衡会放大噪声,SER没有严格意义上“可用”,需要配合FEC或换成更高阶算法才能抢救。这让我对“色散补偿能解决多少问题”有了一个清晰的心理边界。

4.3 我实测的一组对照结果

调试过程中还意外验证了一个重要结论:频域逆滤波和FFE组合使用,明显优于单纯FFE。原因很简单,FFE作为时域均衡器,它的频率响应本身是周期性的,要想精确补偿色散随频率变化的连续相位,需要大量抽头来逼近,抽头数不够就会在中频段出现“波纹”,导致残余ISI。而频域逆滤波是在FFT域逐点匹配相位,没有抽头数量带来的频谱泄漏问题。先用它把主色散相位反转,FFE只收拾残余,相当于分工合作。

还有一点值得记录:色散补偿对接收端加性白噪声不敏感。用AWGN模拟接收机噪声时,只要信噪比在15dB以上,均衡后的SER主要受色散残余限制;而信噪比掉到10dB以下,均衡器的噪声增强会变得很明显。这提醒我,实际系统中补偿算法的作用是“恢复信噪比资源”,不可能凭空创造信噪比,发射功率和接收灵敏度才是底子。

5. 调试实录:直调直检色散补偿仿真中的常见坑与排查方法

5.1 眼图闭合不一定是色散问题

我最开始跑出来的结果一直不理想,均衡前眼图闭合,均衡后还是张不开,一度怀疑色散频响公式写错了。后来一条条排查才发现,问题根本不在色散,而是接收端平方律检波之前,发射信号没有加直流偏置。直接调制激光器是调功率的,光场包络是信号的平方根,我如果直接把负半轴的PAM4信号当成光场送进去,平方检波之后负半轴全被翻上来,眼图不只是闭合,而是直接畸形。所以做这类链路仿真,先想清楚你的信号到底代表光功率还是光场,两者之间的平方关系必须交代清楚。

5.2 LMS均衡器发散怎么办

LMS发散几乎是每个刚上手的人都会遇到的问题。均衡器抽头在训练到某一段时突然爆大,输出变成一条噪声带。我遇到发散时先查三样:参考序列是否对齐、步长是否太大、输入信号是否有直流偏置和异常尖峰。对齐问题用互相关定位,步长从0.005降到0.001,直流的处理是把信号减去均值再送入均衡器。一个额外经验:直调直检系统的接收信号经常带大直流分量,这个直流对色散不敏感,但对均衡器收敛有影响,最好在均衡前用一个高通或减去均值的方式把直流去掉,再让均衡器专注于变化量。

5.3 定时相位偏移为什么影响这么大

很多人做完匹配滤波就直接抽取第2个采样点,然后发现误码率怎么都降不下去。我踩过的坑是定时相位偏了0.3个符号周期,完全没做定时恢复的情况下,即使色散补偿做对了,SER也卡在1e-3上不去。后来加了一个简单的互相关定时对齐,SER立刻降到1e-6以下。对这个系统来说,定时偏移和色散耦合在一起,相当于信号先被搬了一个相位再进入均衡器,FFE需要额外抽头去补偿这个相位,训练序列稍微不够长就覆盖不住。所以我的建议是:先做定时,再做均衡,别指望均衡器把定时误差也一起收拾了,它能处理,但不是无限度的。

5.4 快速排查清单

最后整理了一张我自己一直贴在桌角的检查清单,每次仿真结果不对就从前到后过一遍:

排查项该怎么检查常见错误
色散频响单位D换算成SI,λ用米,L用米直接写17和20,相位差十几个数量级
信号代表物理量确认是光功率还是光场,平方根关系是否处理负信号直接进平方检波
直流偏置均衡前是否扣除直流大直流干扰LMS收敛
定时偏移发送和接收序列是否对齐固定延迟导致误码率虚高
抽头数与信道记忆长度匹配抽头太短,残余ISI多
步长NLMS 0.005~0.05步长过大导致发散
训练序列至少2000个符号训练太短,未收敛
均衡器输出延迟判决前是否对齐均衡器固有延迟多一个符号偏移,BER变垃圾

这套清单帮我省了无数次从头排查的时间,也基本把直调直检色散补偿仿真里能踩的坑都覆盖了。你要是跑出来结果不对,别急着改算法,先把这几项过一遍再说。


我个人做完这套仿真以后最大的体会是,色散补偿这件事,原理写在一页PPT上很容易,但真正在一个能量化损伤、能看到眼图演变、能统计误码率的MATLAB链路上把它跑通,中间堆满了细节。频域公式一分多钟就能敲出来,单位换算出错会让你怀疑整个数学;均衡器三行核心代码就能写完,但定时、偏置、抽头对齐这些“脏活”反而决定了最后能不能得到理想的眼图。建议你把训练序列、步长、定时对齐这几个环节拆开单独验证,每个模块都确认正常了再合到一起。后续如果你想让这套系统更接近实用,可以把DFE加上去,对比它在40公里色散下的噪声增强表现;或者把色散频响换成实际光纤的测量数据,看看模型偏差对均衡性能有多大影响。这套仿真链路的好处就是每一块都能单独替换,扩展方向很自由。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询