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,我有一套标准流程,分享给你:

  1. 准备暗场环境:盖上镜头盖,或者用遮光布把镜头包严实。确保无光。我习惯在暗室里做,连LED指示灯都贴掉。
  2. 设置曝光时间:从短到长,多拍几组。比如 1ms、10ms、100ms、1s。曝光时间越长,暗电流积累越多,FPN越明显。
  3. 采集多帧图像:每个曝光时间至少拍 10 帧。为什么?因为要区分FPN和随机噪声。FPN是固定的,随机噪声每帧都不一样。
  4. 计算均值图像:对同一曝光时间的多帧图像做平均。随机噪声被平均掉了,剩下的就是FPN。
  5. 提取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,但注意别把纹理也去掉了

调优步骤,我个人习惯这样:

  1. 先调BLC:确保暗场均值接近0,行/列FPN降到最低。
  2. 再调SDN的strength:在暗场下,把strength从0慢慢往上加,观察FPN的消失情况。
  3. 调edge_threshold:切换到亮场(比如灰卡),看边缘是否清晰。如果边缘模糊了,就增大threshold。
  4. 微调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的诊断与修复,说到底就是跟“热”和“不均匀”做斗争。掌握了测量方法和调参思路,你就能在高通平台上把暗场质量做到位。下一节咱们聊点更刺激的——坏点校正。不过那是后话了。

暗电流与FPN诊断与修复流程 暗电流成因 热激发 → 电子-空穴对 FPN测量方法 暗场采集 → 多帧平均 高通平台调优 BLC + SDN 参数 扩散电流 产生-复合电流 表面漏电流 行FPN / 列FPN 像素FPN DSNU BLC: Global/Per-Column SDN: strength SDN: edge_threshold 核心思路 先分析物理成因 → 再通过暗场测量量化FPN → 最后在高通平台上 通过BLC和SDN参数调优,在去噪和保细节之间找到平衡