OptiCommPy模拟线性光纤通道

OptiCommPy模拟线性光纤通道 文章目录原理实现示例原理在实际光纤中光信号传输存在诸多非线性效应比如自相位调制 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λ2​DD 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# 设置仿真参数Fs100e9# 采样率 100 GHzFc193.1e12# 载波频率 193.1 THztnp.arange(-1000,1000)/Fs# 时间轴# 生成输入信号 (高斯脉冲)T020e-12# 脉冲宽度 20 psEinp.exp(-(t**2)/(2*T0**2))# 配置光纤信道参数 (使用 optic.utils.parameters 对象)paramparameters()param.L80# 传输距离 80 kmparam.alpha0.2# 衰减 0.2 dB/kmparam.D17# 色散 17 ps/nm/kmparam.FcFc# 载波频率param.FsFs# 采样率 (必须与信号匹配)param.returnParametersFalseEolinearFiberChannel(Ei,param)loss_linear10**(-param.alpha*param.L/20)Eo_compensatedEo/loss_linear# 6. 绘图对比plt.figure(figsize(10,5))plt.plot(t*1e12,np.abs(Ei),b-,linewidth2,labelInput (Ideal))plt.plot(t*1e12,np.abs(Eo_compensated),r--,linewidth2,labelfOutput 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()