第三章 硬件实现方式:模拟域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的实现没有银弹。理解每种方式的优缺点,根据项目需求灵活选择,这才是工程师该有的思路。