第三章 硬件实现方式:模拟域BLC与数字域BLC

好,咱们进入正题。黑电平校正怎么做?说白了就两条路:在模拟域搞定,或者在数字域搞定。当然,还有第三条路——混合着来。我这些年摸过的Sensor不下二十种,每种都有自己的脾气,但BLC的实现方式万变不离其宗。

3.1 模拟域BLC:钳位电路

先说说模拟域的做法。你想想看,Sensor输出的模拟信号,在进入ADC之前,其实就已经带着一个固定的偏置了。这个偏置怎么来的?主要是像素本身的暗电流、读出电路的热噪声,还有各种漏电。

模拟域BLC的核心思路,就是在ADC转换之前,先把信号拉到参考地电平上。具体怎么做?用钳位电路。

钳位电路的工作原理:

  • 在每一行像素读出的开始阶段,会有一段"光学黑电平"(OB,Optical Black)像素
  • 这些OB像素被金属遮挡,理论上不感光
  • 读出OB像素的电压值,作为当前行的黑电平参考
  • 用这个参考电压去钳位信号通路,把黑电平拉到ADC的参考地

我记得有一次调试一个老款的CCD Sensor,它的钳位电路特别敏感。环境温度一变化,钳位点就飘。后来发现是PCB布局上,钳位电容离发热器件太近了。嗯,这里要注意——模拟域的钳位电路对温度、电源纹波都非常敏感。

个人经验:模拟域BLC的优势在于,它是在信号链最前端做校正,不会损失动态范围。但缺点是,一旦钳位不准,整幅图像都会偏色。我建议在硬件设计时,给钳位电路留出独立的模拟电源和地。

3.2 数字域BLC:减法校正

数字域BLC就简单粗暴多了。ADC已经转完了,我们拿到的是数字码值。这时候要做的事情就是——减掉一个固定的偏移量。

公式长这样:

// 数字域BLC校正
// raw_data: ADC输出的原始数据
// blc_offset: 黑电平偏移量(由OB像素统计得到)
uint16_t blc_correction(uint16_t raw_data, uint16_t blc_offset) {
    if (raw_data < blc_offset) {
        return 0;  // 防止下溢
    }
    return raw_data - blc_offset;
}

你可能会问:这个偏移量怎么来的?其实还是靠OB像素。Sensor会预留几行或者几列被遮挡的像素,读出它们的平均值,就是当前帧的黑电平偏移。

避坑指南:我曾经遇到过一个案子,数字域BLC做减法后,暗部出现了条纹噪声。查了两天才发现,是因为OB像素的统计窗口太小,随机噪声导致每帧的偏移量都在抖动。后来我把统计窗口从16个像素扩大到128个,问题就解决了。

3.3 混合架构对比

现在很多高端Sensor都采用混合架构——模拟域做粗调,数字域做精调。为什么要这么折腾?

对比项 模拟域BLC 数字域BLC 混合架构
校正精度 受模拟电路限制,约±2LSB 可精确到1LSB 综合最优
动态范围影响 无影响 会损失暗部动态范围 几乎无影响
温度稳定性 较差
实现复杂度
适用场景 低端Sensor 中端Sensor 高端Sensor

我个人习惯是:如果Sensor的模拟域BLC做得够好,数字域只做微调就够了。但有些Sensor的模拟钳位电路设计得比较粗糙,这时候数字域就要承担更多的校正任务。

3.4 不同Sensor的BLC实现差异

不同厂商、不同工艺的Sensor,BLC的实现方式差异很大。我简单列几个典型的:

  • Sony IMX系列:模拟域BLC做得非常成熟,OB像素数量多,统计精度高。数字域只需要做很小的补偿。
  • OmniVision OV系列:偏向数字域BLC,模拟钳位电路比较简单。需要ISP端做较强的数字校正。
  • 三星S5K系列:混合架构,但OB像素的布局比较特殊——不是传统的上下两行,而是分散在画面四周。
  • 国产GC系列:成本优先,模拟域BLC的温漂比较大。我建议在ISP端增加温度补偿查表。

一个小技巧:拿到一个新Sensor时,先不要急着调BLC参数。先拍一张全黑图(盖上镜头盖),看看原始数据的分布。如果暗部有明显的行噪声或者列噪声,那多半是模拟域BLC没做好。这时候再决定是调硬件还是调软件。

嗯,说到这我想起一个案例。有一次调试一个车载Sensor,要求-40°C到85°C全温域BLC误差小于3个码值。模拟域根本做不到,最后我们是在数字域做了分段线性补偿——低温段、常温段、高温段各用一套BLC参数。效果还不错。

所以你看,BLC的实现没有银弹。理解每种方式的优缺点,根据项目需求灵活选择,这才是工程师该有的思路。