PN结
需要满足两个假设:
- 玻尔兹曼分布,每一个半导体区域都是非简并半导体;
- 完全电离,忽略温度对PN结的影响
玻尔兹曼分布的解释:
|
玻尔兹曼分布 |
费米–狄拉克分布 |
| 适用粒子 |
可区分粒子(经典) |
费米子(电子等) |
| 是否考虑泡利不相容 |
否 |
是 |
| 数学形式 |
$e^{-(E-E_F)/kT}$ |
$1/(e^{(E-E_F)/kT}+1)$ |
| 高温极限 |
保持原形 |
退化为玻尔兹曼分布 |
| 典型应用 |
理想气体 |
金属导电电子、半导体电子 |
| 服从分布 |
非简并半导体 |
简并半导体 |
电子和空穴都是费米子,理论上都应该遵守费米–狄拉克分布
但在半导体中,通常载流子浓度较低,导带(或价带)中几乎没有被填满的情况
$$
(E-E_F)\gg kT
$$
所以半导体的中分布绝大部分服从玻尔兹曼分布,并且使用玻尔兹曼分布更直观
在常温和弱掺杂条件下,通常使用玻尔兹曼近似来简化分析,但在强掺杂条件下(进入简并)需要回到费米狄拉克分布
PN结的基本结构
P型半导体:主要载流子是空穴(通过掺入受主杂质,如硼)
N型半导体:主要载流子是电子(通过掺入施主杂质,如磷)
PN结是由P型半导体和N型半导体紧密结合而形成的半导体结,分隔p区和n区的交界面为冶金结
耗尽层
在结区附近,由于电子和空穴相互扩散并复合,N区留下正电荷,P区留下负电荷,形成一个几乎没有自由载流子的“耗尽层”
假设均匀掺杂并且空间电荷区在边缘处快速截断
在空间电荷区的电荷密度则可以表示为:
$$
\begin{aligned}&\rho (x)=-eN_A,\quad -x_p<x<0\\
&\rho (x)=eN_D,\quad 0<x<x_n
\end{aligned}
$$
根据电荷守恒需要满足 $N_Ax_p = N_Dx_n$
结合泊松方程可以得到空间电荷区宽度:
$$
W=x_{n}+x_{p}=\sqrt{\frac{2 \varepsilon_{s}}{e} \frac{N_{A}+N_{D}}{N_{A} N_{D}} V_{b i}}
$$
在此基础上可以推算出结电容
$$
C_j = \frac{\varepsilon_s A}{W}
$$
内建电势
假设PN结两端没有外加电场,那么整个半导体系统的费米能级应该处处相同,但是p区和n区内导带和价带的位置随着费米能级的变化而变化,所以空间电荷区内的导带和价带会发生弯曲
n区的电子在进入p区的过程中会遇到一个势垒,阻碍电子继续扩散,扩散与漂移达到平衡后留下的电势差称为内建电势差,记为$V_{bi}$
$$
V_{bi} = |\phi_{Fp}|+|\phi_{Fn}|
$$
n区电子浓度可以表示为:
$$
n_0 = N_c\exp[\frac{-(E_c-E_F)}{kT}] = n_i\exp[\frac{E_F-E_{Fi}}{kT}]
$$
在完全电离的情况下平衡电子浓度(多数载流子浓度)几乎等于施主浓度 $n_0=N_D$
解得
$$
E_F-E_{Fi}= {kT}\ln \frac{N_D}{n_i}
$$
同理
$$
E_{Fi}-E_F={kT}\ln\frac{N_A}{n_i}
$$
$\Delta E = eV$,所以PN的内建电势差大小为
$$
V_{bi}=\frac{kT}{e}\ln(\frac{N_aN_d}{n_i^2})
$$
外加电势
在已有的内建电势基础上,如果在PN结两端增加一个电压值会导致不同的行为
如果将正极与n区连接(反偏),那么外加电场与内建电场的方向相同,这导致扩散运动更加受限,因此PN结内几乎没有电荷的流动,耗尽层的厚度增大
如果将正极与p区连接(正偏),那么外加电场与内建电场的方向相反,减弱了内建电场的阻碍作用,使得扩散运动加剧,因此有电荷流动的区域更多了,耗尽层的厚度减小
电流
|
漂移电流 |
扩散电流 |
| 成因(驱动力) |
外电场或内建电场 |
浓度梯度 |
| 物理本质 |
受力定向移动 |
随机运动的统计结果 |
| 方向 |
电子p→n |
电子n→p |
| 典型场景 |
反向偏压下的二极管电流 |
正向偏压下的二极管电流 |
| 与欧姆定律关系 |
遵循欧姆定律 |
不遵循欧姆定律 |
漂移电流(与外加电场关系密切):
$$
J_{drift}=en\mu_nE+ep\mu_pE
$$
其中$\mu_n,\mu_p$为电子/空穴的迁移率
扩散电流(与PN结属性相关):(电子带负电正,负号抵消,空穴需要带负号)
$$
J_{diff}=eD_n\frac{dn}{dx}-eD_p\frac{dp}{dx}
$$
其中$D_n,D_p$为电子/空穴的扩散系数,$\frac{dn}{dx}/\frac{dp}{dx}$代表浓度梯度,$D$常用爱因斯坦关系转换$D/\mu = kT$
推广到三维情况有
$$
J=e n \mu_n \mathrm{E}+e p \mu_p \mathrm{E}+e D_n \nabla n-e D_p \nabla p
$$
想象一个山坡上有两种小球:
漂移:
往右边吹一阵风(电场向右),
红球(正电)顺风滚下去,蓝球(负电)逆风滚上去
但电流定义按正电走的方向——所以红、蓝都对电流“有贡献向右”
扩散:
现在没风,只是左边的球多,右边的球少
蓝红都往右扩散(粒子运动相同),
但红球带正电、蓝球带负电——一个推电流向右,一个推电流向左(负号的产生)
正向偏置下:外加的正向电压会削弱内建电场,这使得多数载流子的扩散变得更加容易,扩散电流急剧增加,并成为总电流的主要部分;漂移电流基本保持不变(因为它取决于少数载流子的数量),PN结的电流主要是扩散电流
反向偏置:外加的反向电压会增强内建电场,这极大地阻碍了多数载流子的扩散,使得扩散电流变得微不足道,电流主要由少数载流子在增强的电场下的漂移运动构成。PN结的电流主要是漂移电流,但这个电流非常小,也被称为反向饱和电流$I_0$
光电二极管
光电二极管原理
光电二极管是一种特殊设计的PN结,其核心功能是利用PN结的光电效应将光信号转换为电信号
为了有效地接收入射光线,光电二极管将其PN结的表面积设计得相对较大,电极则相对较小,此外,PN结的深度非常浅,通常小于1微米
当光电二极管暴露在光线下且光子能量 $h\nu>E_g$ 时,PN结中的价带电子会被激发到导带,产生电子–空穴对
如果电子–空穴对出现在耗尽层或靠近耗尽层的区域,就会被内建电场(或外加反向偏置电场)迅速分离,电子拉向n区,空穴拉向p区,这些分离的载流子流向外电路,就形成了光电流$I_{ph}$
一般情况下,光电流与入射光强成正比:
$$
I_{ph} = e\eta\frac{P_{opt}}{h\nu}
$$
光电流的方向与二极管正向电流相反,所以二极管方程修改为:
$$
I = I_0(e^{qV/kT}-1)-I_{ph}
$$
绝大多数情况下光电二极管工作在反向偏置状态下,这是因为反偏电压增大可以使耗尽区变宽,载流子能在耗尽区内被电场迅速抽取,减少复合、提高量子效率,此时光电流更大,响应更灵敏
$$
I_{out} = I_{dark}+I_{ph}
$$
反偏电压大概在10~50V这个区间
缺点:反偏电压增大也会导致暗电流增大,噪声增多
PIN光电二极管
PIN光电二极管是一种结构较传统PN光电二极管有所改进的光电探测器
为了克服PN结的局限,PIN二极管在PN结之间增加了一个几乎未掺杂的本征区(I区),电阻率高、载流子浓度低
相比普通的PN结,I层的存在大大加宽了耗尽区的宽度,从而显著降低了结电容,减小了RC时间常数
主要特性:
- 响应速度快
- 量子效率高/响应度高:I层为入射光子提供了更大的吸收体积
- 暗电流低:I层载流子浓度极低
光电流的放大
在弱光场景(如激光测距、光通信)中,入射光功率只有几微瓦,对应光电流仅几微安,甚至达到 pA 级
若直接串联电阻测电压,需要非常大的电阻值,会导致:
跨阻放大器TIA是光电探测器最常见的读出电路
TIA电路是一个反相放大器,光电二极管接在运放的反相输入端
简单的反向放大器电路示意图:
基本结构:
运放通过反馈电阻$R_f$维持该节点电压近似为0V(虚地)
$$
V_{out} = -I_{pd}\cdot R_F
$$
输出电压取决于反馈电阻,在设计时需考虑两个因素:最大反向电流$I_{ph}$(max) 以及所需输出电压范围$V_{out}$(max) 和 $V_{out}$(min)
运放反相端的总电容=节电容$C_j$+封装电容$C_{\text{pkg}}$+电缆电容$C_{\text{cable}}$+运放输入电容$C_{\text{amp,in}}$
$$
C_t=C_j+C_{\mathrm{pkg}}+C_{\text {cable }}+C_{\text {amp,in }}
$$
反馈电阻与总电容构成一阶低通滤波器,其截止频率(反馈极点)为
$$
f_F=\frac{1}{2\pi R_FC_t}
$$
反馈电容$C_f$用来补偿由于输入总电容$C_t$引起的相位滞后,防止运放高频不稳定
一般$C_f = C_t/k$,$k$取3-10,根据运放大小决定
- k 越大 → 带宽更高,但稳定裕度更小
- k 越小 → 更稳定,但带宽下降
APD雪崩光电二极管
PIN光电二极管已经解决了传统PN光电二极管的问题(耗尽层窄、响应慢),具备高速和高量子效率,但PIN没有内部增益,产生的光电流直接取决于光功率。在弱光检测(比如远距离光纤通信)中,信号电流可能非常微弱,需要额外的电子放大器,噪声就会成为限制
APD在PIN的基础上,通过一个巧妙的内部放大机制,能够在探测到微弱光信号时产生远大于PIN二极管的输出电流
典型的结构是 P⁺-π-P-N⁺ 结构(有时也写作 P⁺-I-P-N⁺),常用于长波长(如光通信中1.3μm和1.55μm)的 InGaAs APD
- P+层:高掺杂的P型层,光从这一面入射
- π层:低掺杂或本征的P型层,光子吸收区,电场较低,防止提前击穿,但又足够强让载流子快速漂移
- P层:中等掺杂的P型层,倍增区,在高的反向偏压下,会形成一个非常强大的电场,当载流子进入此区时会被加速到足够高的能量,引发碰撞电离
- N+层:高掺杂的N型衬底层,提供良好的欧姆接触和机械支撑
雪崩效应的核心是碰撞电离:
- 当一个能量足够的光子入射到APD并被π吸收区吸收时,会产生一个电子-空穴对;
- 在吸收区的中等电场作用下,电子和空穴被迅速分离开,电子向N⁺区移动,而空穴向P⁺区移动;
- 电子向N⁺区漂移的过程中,会进入电场强度极高的P倍增区(在某些设计中,也可能是空穴进入倍增区),电子被极大地加速,获得了非常高的动能
- 高速电子与晶格原子碰撞后将价带电子撞击出来,产生新的电子-空穴对。新产生的立刻被强电场加速,继续撞击产生二次电离,发生连锁反应,因此称为雪崩倍增效应
1
| 光子 → 产生电子-空穴对 → 高场加速 → 撞击电离 → 级联放大
|
结果是光生电流被指数级放大,这个倍增过程可以用一个倍增因子$M$来表征,$M=I_M/I_0$
理论上:
$$
M(V)=\frac{1}{1-(V/V_{br})^n}
$$
$V_{br}$为击穿电压(大概在100-200V区间),$n$为经验系数(2~6,取决于材料与结构),当$V\rightarrow V_{br}$时$M$会上升到无穷大,完全击穿
增益带来的同时还有噪声(乘法噪声):
$$
F(M)=k\cdot M+(1-k)(2-\frac{1}{M})
$$
$k$为电子与空穴的电离系数比(硅大概0.1,InGaAs大概0.2-0.5)
总噪声电流:
$$
I_{noise}=\sqrt{2q(I_{dark}+I_{ph})M^{2}F(M)\Delta f+4kT\Delta f/R_{L}}
$$
扫描不同偏压下的表现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| import numpy as np import matplotlib.pyplot as plt
def M(V): return 1 / (1 - (V / V_br) ** n)
def F(M, k): return k * M + (1 - k) * (2 - 1 / M)
def total_noise(I_dark, I_ph, M, F, Delta_f, RL): term1 = 2 * q * (I_dark+I_ph) * (M ** 2) * F * Delta_f term2 = 4 * k_B * T * Delta_f / RL return np.sqrt(term1 + term2)
q = 1.6e-19 k_B = 1.38e-23 T = 300
R_lambda = 0.6 V_br = 150 n = 3 k = 0.3 I_dark = 1e-9 RL = 1e3 Delta_f = 10e6 P_opt = 10e-6
V = np.linspace(100, 149, 200)
M_values = M(V) F_values = F(M_values, k) I_ph = R_lambda * P_opt
I_noise = total_noise(I_dark, I_ph, M_values, F_values, Delta_f, RL) I_signal = I_ph*M_values SNR = I_signal/I_noise
max_index = np.argmax(SNR) max_V = V[max_index] max_SNR_dB = 20 * np.log10(SNR[max_index])
plt.figure(figsize=(8,8)) plt.subplot(3,1,1) plt.plot(V, M_values) plt.ylabel('Multiplication Gain M') plt.grid(True)
plt.subplot(3,1,2) plt.plot(V, F_values) plt.ylabel('Excess Noise Factor') plt.grid(True)
plt.subplot(3,1,3) plt.plot(V, 20*np.log10(SNR)) plt.scatter(max_V, max_SNR_dB, color='red', zorder=5) plt.annotate(f'Max: {max_SNR_dB:.2f} dB\nat {max_V:.1f} V', xy=(max_V, max_SNR_dB), xytext=(max_V, max_SNR_dB-2), fontsize=10) plt.xlabel('Bias Voltage (V)') plt.ylabel('SNR (dB)') plt.grid(True)
plt.tight_layout() plt.show()
|
可以看到$M$随$V$增加上升,在接近击穿电压时指数式增长,$F$的趋势和$M$差不多,SNR先上升(信号增强主导)后下降(噪声主导)
$k$减小则$F(M)$的上升趋势变慢,使得SNR的极值向右移动,$M$不受$k$影响,以下为$k=0.1$
同理,$n$增大$M$上升趋势变慢,导致$F(M)$上升趋势也降低,SNR的极值向右移动
通常把$M$设在5–20,超过这个区间,$F(M)$与暗电流增长常常抵消进一步放大带来的收益
对比PIN和APD
| 特性 |
PIN 光电二极管 |
APD 雪崩光电二极管 |
| 内部增益 |
无 |
有(10~1000倍) |
| 工作偏压 |
低(<5V) |
高(几十~几百伏) |
| 灵敏度 |
中等 |
高 |
| 响应速度 |
高速 |
稍低于PIN(雪崩倍增需时间) |
| 噪声 |
低 |
高(乘法噪声) |
| 应用 |
一般光检测、光通信、高速通信 |
长距离光纤通信,高灵敏度探测,激光雷达 |
对于PIN
$$
SNR_{PIN} = \frac{R\cdot P}{\sqrt{2q(R\cdot P+I_d)\Delta f+\frac{4k_BT\Delta f}{R_L}}}
$$
但对于APD,噪声与信号电流都放大了
$$
SNR_{APD}=\frac{M\cdot R\cdot P}{\sqrt{2q(R\cdot P+I_d)M^2F(M)\Delta f+\frac{4k_BT\Delta f}{R_L}}}
$$
在低光条件下,$P$非常小,导致光电流也非常微弱
| 条件 |
主导噪声 |
谁更优? |
原因 |
| 低光功率 |
热噪声 |
APD |
内部增益$M$将信号抬升至热噪声基底之上 |
| 高光功率 |
散粒噪声 |
PIN |
不再需要增益,APD的过剩噪声$F(M)$劣化了SNR |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| import numpy as np import matplotlib.pyplot as plt
q = 1.6e-19 k_B = 1.38e-23 h = 6.626e-34 c = 3e8 T = 300
BW = 1e6 R_L = 50
wavelength = 850e-9 eta = 0.8 Id_pin = 5e-12 M = 15 Id_apd = 1e-9 k = 0.1 F = k*M+(1-k)*(2-1/M)
R = (eta * q * wavelength) / (h * c)
P_in = np.logspace(-6, -2, 200)
I_noise_thermal = (4 * k_B * T * BW) / R_L
I_sig_pin = R * P_in I_noise_pin = np.sqrt(2 * q * (R * P_in + Id_pin) * BW + I_noise_thermal) snr_pin = I_sig_pin / I_noise_pin
I_sig_apd = M * R * P_in noise_var_apd =2 * q * (R * P_in + Id_apd) * (M**2) * F * BW + I_noise_thermal I_noise_apd = np.sqrt(noise_var_apd) snr_apd = I_sig_apd / I_noise_apd
plt.style.use('seaborn-v0_8-whitegrid') fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(P_in * 1e6, 20 * np.log10(snr_pin), label='PIN', color='dodgerblue', linewidth=2.5) ax.plot(P_in * 1e6, 20 * np.log10(snr_apd), label=f'APD(M={M}, F={F:.1f})', color='crimson', linewidth=2.5)
ax.set_xscale('log') ax.set_title('PIN vs. APD SNR Comparison', fontsize=16) ax.set_xlabel('Input Optical Power (µW)', fontsize=12) ax.set_ylabel('SNR [dB]', fontsize=12) ax.legend(fontsize=11) ax.grid(True, which="both", ls="--")
idx = np.argwhere(np.diff(np.sign(snr_pin - snr_apd))).flatten() if idx.size > 0: crossover_power_uW = P_in[idx[0]] * 1e6 crossover_snr_db = 20 * np.log10(snr_pin[idx[0]]) ax.plot(crossover_power_uW, crossover_snr_db, 'o', color='darkviolet', markersize=8) ax.annotate(f'Crossover Point\n~{crossover_power_uW:.2f} µW', xy=(crossover_power_uW, crossover_snr_db), xytext=(crossover_power_uW, crossover_snr_db - 15), arrowprops=dict(facecolor='black', shrink=0.05, width=1, headwidth=8), ha='center', va='top', fontsize=11, bbox=dict(boxstyle='round,pad=0.3', fc='yellow', alpha=0.6)) plt.show()
|
符合预期
CCD与CMOS
CCD
CCD全称是Charge Coupled Device(电荷耦合器件),是一种将光信号转换为电信号的半导体成像器件
器件结构主要有:
- 像素:每像素有一个感光区和一个潜在电势阱(由栅极电压形成)
- 栅极:通常每像素用2或3个栅极做时钟控制,通过交替电压把电荷转移
- 垂直移位通道:把整列像素的电荷逐行推到最底下一行的水平传输寄存器
- 横向寄存器:把底行的电荷逐像素推到输出结构
- 输出放大器:把单个像素电荷转换成电压,再经模数转换器(ADC)变为数字值
工作可以分为四个主要过程:
光吸收与电子生成:光照射到CCD表面后,光敏区内的硅吸收光子,产生电子–空穴对,电子收集到像素的势阱
电荷积累(积分):在曝光时间内,像素积累电荷,直到读取或达到饱和;曝光结束后,每个像素中储存的电荷量代表了该像素的亮度
电荷转移(耦合):施加时钟脉冲到栅极,按顺序把每列电荷推到横向寄存器,再逐像素推向输出放大器
逐像素移送保证了极高的一致性和低噪声,但代价是读出速度受限
信号读出与放大:每个像素在输出端把电荷转换为电压,经过放大器与 ADC 得到数字值,最终形成图像数据
根据电荷传输方式的不同,CCD可分为几种:
全帧转移(Full-Frame CCD):整个阵列都是光敏区,需要机械快门控制曝光
转移期间如果没有机械快门来阻挡入射光,会继续产生电子,导致拖影,损坏图像
优点:感光效率高,噪声最低,结构简单;
缺点:读出速度较慢,不能用于视频或快速拍摄
帧转移(Frame-Transfer CCD):传感器分为两个相等的部分:有源成像阵列和遮光存储阵列,曝光后整帧电荷被快速转移到存储区
在读取存储区域时,光敏区可以立即开始集成下一帧,从而实现比全帧CCD更高的帧速率
优点:无需机械快门,避免拖影,曝光和读出实现并行;
缺点:存储区占据芯片面积,感光面积减少,成本与功耗高
行转移(Interline CCD):每列像素旁有独立存储区,曝光结束后,电子迅速转移到相邻的存储区。存储区被遮光,因此可在下一次曝光时同时读出上一帧
这种方式可以实现电子快门,无需机械部件
优点:快速曝光控制,无拖影,读出速度快,支持视频帧率;
缺点:光敏区被存储区挤占,填充因子降低(感光面积减少),需要微透镜引导光线集中到感光区

