文章目录
- 原理
- 实现
- 示例
原理
在实际光纤中,光信号传输存在诸多非线性效应,比如自相位调制 SPM、交叉相位调制 XPM、四波混频 FWM 等。而对于线性模型而言,则只考虑光线衰减和色度色散这两方面的因素。
从数学角度来说,线性衰减的过程可以在频域中通过快速傅里叶变换来实现,它本质上是将输入信号转换到频域,乘以一个线性光纤的频域传递函数H ( ω ) H(\omega)H(ω)再转换回时域。传递函数H ( ω ) H(\omega)H(ω)的数学表达式为
H ( ω ) = exp ( − α 2 L ) exp ( − j β 2 2 ω 2 L ) H(\omega)=\exp\left(-\frac{\alpha}{2}L\right)\exp\left(-j\frac{\beta_2}{2}\omega^2L\right)H(ω)=exp(−2αL)exp(−j2β2ω2L)
式中,exp ( − α 2 L ) \exp\left(-\frac{\alpha}{2}L\right)exp(−2αL)表示幅度衰减,exp ( − j β 2 2 ω 2 L ) \exp\left(-j\frac{\beta_2}{2}\omega^2L\right)exp(−j2β2ω2L)表示色散引起的相位偏移,β 2 = − λ 2 2 π c D \beta_2=-\frac{\lambda^2}{2\pi c}Dβ2=−2πcλ2D,D DD为色散系数。
实现
OptiCommPy提供了线性光纤通道函数,其函数签名为
optic.models.channels.linearFiberChannel(Ei,param)其中Ei是输入的复数光场信号,param是OptiCommPy内置参数类,包括如下成员
- param.L: 光纤总长度,单位 km。默认 50 km。
- param.alpha: 光纤衰减系数,单位 dB/km。默认 0.2 dB/km。
- param.D: 色度色散参数,单位 ps/nm/km。默认 17 ps/nm/km。
- param.Fc: 光载波频率,单位 Hz。默认 193.1e12 Hz (即 193.1 THz,对应 C 波段 1550 nm 附近)。
- param.Fs: 信号的采样频率,单位 Hz。默认 None。
- param.returnParameters: 是否返回信道参数。如果为 True,除了返回输出信号,还会返回更新后的 param 对象,方便后续级联仿真。
示例
下面对linearFiberChannel进行测试,模拟信号光在光纤中传播80km之后的变化,结果如下
importnumpyasnpimportmatplotlib.pyplotaspltfromoptic.utilsimportparametersfromoptic.models.channelsimportlinearFiberChannel# 设置仿真参数Fs=100e9# 采样率 100 GHzFc=193.1e12# 载波频率 193.1 THzt=np.arange(-1000,1000)/Fs# 时间轴# 生成输入信号 (高斯脉冲)T0=20e-12# 脉冲宽度 20 psEi=np.exp(-(t**2)/(2*T0**2))# 配置光纤信道参数 (使用 optic.utils.parameters 对象)param=parameters()param.L=80# 传输距离 80 kmparam.alpha=0.2# 衰减 0.2 dB/kmparam.D=17# 色散 17 ps/nm/kmparam.Fc=Fc# 载波频率param.Fs=Fs# 采样率 (必须与信号匹配)param.returnParameters=FalseEo=linearFiberChannel(Ei,param)loss_linear=10**(-param.alpha*param.L/20)Eo_compensated=Eo/loss_linear# 6. 绘图对比plt.figure(figsize=(10,5))plt.plot(t*1e12,np.abs(Ei),'b-',linewidth=2,label='Input (Ideal)')plt.plot(t*1e12,np.abs(Eo_compensated),'r--',linewidth=2,label=f'Output after{param.L}km (Loss compensated)')plt.xlabel('Time (ps)')plt.ylabel('Normalized Amplitude')plt.title('Linear Fiber Channel: Pulse Broadening due to Chromatic Dispersion')plt.legend()plt.grid(True)plt.xlim([-100,100])plt.show()