3. 暗电流与固定模式噪声(FPN)诊断:暗电流成因分析、FPN测量方法、高通平台去噪参数调优
各位做ISP的同行,咱们今天聊一个绕不开的话题——暗电流和固定模式噪声。说白了,就是传感器在没光的时候,自己在那“瞎拍”出来的东西。你想想看,一张全黑的图,结果拍出来不是纯黑的,有亮斑、有条纹,这谁受得了?
我刚开始调高通平台那会儿,就被这个坑过。当时项目赶得急,白天场景效果调得挺好,一到夜景就翻车。后来才发现,是暗电流补偿没做好。嗯,从那以后,我每次拿到新模组,第一件事就是先测暗场。
3.1 暗电流成因分析
暗电流,英文叫Dark Current。它本质上是传感器像素在没有光照时,由于热激发产生的电子-空穴对。这些电子被收集到势阱里,就变成了“假信号”。
为什么会这样?说白了,半导体物理决定的。温度越高,热激发越强,暗电流就越大。我做过一个实验,把模组从25℃加热到60℃,暗电流能翻好几倍。
核心公式(理解即可):
暗电流密度 Jdark ∝ T² · exp(-Eg / (2kT))
其中 T 是温度,Eg 是硅的禁带宽度,k 是玻尔兹曼常数。温度每升高 6-8℃,暗电流大约翻一倍。
暗电流的主要来源有三个:
- 扩散电流:耗尽区边缘的中性区产生的少数载流子扩散到势阱里。这是大头。
- 产生-复合电流:耗尽区内的缺陷能级作为复合中心,产生电子-空穴对。这个跟工艺质量直接相关。
- 表面漏电流:硅-二氧化硅界面处的悬挂键和陷阱导致的漏电。嗯,这个最烦人,因为它不均匀。
我在项目中遇到过一款模组,暗电流特别大,而且分布极不均匀。排查到最后,发现是晶圆厂那道钝化层工艺出了问题。所以你看,暗电流问题有时候不光是调参能解决的,得往上游追溯。
3.2 FPN测量方法
固定模式噪声,FPN,全称Fixed Pattern Noise。它跟暗电流是“孪生兄弟”,但又不完全一样。暗电流是物理现象,FPN是暗电流在空间上的不均匀分布造成的“图案”。
测量FPN,我有一套标准流程,分享给你:
- 准备暗场环境:盖上镜头盖,或者用遮光布把镜头包严实。确保无光。我习惯在暗室里做,连LED指示灯都贴掉。
- 设置曝光时间:从短到长,多拍几组。比如 1ms、10ms、100ms、1s。曝光时间越长,暗电流积累越多,FPN越明显。
- 采集多帧图像:每个曝光时间至少拍 10 帧。为什么?因为要区分FPN和随机噪声。FPN是固定的,随机噪声每帧都不一样。
- 计算均值图像:对同一曝光时间的多帧图像做平均。随机噪声被平均掉了,剩下的就是FPN。
- 提取FPN指标:计算均值图像的行均值、列均值、以及像素级标准差。
我的小技巧:测量时把传感器温度控制在 40℃ 左右(用加热台或温箱)。因为常温下暗电流太小,FPN不明显,测不准。40℃ 是模拟手机实际使用时的典型温度。
FPN的量化指标,我常用这几个:
| 指标 | 含义 | 典型合格值 |
|---|---|---|
| 行FPN (Row FPN) | 各行均值的标准差 | < 0.5 LSB @ 10bit |
| 列FPN (Col FPN) | 各列均值的标准差 | < 0.5 LSB @ 10bit |
| 像素FPN (Pixel FPN) | 像素级标准差(去除行/列趋势后) | < 2 LSB @ 10bit |
| DSNU | 暗信号非均匀性,全图标准差 | < 3 LSB @ 10bit |
我曾经遇到一个案例,行FPN超标,但列FPN正常。查了半天,发现是读出电路的行选通信号时序有问题。这个案例告诉我,FPN的分布特征能帮你定位问题根源。
3.3 高通平台去噪参数调优
高通平台的ISP pipeline里,跟暗电流和FPN相关的模块主要有两个:Black Level Correction (BLC) 和 Spatial Denoise (SDN)。咱们一个一个说。
3.4.1 Black Level Correction (BLC)
BLC的作用是减去暗电流的直流分量。高通平台里,BLC通常支持两种模式:
- Global BLC:全图用一个值减去。简单粗暴,适合暗电流均匀的模组。
- Per-Column BLC:每列单独计算一个偏移量。适合列FPN明显的模组。
我建议你优先用Per-Column模式。虽然计算量大一点,但效果确实好。高通平台里,BLC的参数通常在 sensor.xml 或 tuning.xml 里配置。
<!-- 高通BLC配置示例 -->
<black_level_correction>
<mode>per_column</mode>
<calibration>
<exposure_time_ms>100</exposure_time_ms>
<temperature_c>40</temperature_c>
<offset_file>blc_offset_40c_100ms.bin</offset_file>
</calibration>
</black_level_correction>
注意:BLC的校准文件(offset_file)必须在暗场下生成,而且要和实际使用时的曝光时间、温度匹配。我曾经见过有人用1ms的校准文件去补偿100ms的暗电流,结果越补越差。
3.4.2 Spatial Denoise (SDN) 参数调优
BLC减掉了直流分量,但剩下的残差(尤其是像素级FPN)还得靠SDN来处理。高通平台的SDN模块,核心参数有这几个:
| 参数名 | 作用 | 调优建议 |
|---|---|---|
strength |
去噪强度,0-255 | 暗场下先拉到最大,看能否把FPN抹平;再逐步降低,保留细节 |
edge_threshold |
边缘保护阈值 | 设得太小,边缘被磨平;设得太大,FPN去不掉。我一般从 32 开始试 |
low_freq_gain |
低频去噪增益 | 针对行/列FPN,适当提高这个值 |
high_freq_gain |
高频去噪增益 | 针对像素级FPN,但注意别把纹理也去掉了 |
调优步骤,我个人习惯这样:
- 先调BLC:确保暗场均值接近0,行/列FPN降到最低。
- 再调SDN的strength:在暗场下,把strength从0慢慢往上加,观察FPN的消失情况。
- 调edge_threshold:切换到亮场(比如灰卡),看边缘是否清晰。如果边缘模糊了,就增大threshold。
- 微调low_freq_gain和high_freq_gain:这两个参数要配合着调。我一般先固定high_freq_gain,调low_freq_gain把行/列条纹去掉;再反过来调high_freq_gain。
避坑指南:我曾经在调SDN时,为了把FPN彻底去掉,把strength拉到了200以上。结果暗场是干净了,但亮场的文字边缘全是锯齿。后来才明白,去噪和保细节永远是矛盾的。你得找到一个平衡点,而不是追求极端。
最后,给你一个检查清单,每次调完参数后对照着看:
- 暗场均值是否接近0?
- 行/列FPN是否小于0.5 LSB?
- 亮场下,边缘是否清晰,没有锯齿或模糊?
- 从暗场到亮场,参数是否平滑过渡?
嗯,暗电流和FPN的诊断与修复,说到底就是跟“热”和“不均匀”做斗争。掌握了测量方法和调参思路,你就能在高通平台上把暗场质量做到位。下一节咱们聊点更刺激的——坏点校正。不过那是后话了。