微透镜的作用:当光线射入时,微透镜会把原本可能落在“非感光区”的光线重新聚焦到有效感光部分,有效光捕获率可以从 30–40% 提升到接近 90%
制作方式包括光刻+热重流,让光刻胶在加热下自然形成半球形,现代技术中也会用离子束刻蚀或纳米压印方法形成更精确的形状;透镜材质需具备高透光率、低吸收率,并能耐高温工艺
可以分为线阵CCD和面阵CCD
在光谱CCD中,想要的是光的能量分布,也就是不同波长的强度,就意味着它需要一个维度记录波长
在典型的光谱仪中,光线从狭缝(slit)进入,经过光栅或棱镜被色散开,按照波长展开成一条光谱
CCD上看到的不是整幅图像,而是一条光谱带,横轴是波长,纵轴(对应狭缝高度)几乎是恒定的,只包含那个点的少量空间信息
CMOS
与CCD一样,目标都是把光子变成电子信号
工作原理:
光电转换:光线经顶部微透镜和滤色片聚焦到光电二极管(与CCD类似),每个像素的光敏区吸收光子
电荷积累:电子在电荷阱中累积一段曝光时间
信号读出:与CCD最大的不同,每个像素不仅有光敏区,还有读出电路,先读出再转移
像素电路通常由3~5个晶体管组成,称为3T/4T像素结构
电荷被转化为电压信号,由像素内部的放大晶体管放大
行列扫描电路按顺序选则每行像素,逐列读出,每个像素信号都在片上完成放大与数字化
信号处理:芯片上可以直接集成图像信号处理(ISP)模块,执行曝光控制、去噪、白平衡、Gamma校正等操作
常见像素电路的结构有两种:
正照式CMOS(FSI)
早期结构,如刚刚所述,光线要穿过:微透镜;彩色滤光片;经过金属布线层(信号与供电线路);抵达光电二极管
问题在于金属布线遮光严重
背照式CMOS(BSI)
- 先在硅片正面完成所有电路制造(包括晶体管、金属布线等);
- 将晶圆与支撑基片粘合(防止在加工时破裂);
- 从背面化学机械抛光(CMP)或刻蚀,薄化硅基底,厚度降至几微米;
- 在背面重新沉积抗反射层、微透镜和彩色滤光片
光线从背面直接照入硅基底,先抵达光电二极管,再往下是电路层
光线不再被金属层遮挡,使得光子利用率提升50%以上
堆栈式CMOS(Stacked)
堆叠式传感器将图像传感器和信号处理电路分离成两层晶圆
两层通过TSV(Through-Silicon Via, 硅通孔)实现垂直连接
使用堆栈式技术,人们研究出了一种新的拜耳排列RGBW
其中,RGB对应常见的红绿蓝,W对应白,对亮度感光,这样传感器的低光感光能力就大大提升
制造 BSI 和 Stacked 传感器的工艺非常苛刻:
- 硅片要薄到几微米,任何应力不均都会导致晶圆翘曲或裂纹;
- TSV 互连要求纳米级精度,否则信号延迟和噪声都会显著上升;
- 微透镜、滤光片、背照层的排列需与光路完全匹配,否则边缘像素会产生角度光偏差
对比
| 对比项 |
CCD |
CMOS |
| 读出方式 |
电荷逐级转移(串行) |
各像素独立读出(并行) |
| 放大位置 |
芯片边缘的单一放大器 |
每个像素内置放大器 |
| 功耗 |
高 |
低 |
| 速度 |
慢 |
快 |
| 噪声 |
读出噪声低且均一 |
早期略高且有FPN 现代sCMOS降到接近CCD水平 |
| 成本 |
专用工艺,通常成本较高 |
易量产,成本低且易集成 |
| 集成度 |
仅感光部分,片上功能少 |
可集成ADC、ISP、控制电路与片上处理 |
| 主要噪声来源 |
光子噪声、暗电流 |
读出噪声、光子噪声 暗电流、FPN(固定模式噪声) |
| 优点 |
极高的图像质量和线性响应 低读噪与高均一性 适合科学级成像 长曝光/低光表现优秀 |
高速、低延时、低成本 片上集成功能多 可电子快门、高速连拍 更适合移动设备 |
| 缺点 |
串行读出限制速度 工艺与成本要求高 电源与驱动时序要求严格 |
电路复杂,带来FPN/一致性挑战 噪声影响大 |
图像传感器噪声模型
图像传感器的总噪声主要由四个部分构成:光子噪声、暗电流噪声、读出噪声和固定模式噪声
把所有独立噪声看成方差相加
$$
\sigma_{\text{tot}}^2 = \sigma_{\text{shot}}^2 + \sigma_{\text{dark}}^2 + \sigma_{\text{read}}^2 + \sigma_{\text{FPN}}^2
$$
光子(散粒)噪声
光是量子化的,即使光强恒定,单位时间内入射光子的数量也有统计波动,遵循泊松分布
在一个采样时间$\Delta t$内,平均光功率为$P$与平均光子流的关系为$N = P\lambda/hc$,采样时间内平均到达的光子数$N_p=\lambda _N = N\cdot \Delta t$
$n$表示在一次具体采样中,真正到达探测器的光子个数,则泊松分布表示为
$$
P(n) = \frac{(\lambda_N)^n e^{-\lambda_N}}{n!}
$$
泊松分布的一个关键特性是方差等于均值,则光子数的标准差为
$$
\sigma_{\text{shot}}^2=N_p
$$
信噪比SNR为
$$
SNR_{ph} = \frac{N_p}{\sqrt{N_p}} = \sqrt{N_p}
$$
光子噪声是信号相关噪声:信号越强,绝对噪声增大,但信噪比反而越好
光子噪声无法通过电路消除,只能通过增加光通量或曝光时间提升SNR,这也是长时间曝光或多张照片堆栈可以得到更纯净图像的根本原因
暗电流
当没有光照时,热激发会在光电二极管中产生电子,暗电流随温度强烈变化,近似指数规律:
$$
I_{d} \propto T^3 e^{-\frac{E_g}{kT}}
$$
温度每升高6-10°C,暗电流大约翻一倍
暗电流产生的电子数同样遵循泊松分布,因此也属于散粒噪声($I_d$的单位为$e⁻/s$)
$$
\sigma_{dark}^2 = N_d = I_d\cdot t
$$
为什么在这里分开来讲光子噪声和暗电流噪声,因为在光电二极管理论分析中通常只关心电流端噪声,所以直接把两者合并成一个“散粒噪声项”,但在图像传感器分析中更关注成像效果、温度特性和后处理,所以才会人为拆开讲解
在完全黑场(遮光)下拍摄时,图像并不全黑,会出现整体偏亮或不均匀的“背景发光”
可通过冷却或像素级暗场校正减弱
读出噪声
读出噪声泛指从像素电荷转换为数字信号过程中引入的所有电子学噪声,是一个与信号强度无关的固定附加噪声,可以看作是传感器的底噪
主要包含以下几种噪声机制:
- 热噪声(Thermal noise):电阻产生的随机电压,在带宽内功率均匀分布
- 1/f噪声:低频漂移噪声,其功率谱密度与频率成反比,在低频时非常显著
- kTC(复位)噪声:对像素电容进行复位操作时引入的电荷不确定性,通常用相关双采样去除
$$
\sigma_{read}^2 = \sigma_{thermal}^2 +\sigma^2_{1/f} + \sigma_{kTC}^2 + \sigma_{ADC}^2
$$
其中每一项都近似高斯分布(Gaussian),因此读出噪声总体服从正态分布
在极弱光、短曝光或高增益(ISO)的情况下最为显著
在图像的极暗区域或阴影部分表现为随机的、细密的“盐粒状”噪点
降噪手段包括:
- 相关双采样CDS(在像素复位后和曝光后各读一次,两次相减,去除kTC噪声)
- 避免过高的数字增益(ISO)
- 多帧平均
固定模式噪声FPN
FPN 不是随机噪声,而是由制造工艺的微小差异导致的空间不均匀性,不同像素的响应特性(如暗电流、增益)存在固定的微小差异,在暗场或均匀照明下仍存在
分为两类:
- 偏置型DSNU:即使在零照度下,不同像素的输出(偏置)也不同
- 增益型PRNU:不同像素对光的响应灵敏度(增益)不同
对于第 $i$ 个像素信号输出表示为:
$$
S_i=g_i\cdot N_p+o_i
$$
其中$g_i$为像素的增益,$o_i$为像素偏置,整个图像的FPN方差可表示为:
$$
\sigma_{F P N}^{2}=\sigma_{g}^{2} N_{p}^{2}+\sigma_{o}^{2}
$$
偏置误差主导暗场噪声,而增益误差主导亮场噪声
由于其固定特性,在多张照片的相同位置会重复出现,表现为条纹、带状噪声
校正方式:
- 暗场帧减法:有效校正Offset FPN
- 平场校正:通过拍摄均匀光源(平场)来测量并校正Gain FPN
现代传感器通常具有片上校正电路,在输出前就抑制 FPN
总噪声
$$
\sigma_{total}^2 = \sigma_{ph}^2 + \sigma_{dark}^2 + \sigma_{read}^2 + \sigma_{FPN}^2\\
\text{SNR} = \frac{N_p}{\sqrt{\sigma_{total}^2}}
$$
| 噪声类型 |
统计本质 |
主导条件 |
图像表现 |
改善策略 |
| 光子噪声 |
泊松 |
光照充足,信号强 |
颗粒感,随亮度线性变强 |
增加总进光量(长曝光、大光圈) |
| 暗电流 |
泊松 |
长曝光/高温/弱光 |
暗区随机噪点、热像素 |
传感器降温,缩短曝光,暗帧校正 |
| 读出噪声 |
近高斯 |
低照度/短曝光/高速读出 |
暗场“雪花底噪”,每帧不同 |
多次采样平均 |
| 固定模式噪声 |
非随机(空间固定) |
所有情况都存在 |
固定条纹,帧间长得一样 |
硬件片上校正、拍平场/暗场校准 |
代码语言
1
| final_signal = gain_map*(N_ph + N_dark) + N_read
|
N_ph + N_dark: 光电子和暗电子在像素的势阱中被共同收集
gain_map * (...): 收集到的总电荷经过每个像素独特的增益放大
... + N_read: 在所有信号被读出放大器处理时,最终叠加上读出噪声
交互代码
参数设计:
- 光子流量数 ≈ 10 ~ 10000 e⁻/s/piexl
- 曝光时间 ≈ 0.01 ~ 1s
- 暗电流率 ≈ 1 ~ 30 e⁻/s/piexl
- 读出噪声 ≈ 1 ~ 30 e⁻
- FPN(PRNU) ≈ 0.01 ~ 0.05(1% ~ 5%)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| import numpy as np import matplotlib.pyplot as plt from ipywidgets import interact, FloatSlider, IntSlider, Layout np.random.seed(42)
def simulate_cmos( photon_flux_rate, exposure_time, dark_current_rate, prnu_std, dsnu_std, read_noise_std ): """ 模拟CMOS传感器成像过程,并更精确地建模各种噪声源。 单位说明: - 光子/暗电流相关的都是速率 (e-/pixel/s) - 噪声都以电子数 (e-) 为单位 """ rows, cols = 128, 128 x = np.linspace(-1, 1, cols) y = np.linspace(-1, 1, rows) X, Y = np.meshgrid(x, y) photon_flux_map = photon_flux_rate * np.exp(-4 * (X**2 + Y**2))
idea_photons = photon_flux_map * exposure_time dark_current_map = np.random.normal(dark_current_rate, dsnu_std, (rows, cols)) dark_current_map[dark_current_map < 0] = 0 dark_electrons = dark_current_map * exposure_time
N_ph = np.random.poisson(idea_photons) N_dark = np.random.poisson(dark_electrons) N_read = np.random.normal(0, read_noise_std, (rows, cols)) gain_map = np.random.normal(1.0, prnu_std, (rows, cols))
final_signal = gain_map*(N_ph + N_dark) + N_read
fig, axs = plt.subplots(1, 2, figsize=(12, 5)) im1 = axs[0].imshow(idea_photons, cmap='gray') axs[0].set_title("Ideal Image (Photon Signal Only)") fig.colorbar(im1, ax=axs[0], shrink=0.8)
im2 = axs[1].imshow(final_signal, cmap='gray') axs[1].set_title("Image with All Noise Sources") fig.colorbar(im2, ax=axs[1], shrink=0.8)
for ax in axs: ax.axis('off') plt.tight_layout() plt.show()
signal_mean = np.mean(idea_photons) noise_std = np.std(final_signal - idea_photons) SNR = 20 * np.log10(signal_mean / noise_std) print(f"平均信噪比 ≈ {SNR:.2f} dB")
style = {'description_width': 'initial'} layout = Layout(width='80%')
interact( simulate_cmos, photon_flux_rate=IntSlider(value=10000, min=100, max=20000, step=100, description='光子通量率 (ph/s)', style=style, layout=layout), exposure_time=FloatSlider(value=0.1, min=0.001, max=1.0, step=0.005, description='曝光时间 (s)', style=style, layout=layout), dark_current_rate=FloatSlider(value=1, min=0.1, max=30, step=0.1, description='暗电流率 (e-/s)', style=style, layout=layout), prnu_std=FloatSlider(value=0.01, min=0.0, max=0.05, step=0.001, description='PRNU 标准差', style=style, layout=layout, readout_format='.3f'), dsnu_std=FloatSlider(value=0.5, min=0.0, max=10, step=0.1, description='DSNU 标准差 (e-/s)', style=style, layout=layout), read_noise_std=FloatSlider(value=2, min=1, max=30, step=1, description='读出噪声 (e-)', style=style, layout=layout) );
|
光电二极管的性能指标
光电转换特性
响应度$R$:在特定波长的入射光照射下,光电二极管产生的光电流与入射光功率之比,单位A/W
$$
R = \frac{I_{ph}}{P} [A/W]
$$
衡量光电二极管对光敏感的核心指标,表示光电转换的宏观效率,随波长变化,通常会有一个峰值响应波长
$$
R(\lambda) = \eta \frac{e}{h\nu}=\eta\frac{e\lambda}{hc}
$$
可以看出响应度随波长线性增大,但这并不是没有限制的,随着波长增大,当超过材料带隙后($\lambda > \lambda_c$(截止波长)),响应度急剧下降,但边缘并不陡峭,存在带尾态(Urbach tail)
$$
\lambda _c = \frac{hc}{E_g}
$$
因为$E_g$的单位为eV,所以计算截止波长可以直接$1240/Eg$
| 材料 |
带隙Eg(eV) |
截止波长(nm) |
常见用途 |
| Si |
1.12 |
1100 |
可见光~近红外 |
| Ge |
0.67 |
1850 |
红外探测 |
| InGaAs |
0.75 (可调) |
1650 |
光通信、近红外成像 |
| HgCdTe |
0.1~0.3 (可调) |
4000~12000 |
中远红外探测、热成像 |
温度升高 → 带隙变窄 → 截止波长$\lambda_c$“红移”
量子效率$\eta$:产生的光电子-空穴对数量与入射的光子数量之比,无单位
表示光电转换的微观效率,越高表明器件内部的光电转换机制越有效,取决于波长和材料,典型硅光电二极管的$\eta \sim 70%- 90%$
是最典型的计算指标,可以从响应度$R$和波长计算得出
$$
\eta = \frac{R\cdot h c}{e\lambda}\approx \frac{1240\cdot R}{\lambda(nm)} \times 100\%
$$
**1240的推导**:
$h$:普朗克常数 ($6.62607015 × 10^{-34} J\cdot s$)
$e$:元电荷 ($1.6\times 10^{-19}C$)
$\lambda$:以nm为单位,所以上下项均$\times 10^9$
$$
\frac{hc}{e} \times 10^9= \frac{6.62607015\cdot10^{-34}\times 3\cdot10^{8}}{1.6\cdot10^{-19}}\times 10^9 \approx 1240
$$
光谱响应范围:光电二极管能够有效探测的光波长范围,决定了该二极管适用于哪个波段的应用
噪声特性
暗电流$I_d$:在无光照时,给光电二极管施加反向偏压时流过的电流,主要由热激发或缺陷引起
是光电二极管主要的内部噪声源,暗电流越小,探测微弱信号的能力越强
对温度非常敏感,温度每升高6-10°C,暗电流大约增加一倍
暗电流噪声在低温下可忽略,但在红外探测器中不可忽视
噪声电流的来源:
主要考虑散粒噪声和热噪声,噪声与测量带宽的平方根成正比
散粒噪声(Shot Noise):源于载流子通过PN结的随机性,是一种基本的量子噪声,它与流经二极管的总电流有关
$$
i^2_{shot} = 2q(I_{ph}+I_{dark})\Delta f
$$
**热噪声**(Thermal noise):由探测器本身和等效到输入端电阻$R_L$中电荷载流子的热运动引起
$$
i_{th}^2 = \frac{4kT}{R_L}\Delta f
$$
如果用的是反馈电阻,记得这里改为$R_f$
总噪声电流(均方根值)
$$
I_{noise} = \sqrt{i_{shot}^2 +i_{th}^2 }=\sqrt{2q(I_{ph}+I_d)\Delta f+\frac{4kT}{R_{L}}\Delta f}
$$
在极低光功率下,$I_{ph}$很小,噪声主要由热噪声决定
随着光功率和光电流$I_{ph}$的增大,散粒噪声逐渐成为主导因素
光电流的数量级在某个界限前噪声主要由热噪声决定;当超过界限后,散粒噪声占据主导地位
参数:$R_L=1k\Omega,T=300K,I_{dark}=1nA,\Delta f=1MHz$
这里大概是$10^{-5}$量级,真实$R_L$往往等效成很大的$R_f$(kΩ→MΩ量级),分界电流会更低,这也是为何弱光系统通常只考虑散粒噪声
噪声等效功率$NEP$:单位带宽下,当输出信号的信噪比SNR为1时,所需入射到探测器上的光功率,是衡量探测器灵敏度的核心指标
$$
NEP =\frac{I_{noise}/\sqrt {\Delta f}}{R}[W/\sqrt{Hz}]
$$
$NEP$值越小,说明探测器探测微弱光信号的能力越强,性能越好
探测率$D^*$:消除探测器面积对$NEP$的影响,便于比较不同尺寸探测器的性能而引入的归一化指标
$$
D^* = \frac{\sqrt{A}}{NEP}[cm\cdot \sqrt {Hz}/W]
$$
$A$是探测器的有效感光面积,$D^*$越大,探测弱信号的能力越强
响应速度特性
响应速度决定了探测器能多快地响应光信号的变化,是高速应用(如光通信、激光雷达)的关键参数
光电二极管可简化为一个理想电流源,并联一个结电容$C_j$和一个并联电阻$R_{sh}$
结电容$C_j$:光电二极管PN结的电容,与负载电阻$R_L$构成了RC电路,决定了响应速度的物理极限,结电容越小,响应速度越快。施加反向偏压可以增加PN结耗尽区的宽度,从而有效降低结电容,提高响应速度
简单$R_L$读出在带宽与灵敏度间强牵制
在实际电路中,工程上多用跨阻放大器TIA读出,等效电阻大小为$R_f$(反馈电阻),且输出为电压方便后级处理,并且$R_f$一般会同时并联一个$C_f$用于补偿
在频域中,系统相当于一个一阶低通滤波器
$$
H(f)=\frac{1}{\sqrt{1+(2\pi fR_fC_t)^2}}
$$
带宽(BW)$\Delta f$:指探测器的响应度下降到其最大值的$\sqrt 2$(约70.7%,即-3dB)时的调制频率
光电二极管的RC截止频率可近似代表带宽,但真实带宽还受漂移时间等因素限制,物理带宽比截止频率低
$$
\Delta f=\frac{1}{2\pi R_{f}C_{t}}
$$
小电容+小反馈电阻 → 更高带宽,带宽越大,探测器能够处理的信号频率就越高
响应时间$\tau_r $:常指上升时间,即输出信号从光脉冲输入后幅度的10%上升到90%所需的时间,直观地描述了器件对光强变化的反应速度
带宽和上升时间之间有一个近似的换算关系,如果手册只给了其中一个,另一个可以通过计算估算
$$
\tau_r \approx \frac{0.35}{\Delta f} \qquad \Delta f\approx \frac{0.35}{\tau_r}
$$
### 信噪比SNR
信噪比是衡量输出信号质量的最终指标,它综合了信号强度和总噪声
$$
SNR = \frac{I_{ph}}{I_{noise}}
$$
**弱光区域**($RP_{opt}\ll I_{dark}$),光电流远小于暗电流,SNR与入射光功率成正比
$$
{SNR}\approx\frac{RP}{\sqrt{2qI_{dark}\Delta f}}\propto P
$$
**强光区域**($RP_{opt}\gg I_{dark}$),光电流远大于暗电流,成为总电流和散粒噪声的主要来源,SNR与入射光功率的平方根成正比
$$
{SNR}\approx\frac{RP}{\sqrt{2qRP\Delta f}}=\sqrt{\frac{RP}{2q\Delta f}}\propto \sqrt P
$$
与前一部分中讨论的光子噪声的SNR特性完全一致,因为光子噪声就是光电流散粒噪声的根本来源
转为对数形式时,因为一般计算时用的都是幅度比,所以
$$
\mathrm{dB} = 20\log_{10}SNR
$$
总结表格
| 性能指标 |
单位 |
值越..越好 |
简单描述 |
| 响应度 |
$A/W$ |
↑ |
光电转换的宏观效率 |
| 量子效率 |
无 |
↑ |
光电转换的微观效率 |
| 暗电流 |
$A$ |
↓ |
无光时的噪声 |
| 带宽 |
$Hz$ |
↑ |
能处理的信号最高频率范围 |
| 噪声等效功率 |
$W/\sqrt{Hz}$ |
↓ |
能探测到信号的最小光功率 |
| 比探测率 |
$cm\cdot \sqrt {Hz}/W$ |
↑ |
标准化的探测能力 |
| 材料 |
光谱范围 |
暗电流 |
速度 |
成本 |
特点与适用场景 |
| 硅 |
可见到近红外(350~1100nm) |
低(pA) |
高速(小面积ps,常规ns) |
低 |
成熟工艺,线性好,通用型 |
| 黑硅 |
可见到近红外(400~1200+nm) |
低到中等(pA-nA) |
中高速(ns) |
中等 |
具有更高的量子效率,适用于低光照 |
| 锗Ge |
近红外(800~1800nm) |
高(~2–200 mA/cm²) |
低速(ns-$\mu s$) |
低 |
光纤通信,需低温操作 |
| 砷化铟镓InGaAs |
近红外(900~1700nm) |
低(pA-nA) |
高速(ps) |
中等 |
光纤通信主力,LIDAR |
| 扩展型砷化铟镓 InGaAs |
近红外(1000~2600 nm) |
高($\mu A$) |
高速 |
高 |
光谱分析,需要热电制冷 |
| 砷化锑化铟InAsSb |
近红外至中红外 |
高($\mu A$-mA) |
中低速 |
高 |
高温工作能力,适合 MWIR应用(气体探测、光谱、热成像等) |
| 碲化镉汞MCT(HgCdTe) |
近红外至中/远红外 |
高(温度依赖强) |
中等到低速 |
非常高 |
最顶级的红外探测,通常需要制冷与复杂封装/校准 |
为什么红外通信与LiDAR常用InGaAs?
通信领域:1310nm与1550nm是光纤损耗最低的窗口
LiDAR领域:1550nm常被采用,因为人眼安全,同时能在雾、尘、烟环境中穿透力更好
硅的截止频率在~1100nm,无法满足需求
InGaAs(InₓGa₁₋ₓAs)是一种可调带隙半导体,靠调整In/Ga比例,可以调节吸收边从约900nm到 2600nm,非常灵活;
通常用于探测器的InGaAs带隙约为0.75 eV,使得它对波长范围900nm到1700nm的光具有高吸收效率,完美覆盖了光纤通信中最重要、损耗最低的几个波段
在1550nm仍有0.9A/W左右响应,且暗电流相对较小(肯定还是比硅大的),室温下可工作,系统成本低
性能计算
常见手册参数包括:受光面积、响应度(典型值)、光谱响应范围、暗电流(最大值)、结电容
以滨松光子的S2386-5K硅光电二极管为例
参数表如下:
| 参数名称 |
数据 |
| 受光面 |
$2.4 \times 2.4 mm$ |
| 光谱响应范围 |
$320\sim 1100nm$ |
| 最大灵敏度波长 |
$960 nm$ |
| 响应度(典型值) |
$0.6A/W$ |
| 暗电流(最大值) |
$5pA$ |
| 上升时间(典型值) |
$1.8 \mu s$ |
| 结电容(典型值) |
$730pF$ |
有效接收面$A = 2.4^2 = 5.76mm^2=0.0576cm^2$
量子效率:(960nm处)
$$
\eta = \frac{1240R}{\lambda}=1240\times 0.6/960 = 77.5\%
$$
利用Logistic模拟响应度随波长变化,类似,峰值略有差异,基本模拟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| import numpy as np from ipywidgets import interact, FloatLogSlider, FloatSlider
h = 6.626e-34 c = 3.0e8 q = 1.6e-19 k = 1.38e-23
def photodiode_analysis( A_mm2=5.76, lambda_peak_nm=960, R_peak=0.6, P_uW=10, lambda_nm=960, Rf=1e4, Cj0_pF=730, Vb=10, Id_pA=5, T=298 ): """ 一个比较真实的光电二极管性能分析模型 1. 响应度(R)不再是固定输入,而是基于峰值波长和峰值响应度计算得出。 2. 结电容(Cj)会根据反向偏压动态变化 3. 模拟TIA放大器读出,采用Rf """ lambda_min_nm = 320 lambda_cutoff_nm = 1100 Vbi = 0.7
A = A_mm2 * 1e-6 P = P_uW * 1e-6 Id = Id_pA * 1e-12 Cj0 = Cj0_pF * 1e-12
k0 = 5 k1 = k0 / (lambda_peak_nm - lambda_min_nm) k2 = k0 / (lambda_cutoff_nm - lambda_peak_nm) L1 = 1 / (1 + 5*np.exp(-k1 * (lambda_nm - lambda_min_nm))) L2 = 1 / (1 + 5*np.exp(k2 * (lambda_nm - lambda_cutoff_nm))) R = R_peak * L1 * L2
Cj = Cj0 / np.sqrt(1 + Vb / Vbi) Iph = R * P eta = (R * h * c) / (q * (lambda_nm * 1e-9)) BW = 1 / (2 * np.pi * Rf * Cj) tau_r = 0.35 / BW BW_str = f"{BW/1e6:.2f} MHz" if BW >= 1e6 else f"{BW/1e3:.2f} kHz"
ishot = np.sqrt(2 * q * (Iph + Id) * BW) itherm = np.sqrt(4 * k * T / Rf * BW) Inoise = np.sqrt(ishot**2 + itherm**2)
NEP = Inoise / (R * np.sqrt(BW)) D_star = np.sqrt(A * 1e4) / NEP
SNR = Iph / Inoise SNR_dB = 20 * np.log10(SNR) print("="*40) print(" 光电二极管性能分析") print("="*40) print("\n--- 输入与环境参数 ---") print(f"工作波长 λ = {lambda_nm:.0f} nm") print(f"光功率 P_in = {P_uW:.2f} µW") print(f"反馈电阻 R_f = {Rf/1e3:.2f} kΩ") print(f"反向偏压 V_b = {Vb:.2f} V") print(f"温度 T = {T:.1f} K")
print("\n--- 器件核心参数 (计算值) ---") print(f"光谱响应度 R = {R:.3f} A/W (@ {lambda_nm:.0f} nm)") print(f"量子效率 η = {eta*100:.1f}%") print(f"结电容 Cj = {Cj*1e12:.2f} pF (@ {Vb:.1f} V)")
print("\n--- 性能指标 ---") print(f"光电流 I_ph = {Iph*1e9:.3f} nA") print(f"带宽 BW = {BW_str}") print(f"上升时间 (10%-90%) τ_r = {tau_r*1e9:.2f} ns")
print("\n--- 噪声与探测性能 (@ 计算带宽) ---") print(f"散粒噪声 I_shot = {ishot*1e12:.3f} pA") print(f"热噪声 I_therm = {itherm*1e12:.3f} pA") print(f"总电流噪声 I_noise = {Inoise*1e12:.3f} pA") print(f"信噪比 SNR = {SNR:.2f} ({SNR_dB:.2f} dB)") print(f"噪声等效功率 NEP = {NEP:.2e} W/√Hz") print(f"探测率 D* = {D_star:.2e} cm·√Hz/W") print("="*40)
interact( photodiode_analysis, A_mm2=FloatSlider(value=5.76, min=1, max=6, step=0.1, description='受光面积 (mm²)'), lambda_peak_nm=FloatSlider(value=960, min=700, max=1000, step=10, description='峰值波长 (nm)'), R_peak=FloatSlider(value=0.6, min=0.36, max=0.7, step=0.01, description='峰值响应度 (A/W)'), P_uW = FloatLogSlider(value=10, base=10, min=-2, max=3, step=0.1, description='光照功率 (µW)'), lambda_nm=FloatSlider(value=960, min=350, max=1100, step=5, description='工作波长 (nm)'), Rf=FloatLogSlider(value=1e4, base=10, min=3, max=6, step=0.1, description='反馈电阻 (Ω)'), Cj0_pF=FloatSlider(value=730, min=50, max=1000, step=5, description='零偏压结电容 (pF)'), Vb=FloatSlider(value=5.0, min=0, max=20, step=0.5, description='反向偏压 (V)'), Id_pA=FloatLogSlider(value=5, base=10, min=0, max=4, step=0.1, description='暗电流 (pA)'), T=FloatSlider(value=298, min=77, max=350, step=1, description='温度 (K)') );
|
硅vs石墨烯
| 特性 |
硅 (Silicon) |
石墨烯 (Graphene) |
| 响应速度 |
ns~ps |
ps~fs |
| 波长范围 |
350nm~1100nm(可见-近红外) |
极宽(UV–可见–IR–THz)(紫外-中红外) |
| 量子效率 |
高(可达80–95%) |
单层低(~2–3%),需要光学谐振腔/波导耦合 |
| 暗电流 |
极低(pA–nA) |
较高(μA–mA),噪声大 |
| 工艺成熟度 |
极其成熟,成本低 |
工艺尚不成熟,一致性差 |
| 主要应用 |
消费电子、太阳能电池、传统光通信 |
高速光通信、宽带光谱探测、前沿科学研究 |
Time-of-Flight(ToF)
系统原理
TOF(飞行时间)是一种通过计算光在介质中传播一定距离所需时间来测量距离的技术
基本原理:发射光脉冲 → 光传播 → 反射 → 探测延时 → 计算间距
$$
d = \frac{c\cdot \Delta t}{2}
$$
常用激光,也就是光速,如果用声波就是声速$v=343m/s(20^\circ C)$
动画模拟:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| %matplotlib widget import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation, PillowWriter
c = 3e8 d = 5 delta_t = 2*d/c frames = 200 sensor_x = 0 target_x = d x_positions = np.linspace(sensor_x, target_x, frames//2) x_positions = np.concatenate([x_positions, x_positions[::-1]])
fig, ax = plt.subplots(figsize=(6, 4)) ax.set_xlim(-1, d + 1) ax.set_ylim(-0.5, 0.5) ax.set_xlabel("Distance (m)") ax.set_title("ToF animation diagram")
sensor_dot, = ax.plot(sensor_x, 0, 'bo', markersize=10, label="sensor") target_dot, = ax.plot(target_x, 0, 'ro', markersize=10, label="target") light_dot, = ax.plot([], [], 'yo', markersize=8, label="light") text_time = ax.text(0.5, 0.3, '', ha='center') text_distance = ax.text(0.5, -0.3, '', ha='center') ax.legend(loc='upper right')
def init(): light_dot.set_data([], []) text_time.set_text('') text_distance.set_text('') return light_dot, text_time, text_distance
def update(frame): x = x_positions[frame] light_dot.set_data(x, 0)
fraction = frame / (frames - 1) t = fraction * delta_t d_measured = c * t / 2
text_time.set_text(f"time: {t*1e9:.2f} ns") text_distance.set_text(f"d_measured: {d_measured:.2f} m") if frame == frames-1: ani.event_source.stop() print("动画播放完成。") return light_dot, text_time, text_distance
ani = FuncAnimation(fig, update, frames=frames, init_func=init, interval=30, blit=True) save_gif = False if save_gif: writer = PillowWriter(fps=30) ani.save("tof_animation.gif", writer=writer) print("已保存为 tof_animation.gif")
|
系统结构
一个典型的TOF系统由以下几个部分组成:
发射端Tx:包括激光光源(主要是VCSEL,垂直腔面发射激光器),激光驱动电路ASIC以及用于光束控制的光学组件(准直镜头,衍射光学元件DOE以及滤光片)
接收端Rx:包括镜头和滤光片,根据系统设计使用不同的传感器,以及ISP(图像信号处理器,完成信号放大、时间测距、3D深度图生成等计算)
传感器类型主要有这3种:
- CIS(CMOS Image Sensor):常见于连续调制TOF系统,成像分辨率高
- SPAD(Single Photon Avalanche Diode):单光子雪崩二极管,灵敏度极高,用于脉冲式TOF系统
- SiPM(Silicon Photomultiplier):硅光电倍增器,也能检测极弱光信号
电源管理:TOF系统对电源的要求非常苛刻,VCSEL需要非常精确、快速响应的电流控制,以保证激光脉冲的一致性,SPAD等器件通常需要高电压偏置才能工作在雪崩模式下,因此需要高精度、低噪声的电源管理模块
软件层:包括固件(运行在TOF芯片上的低层控制程序)、SDK(为上层应用提供接口函数)、操作系统(OS)与应用层
脉冲信号模拟:发射端Tx脉冲有展宽,接收端Rx脉冲有幅度衰减
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| import numpy as np import matplotlib.pyplot as plt
c = 3e8 d = 1.0 delta_t = 2 * d / c
t_min = -2e-9 t_max = 10e-9 dt = 10e-12 t = np.arange(t_min, t_max, dt)
pluse_sigma = 0.5e-9 pluse_amp = 1.0 pluse_tx = pluse_amp * np.exp(-t**2/(2*pluse_sigma**2))
pluse_rx = 0.4* pluse_amp * np.exp(-(t-delta_t)**2/(2*pluse_sigma**2))
plt.figure(figsize=(8, 4)) plt.plot(t * 1e9, pluse_tx, label='Tx pulse') plt.plot(t * 1e9, pluse_rx, label='Rx pulse') plt.xlabel('Time(ns)') plt.ylabel('Amp(a.u.)') plt.title(f'Ideal ToF Pulse(d={d}m)') plt.legend() plt.grid(True) plt.tight_layout() plt.show()
|
系统分类
ToF根据调制方法的不同,可以分为两种:脉冲式和连续波调制式
脉冲式:也称为直接TOF(dToF),通过TDC(时间数字转化器)直接测量发射接收时间差$\Delta t$
| 分辨率 |
可测精度 |
对应距离精度 |
| 1ns |
30cm |
较粗测距(普通 ToF) |
| 100ps |
3cm |
高精度测距(中档 LiDAR) |
| 10ps |
3mm |
精密测距(SPAD 系统) |
| 1ps |
0.3mm |
实验室级精度 |
连续波调制:也称为间接TOF(iToF),通过检测相位差来计算时间差
| 特性 |
脉冲式dTOF |
连续波调制iTOF |
| 测距原理 |
测量飞行时间($\Delta t$) |
测量相位差($\Delta \phi$) |
| 发射信号 |
短脉冲 |
连续调制波 |
| 精度 |
高(ps级) |
中(相位精度决定) |
| 成本与功耗 |
高 |
低 |
| 典型应用 |
激光雷达、工业测距 |
手机3D相机、消费电子 |
| 误差来源 |
TDC分辨率 激光脉冲抖动 探测器时间抖动 多路径反射 温度漂移影响时钟 |
相位模糊(超过2π) 环境光影响 多路径反射 |
想测1ns,就得把抖动压到100ps级别
脉冲式dToF
脉冲式直接测量光的往返时间,照射光源一般采用方波脉冲
$$
d = \frac{c\cdot \Delta t}{2}
$$
$\Delta t$ 的测量方法有两种:
快门积分法:
激光器发出一个有限宽度的脉冲(持续时间$t_p$),到达接收端探测器时,并不是瞬间一个点,而是一个有宽度的电流脉冲,通过早窗($S_0$)和晚窗($S_1$)的大小,就可以求得传播时间
$$
d = \frac{c}{2}\times t_p\times \frac{S_1}{S_0+S_1}
$$
最小的可测距离:$S_0$收集了全电荷,$S_1$没有收到,则$d=0$
最大的可测距离:$S1$收集全电荷,$S_0$没有收到,则$d=0.5c\times t_p$,最大可测量距离是通过光脉冲宽度来确定的
优点:
- 不需要亚纳秒级的TDC(硬件复杂度低)
- 积分能把噪声平均掉,对背景光有一定抑制
- 算法简单,适合CMOS图像传感器阵列(ToF相机常用)
缺点:
- 精度受限于脉冲宽度
- 多径回波时积分比值可能失真
- 本质是模拟插值,不是直接测时间
在慢门后一般需要间隔一小段时间再进行下一次脉冲,这是为了避免前一次雪崩后的残余电荷可能导致虚假触发
直方图法
关键组件:单光子雪崩二极管(SPAD),一个光子 → 一次大电流脉冲
每次探测到一个光子,TDC记录其到达时间戳,经过多次脉冲发射,把光子到达时间累积成直方图,回波脉冲形成一个峰值,峰值位置就是$\Delta t$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import numpy as np import matplotlib.pyplot as plt rng = np.random.default_rng(42)
N = 10000 true_delay = 6.67e-9 time_jitter = 2e-10 arrival_times = rng.normal(true_delay, time_jitter, N)
bin_width = 10e-12
t_min = true_delay - 3 * time_jitter t_max = true_delay + 3 * time_jitter bins = np.arange(t_min, t_max + bin_width, bin_width)
counts, bin_edges, _ = plt.hist(arrival_times * 1e9, bins=bins * 1e9, color='lightblue') max_index = np.argmax(counts) peak_time = 0.5* (bin_edges[max_index] + bin_edges[max_index+1]) peak_count = counts[max_index]
plt.scatter(peak_time, peak_count, color='red', s=2, label='Peak') plt.text(peak_time, peak_count, f'{peak_time:.3f} ns', color='red', ha='left', va='bottom') plt.xlabel('Arrival Time (ns)') plt.ylabel('Counts') plt.title('SPAD Photon Arrival Histogram(10 ps resolution)') plt.show()
|
优点:
- 精度高,时间分辨率取决于TDC bin宽度
- 对长距离测量更有优势
- 能分辨多径:直方图可能出现多个峰,对应多次反射
缺点:
- 硬件复杂,需要高速TDC(ps分辨率)
- 数据量大,需要累积统计才能形成稳定直方图
- 功耗较高,不太适合大规模阵列实时成像
常用于高性能激光雷达(SPAD阵列 + TDC)、科研用激光测距
连续波调制式iToF
实际应用中,通常采用的是正弦波调制
$$
I(t)=I_0(1+\sin (2\pi ft))
$$
目标反射回来后,接收的信号会有一个相位延迟$\Delta \phi$
通过测相位差,可以推算距离
$$
d= \frac{c\cdot \Delta \phi}{4\pi f}
$$
不用皮秒级计时,只要能检测相位差
$\Delta \phi$的测量方法:(类似四步相移法)
假设发射的正弦信号$s(t)$振幅是$a$,调制频率是$f$
$$
s(t)= a(1+\sin(2\pi f t))
$$
经过时延$\Delta t$后接收到的信号为$r(t)$,衰减后的振幅为$A$,强度偏移(由环境光引起)为$B$
$$
r(t) = A \cdot (1 + \sin(2\pi f(t - \Delta t))) + B = A \cdot (1 + \sin(2\pi ft - \Delta \varphi)) + B
$$
信号在时间上延迟相当于在波形上向后平移一个相位角
四个采样时间间隔相等,均为$T/4$
$$
t_0=0,t_1= \frac{1}{4}T,t_2=\frac{1}{2}T,t_3=\frac{3}{4}T
$$
在一个周期内分四次采样,相位间隔分别是 0°, 90°, 180°, 270°
根据上述采样时间可以列出四个方程组
$$
r_i = A\cdot \sin (2\pi ft_i-\Delta \phi)+(A+B)
$$
采样得到的$r_0,r_1,r_2,r_3$四个值,是相机像素实际测量到的光强
代入4个$t$发现
$$
r_2 - r_0 = 2A \sin \Delta \varphi \\ r_1 - r_3 = 2A \cos \Delta \varphi
$$
则可知
$$
\Delta \phi = 2\pi f\Delta t = \mathrm{atan2}(r_2-r_0,r_1-r_3)
$$
用四个采样的光强,算出反射波与发射波之间的相位差
atan2是双参数反正切函数,用于求出角度且自动考虑象限
为了提高精度,需要估计信号的幅值A(调制分量)和偏置B(背景光)
平方并相加:
$$
(r_0 - r_2)^2 + (r_1 - r_3)^2 = 4A^2(\sin^2 \Delta \varphi + \cos^2 \Delta \varphi)
$$
则可知
$$
A = \frac{1}{2}\sqrt{(r_0 - r_2)^2 + (r_1 - r_3)^2}
$$
因为正弦函数在0°,90°,180°,270° 四点的平均值是0,则可知
$$
\\
B = \frac{1}{4}(r_0 + r_1 + r_2 + r_3) - A
$$
测距不确定度(误差$\sigma _d$)
$$
\sigma_d = \frac{c}{4\sqrt{2\pi f}} \cdot \frac{\sqrt{A+B}}{c_d \cdot A}
$$
$c_d$是一个与相机系统有关的常数,用来把光强单位转成等效信号幅度单位
可知:
优点:
- 更容易在 CMOS 图像传感器上实现,每个像素都能测深度
- 成本低,适合手机、近距3D成像
- 同时能做大规模二维阵列成像
缺点: