
文章目录安装和简介定义参数仿真可视化安装和简介OptiCommPy 是一个基于 Python 的开源框架专门用于光纤通信系统、子系统及核心组件的数值仿真。它主要面向光通信领域的教育与科学研究涵盖了从物理层光信号传输到接收端数字信号处理DSP的完整链路。安装没什么好说的pip即可pip install OptiCommPy-i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后可以做一个简单的眼图测试。定义参数在OptiCommPy中一般采取专门的parameters类进行参数传递。在仿真过程中主要涉及到四类参数分别是全局与基础仿真参数包括每符号采样数、调制阶数、符号速率、采样率发射机参数包括比特源、脉冲参数和马赫-曾德尔调制器参数光纤信道参数接收机参数代码如下fromoptic.utilsimportparameters SpS16# 每符号采样数 (Samples per symbol)M2# 调制阶数 (2-PAM 即 OOK)Rs10e9# 符号速率 10 GBaudFsSpS*Rs# 采样率 160 GHz# 发射机参数paramBitsparameters()paramBits.nBits2000paramBits.moderandomparamBits.seed123paramPulseparameters()paramPulse.pulseTypenrzparamPulse.SpSSpS paramMZMparameters()paramMZM.Vpi2.0paramMZM.Vb-paramMZM.Vpi/2# 偏置在 Null 点实现 OOK# 信道参数 (80km 标准单模光纤)paramChparameters()paramCh.L80paramCh.alpha0.2paramCh.D16paramCh.Fc193.1e12paramCh.FsFs# 接收机参数paramPDparameters()paramPD.idealTrue# 设为 True 忽略噪声方便观察纯净的眼图paramPD.BRs paramPD.FsFs paramPD.seed456仿真仿真流程与物理过程保持一致其步骤如下发射端电信号生成与脉冲成型强度调制 (IM)电信号转换为光信号光纤信道光域传输与线性损伤直接检测 (DD)光信号转换为电信号接收端电域滤波与采样仿真代码为importnumpyasnpfromoptic.comm.sourcesimportbitSourcefromoptic.comm.modulationimportmodulateGrayfromoptic.dsp.coreimportupsample,pulseShape,firFilter,anormfromoptic.utilsimportdBm2Wfromoptic.models.devicesimportmzm,photodiodefromoptic.models.channelsimportlinearFiberChannel# 1) 生成比特序列并映射为 2-PAM 符号bitsTxbitSource(paramBits)symbTxmodulateGray(bitsTx,M,pam)# 上采样与脉冲成型symbolsUpupsample(symbTx,SpS)pulsepulseShape(paramPulse)# 生成 NRZ 滤波器系数sigTxfirFilter(pulse,symbolsUp)# 对 upsampling 后的信号进行 FIR 滤波sigTxanorm(sigTx)# 归一化到 1 Vpp# MZM 强度调制 (IM)PidBm2W(3)sigTxomzm(np.sqrt(Pi),sigTx,paramMZM)# 理想连续波激光器输入光场幅度sigChlinearFiberChannel(sigTxo,paramCh)# 光纤信道传输I_Rxphotodiode(sigCh,paramPD)# 光电二极管直接检测 (DD)可视化接下来的目标是绘制下图左图是信号接收图右图是眼图每一条线都表示一个脉冲信号。绘图代码如下importmatplotlib.pyplotasplt plt.rcParams[font.sans-serif]Times New Romanfig,axsplt.subplots(1,2,figsize(14,5))t_nsnp.arange(len(I_Rx))/Fs*1e9num_samples100*SpS axs[0].plot(t_ns[:num_samples],I_Rx[:num_samples],colorb,linewidth1.5)axs[0].set_title(Received Electrical Signal (Time Domain))axs[0].set_xlabel(Time (ns))axs[0].set_ylabel(Amplitude (A.U.))axs[0].grid(True,linestyle--,alpha0.7)# 图2眼图 (Eye Diagram) - 【严格对齐符号边界】L2*SpS# 每次截取 2 个符号周期的长度以形成完整的“眼睛”结构Nlen(I_Rx)//SpS-2# 计算总共有多少个可以对齐的符号周期foriinrange(N):traceI_Rx[i*SpS:i*SpSL]axs[1].plot(trace,colorblue,alpha0.05,linewidth0.8)axs[1].set_title(Eye Diagram)axs[1].set_xlabel(Time (samples))axs[1].set_ylabel(Amplitude (A.U.))axs[1].grid(True,linestyle--,alpha0.7)# 标记最佳采样点 (眼图张开最大处即第 1 个符号周期的末尾)axs[1].axvline(xSpS,colorr,linestyle--,linewidth2,labelOptimal Sampling Point)axs[1].legend()plt.tight_layout()plt.show()