文章目录
- 原理
- 参数
- 测试
原理
光电二极管(PhotoDiode, PD)是将光信号还原为电信号的一种器件,是光接收机的第一级,也是最关键的光电转换器件。
当光照射到 PD 的半导体 PN 结(或 PIN 结构)时,如果光子能量大于半导体的带隙,光子会被吸收,激发出电子-空穴对。在反向偏置电压的作用下,这些载流子高速漂移,形成外部电路中的光电流,且律:产生的平均光电流I p h = R P i I_{ph}=RP_iIph=RPi,其中P i P_iPi是入射光功率,R RR是响应度。
在实际的光点信号转换的过程中,存在各种不同类型的噪声,比如
- 散粒噪声:由于光子和电子的离散性,即使光功率恒定,光子到达的随机性也会导致电流的微小波动。其方差与总电流(信号电流+暗电流I d I_dId)成正比,信号越强,散粒噪声越大。
- 热噪声:即约翰逊-奈奎斯特噪声,因负载电阻R L R_LRL中电子的热运动产生,与信号大小无关,是一个常数背景噪声。温度T c T_cTc越高,负载R L R_LRL越小,则热噪声越大。
PD还有两个重要参数,即带宽限制B BB和饱和电流I s I_sIs
参数
OptiCommPy提供了光电二极管photodiode函数,函数签名为
optic.models.devices.photodiode(E,param=None)其中,E是输入光场,param是OptiCommPy内置的参数类,其具体成员包括
| 参数 | 说明 | 默认值 | 单位 |
|---|---|---|---|
| param.R | 光电二极管响应度 | 1 | A/W |
| param.Tc | 温度 | 25 | °C |
| param.Id | 暗电流 | 5e-9 | A |
| param.RL | 负载阻抗 | 50 | Ω |
| param.B | 带宽 | 30e9 | Hz |
| param.IpdSat | 光电流饱和值 | 5e-3 | A |
| param.N | 频率响应滤波器的抽头数 | 255 | |
| param.fType | 频率响应类型 | ‘rect’ | 字符串 |
| param.ideal | 是否启用理想 PD 模型 | False | 布尔型 |
| param.shotNoise | 是否向光电流中添加散粒噪声 | True | 布尔型 |
| param.thermalNoise | 是否向光电流中添加热噪声 | True | 布尔型 |
| param.currentSaturation | 是否启用光电流饱和效应 | False | 布尔型 |
| param.bandwidthLimitation | 是否启用带宽限制 | True | 布尔型 |
| param.Fs | 采样频率 | None | Hz |
| param.seed | 随机数生成器的种子 | None |
测试
下面模拟理想和非理想的光电二极管,其差异如下
fromoptic.models.devicesimportphotodiodefromoptic.utilsimportparametersimportnumpyasnpimportmatplotlib.pyplotasplt plt.rcParams['font.sans-serif']='Times New Roman'Fs=100e9t=np.arange(0,2e-9,1/Fs)E_in=1.0*np.exp(1j*2*np.pi*10e9*t)*(1+0.5*np.sin(2*np.pi*2e9*t))# 理想 PDparam_ideal=parameters()param_ideal.ideal=TrueidealI=photodiode(E_in,param_ideal)# 实际 PD (开启噪声,带宽限制为 15 GHz,观察高频分量被滤除和噪声毛刺)param_real=parameters()param_real.B=15e9param_real.Fs=Fs param_real.N=201param_real.seed=42realI=photodiode(E_in,param_real)idealV=idealI*50realV=realI*50plt.plot(t*1e9,idealV*1e3,'b-',linewidth=1.5,label='Ideal PD Response')plt.plot(t*1e9,realV*1e3,'r-',linewidth=1,label='Real PD Response')plt.xlabel('Time (ns)')plt.ylabel('Voltage Output (mV)')plt.grid(True,alpha=0.3)plt.legend()plt.tight_layout()plt.show()