搞光通信仿真的人,基本都会撞上“波分复用”这个绕不开的题目。不管是验证一套4×10G的城域传输方案,还是想复现一个基于光谱整形的实验室结果,你最后总会卡在滤波器这步。早两年我用OptiSystem的时候,自带的滤波器组件就那几种,高斯、余弦、巴特沃斯,换一种趋势就得拆掉重连,参数再多调几步就很容易把自己绕晕。后来在一份老外的配置里看到“Z-block”这个不起眼的模块,才发现原来可以在Z域传输函数里自己定义任意滤波行为,什么非对称滚降、零极点补偿、自适应均衡,全都能在一个组件里解决。
这篇文章就围绕“波分复用-Zblock仿真”展开,把我的配置思路、踩坑过程和参数选择经验一次性倒出来。内容偏实操,不绕理论,适合刚接触OptiSystem的同学,也给在WDM链路上做信号完整性的工程师一个参考。
1. 波分复用系统里,Z-block到底顶在哪个位置
1.1 先分清光域滤波和电域滤波的边界
波分复用系统的常规链路是:多个发射机把各路信号调制到不同波长上,经过合波器(MUX)汇入一根光纤传输,到达对端后再由分波器(DEMUX)按波长分离开,进入各路接收机。
在这个过程中,光域的滤波任务主要由MUX和DEMUX完成。它们本质上是波长选择器件,几个信道各占一条通带,之间有保护间隔。
而Z-block处理的不是光波长,它处理的是电信号或离散采样信号,也就是在光电转换之后,对电流或电压波形进行滤波和整形。
很多第一次接触Z-block的人容易犯一个错:试图把它直接塞到光纤输出端和光电探测器之间,当作一个光滤波器来选信道。虽然OptiSystem的信号本质上都是采样序列,但如此用会让“光域滤波”和“电域滤波”混在一起,仿真结果很难对齐实际物理结构。我的建议是,把它放在光接收机偏电域一侧,最稳的位置是在PIN光电二极管之后。
1.2 接收机里的“万能滤波模块”
一个标准的光接收机前端,通常包含PIN或APD光电二极管、跨阻放大器、增益级和后端低通滤波器。后端低通滤波器的作用是滤除带外噪声和高次谐波,但这个滤波器往往是固定结构,比如贝塞尔、高斯,或者简单的RC。
问题是,真实系统里不是所有信道都一个样。受到MUX/DEMUX通带倾斜、光纤色散、非线性效应的影响,每个信道的波形失真程度不同。有的信道高频分量衰减多一点,有的信道低频基线抬高一点。这时候一个固定响应曲线的模拟滤波器,就只能做“差不多”的处理。
Z-block的优势在于,它可以实现一个全自定义的数字滤波器,包括FIR和IIR结构。你给出一组分子分母系数,它就精确地按这个传输函数处理输入信号。补一个陷波点、压一个带外峰、拉一下基线,都能做到。
换句话说,Z-block在接收机里就是个“万能修型模块”。自适应均衡、匹配滤波、部分响应整形,凡是你想用系统函数表达的处理,都可以交给它。
1.3 为什么不用系统自带的滤波器
自带的低通滤波器确实方便,双击设置参数即可。但它的响应类型固定,比如1阶/2阶贝塞尔就是那几条曲线,没法微调零极点位置。通道间隔小、速率高的时候,相邻信道串扰对滤波器滚降特性非常敏感,这时候我想给一个“肩部突然压下去、阻带有几个凹陷”的响应曲线,自带组件做不到。
我印象最深的一次,是模拟一个被某个窄带干扰污染的信道。自带的带阻滤波器只有一个中心频率和一个Q值,我想要在特定频率上压一个坑,同时又能保留附近信号,试半天都不理想。放到Z-block里,直接在分子多项式上对应位置放一个零点,几秒就出结果。
所以,Z-block在做实验性链路验证时非常有价值。一些复杂的接收端补偿算法,比如模仿均衡器的抽头系数,也只有在Z-block里才能直观演算。
2. Z-block的传递函数配置:先说清楚这些系数怎么来的
2.1 Z-block界面里到底填什么
不同版本OptiSystem的Z-block入口位置略微不同,我常用的版本里它在信号处理组件库下。双击组件后,核心参数是这两项:分子系数(Numerator coefficients)和分母系数(Denominator coefficients)。
它们对应Z域传递函数:
H(z) = Y(z) / X(z) = (b0 + b1·z^(-1) + b2·z^(-2) + ...) / (1 + a1·z^(-1) + a2·z^(-2) + ...)
其中b0、b1、b2就是分子系数列表,a1、a2是分母系数列表。分母的a0通常固定为1,不需要特殊处理。
需要注意,界面里填的是按z次幂升序排列的一组数,比如三个抽头的FIR滤波器,分子填“0.25, 0.5, 0.25”,分母填“1”。
2.2 最实用的五抽头低通系数
在WDM仿真里,我第一个验证Z-block能不能正常工作的测试模型,用的是一个五抽头FIR系数:
b = [0.1, 0.2, 0.4, 0.2, 0.1],a = [1]
这个系数看起来简单,效果很直观。频率为零时,z=1,H(1)=0.1+0.2+0.4+0.2+0.1=1,信号直流分量原样通过;在奈奎斯特频率附近,z=-1,H(-1)= -0.1+0.2-0.4+0.2-0.1=-0.2,幅度是0.2,高频分量被明显抑制。所以这是一个典型的低通平滑器,放到接收机后端可以把光电探测器输出波形里的高频毛刺压掉。
实际用的时候,我会在OptiSystem里把这个Z-block先设为上述系数,确认整个链路正常,再根据眼图效果一步步调整。
2.3 加入反馈之后的稳定性红线
如果只写FIR,分子任意造,系统不会发散的,因为没有反馈通路。但加入分母系数以后,IIR结构就出现了,问题也随之而来:只要有一个极点落在Z平面单位圆外,或者正好压在单位圆上,仿真就会发散或严重振荡。
比如,你填了分母系数,使它形成了(1 - 0.5z^(-1))(1 - z^(-1))的因式,那么有一个极点z=1恰好在单位圆上,仿真过程中信号就是像“啸叫”一样越来越大。
所以,分母系数不是随便拍脑袋给的。我一般在MATLAB或Octave里先用roots()看一下极点位置,确认全在单位圆内,再拷贝到OptiSystem里。
一个稳稳的IIR低通示例是:
b = [0.067, 0.134, 0.067],a = [1, -1.143, 0.412]
它的极点在0.57和0.73附近,都在单位圆内,稳定性没问题。用这个做后置滤波,眼图比纯粹FIR更贴近真实模拟滤波器的效果。
2.4 用MATLAB/Octave批量生成系数
手算零极点太费时间,而且容易出错。每次需要设计新滤波响应,我都是先在Octave里画幅频响应,确认没问题再拿系数。比如输入:
b = [0.1 0.2 0.4 0.2 0.1]; a = [1]; zplane(b,a); freqz(b,a,1024);zplane直接画零极点图,freqz看幅频和相频。确认曲线符合需求,然后把数组填进Z-block的界面里。比在仿真软件里反复试错高效得多。
3. 从零搭一条4×10Gbps WDM+Z-block仿真链路
3.1 全局仿真参数设置
新建OptiSystem项目后,先不要急着拖组件,把全局仿真参数设好,否则后面改一处处处跟着乱。
我用的是4信道、单信道速率10Gbps的系统,信道间隔100GHz。规划为:
- 中心频率:193.1THz、193.2THz、193.3THz、193.4THz
- 比特率:10Gbps
- 序列长度:128 bits
- 每个比特采样点数:64
- 参考波长:1550nm
这个配置在仿真容量上不算大,跑起来很快,又足够看出WDM串扰和色散影响。
3.2 发射端和光纤链路配置
发射端我用的是WDM Transmitter组件,在里面设置4个激光器频率和功率。每路激光器输出设成0dBm,线宽100kHz,调制格式选择NRZ-OOK。这样可以省去单独搭4套光发射机的时间。
MUX和DEMUX使用OptiSystem里自带的高斯型滤波器仿真,通道带宽设为0.4nm左右。间隔是100GHz,这个带宽能保证信号通过时不会切掉太多高频边带。
光纤链路放一段标准单模光纤,长度50km,衰减0.2dB/km,群速度色散16ps/nm/km,非线性效应可以先关掉,简化分析。
3.3 接收端Z-block怎么接线
从DEMUX每个信道输出接到一路光接收机。第一信道为例:
PIN光电二极管 → 电增益放大器(20dB) → Z-block → 低通滤波器(贝塞尔,7GHz) → 3R再生器 → 误码仪
关键点在于,Z-block放在电增益之后、低通之前。这样做的好处是我可以直接对放大后的信号做整形,同时用后级的低通滤波器把Z-block可能产生的带外杂散再压一遍。
Z-block的配置:
- 分母系数:1
- 分子系数:0.25, 0.5, 0.25
- 采样率设置:与全局采样率一致,即10Gbps × 64 = 640GHz
如果你找不到采样率字段,务必确认组件属性里的“Sample Rate”没有用默认的1GHz,否则滤波器的实际截止频率会完全偏离预期。
3.4 结果对比:没加Z-block和加了Z-block
我刻意先跑了一版不带Z-block,直接PIN接收到低通再到误码仪的眼图。50km色散条件下,眼图的张度缩到大概45%,眼睛顶部的噪声带很粗。再看BER,只有10^-3左右,对于通信系统来说完全不可用。
加上Z-block,还是最简单的三个抽头FIR,眼图张度恢复到70%以上,顶部噪声明显变细,BER降到10^-8量级。
这说明在发射端、光纤和后端固定低通滤波器都设好的前提下,光靠一个三抽头均衡器就能把码间串扰压下去一大截。如果再加一个IIR补偿项,比如第二节给出的b=[0.067,0.134,0.067], a=[1,-1.143,0.412],眼图还能再干净一点。
4. 加进Z-block之后,仿真发散、眼图打不开、波形错乱:我踩过的三个坑
4.1 现象一:仿真发散,光功率图直接飞到10^30
我在一次模拟自适应均衡时,给分母填了一组自己拍脑袋的系数。跑完一看,接收端功率监控直接出现一个飞上天的尖峰,数值到了10^30量级,眼图变成一条正弦弧线,完全不可读。
第一反应是检查组件连接,没问题。后来用MATLAB把分母系数求根,发现有一个极点z=1.049,落在单位圆外。虽然看起来只是超出一点点,但系统在递归迭代时,这个极点会让信号每次都放大,几十个比特之后直接爆炸。
这个坑非常典型,而且不容易被察觉,因为输入那一串系数时没有任何报错。
处理方式就是降低分母系数幅度,或者直接用全零点FIR。要设计一个高Q值的IIR滤波响应,必须先离线验算极点和稳定性,再放进Z-block。
4.2 现象二:眼图打不开,噪声反而变大
还有一次,我加了一个看起来挺合理的低通滤波器。理论上周频曲线上都设计好了,可跑出来的眼图不但没有打开,噪声反而比以前还大,感觉像给信号加了一个随机抖动。
排查半天,发现是采样率不匹配。Z-block那个实例内部默认采样率是1GHz,而我的信号是10Gbps、每比特64个采样点,实际信号采样率是640GHz。Z-block以为自己处理的是一个低速率信号,截止频率对我这边来说几乎就等于零,相当于让整个波形做了一次长积分,噪点自然越堆越多。
解决办法很简单,把Z-block的采样率改成和系统输入端口一致的采样率。如果组件界面没有采样率字段,就在参数列表里搜 “SampleRate” 或 “Frequency”,确认与全局采样率相同。
4.3 现象三:波形“阶梯状”失真
另一个诡异情况是信号输出像台阶一样,一段一段地跳变。看起来不像是噪声,更像是量化跳变。
反复试了几次,我发现问题出在Z-block的信号位宽上。当输入信号幅度太大,或者电增益设置过高,Z-block内部处理的数据会饱和,相当于把连续波形拉到上下界限,形成“削顶”效应。
导通路径里的光功率和增益要控制好,不能让Z-block输入端的电压幅度超过它的线性范围。后期我再做高增益实验时,会在Z-block前加一个衰减器或限幅器,让它工作在线性区,再通过后级放大找回信号幅度。
4.4 通用排查步骤
如果加Z-block后链路不正常,我建议按这个顺序排:
- 先把Z-block旁路掉,双击设置“Bypass”或直接连线绕过去,确认整个链路不带它时是正常工作的。
- 换成纯FIR系数,即分母为[1],分子用一个简单的[0.5,0.5],排除IIR稳定性问题。
- 用MATLAB检查所有极点是否在单位圆内。
- 确认Z-block采样率与系统全局采样率一致。
- 把输入信号增益降到0dB附近,看波形是否恢复。
按这个顺序能排除八成问题。
5. 让Z-block与WDM链路更“听话”的调参经验
5.1 从保守系数开始,迭代微调
Z-block最大的问题是自由度高,反而容易过拟合或把波形弄崩。我现在的习惯是:先上最保守的系数,比如[0.25,0.5,0.25],跑通链路、记录眼图和BER,然后再一点点改变分子分母,让结果往目标方向走,每次只动一个参数。
这种“单因子变量”的调法,比一口气填五个系数要稳得多。因为一旦结果变差,你能立刻判断是哪个参数导致的。
5.2 用三个窗口联动观察
调参时不要只看误码仪。误码仪能告诉你结果好坏,但不告诉你往哪个方向改。
我是把光谱分析仪、示波器、误码仪三个窗口同时打开。先看Z-block输出端的电信号时域波形,哪个码元位置塌陷了,再回头调滤波器系数。
比如,如果只是“1”电平顶部噪声大,可能高频分量过冲,需要压一下高频;如果是“0”电平基线抬起,可能是低频响应过多,该在分子里加一个高通零点。
先学会看波形,再调系数,效率高很多。
5.3 多信道同时用Z-block,注意系数不必完全相同
4个信道同时加Z-block时,很多人习惯把同一组系数复制到所有接收机。这不一定对。
虽然光纤色散对所有信道的影响差异不大,但MUX/DEMUX对边缘信道和中心信道的插损、带宽是有区别的。尤其是193.1THz和193.4THz两个边缘信道,滤波器响应歪得更明显。
我通常先把中心信道调好,然后把同一系数拷贝到边缘信道看结果。哪个信道BER偏高,再单独给它微调一两个零点。最后4个信道的系数可能不完全相同,但总体的系统BER会更好。
5.4 什么场景值得用Z-block
用了这么多次,我的总结是:如果单纯要一个低通或整型滤波器,直接用OptiSystem自带的组件更省事;如果要模拟非标准的频响、信道均衡、动态补偿,再用Z-block。
尤其在做波分复用系统损伤研究时,比如残余色散均衡、带内串扰抑制、非线性补偿等场景,Z-block是绕不开的。它能帮你把“理论上是否存在一个滤波器能解决问题”这个问题快速验证出来,再回到现实世界考虑工程实现。
另外,如果后面打算做更复杂的自适应算法联合仿真,Z-block往往还提供了外部控制接口,可以把算法计算出的系数实时写入,这就不是普通滤波器组件能替代的能力了。
我手里这个4×10G的WDM模型到现在还在用。后来把速率从10G提到25G时,Z-block分母里加了一个二阶补偿项,眼图又重新压出了一片张度。做WDM仿真,组件越灵活,后期改方案的成本就越低。真心建议所有在OptiSystem里调链路的人,把Z-block收进自己的“常用组件”清单里,它值得。