3、BLC硬件实现:模拟域BLC(钳位电路)、数字域BLC(减法/加法)、硬件寄存器配置流程

好,咱们进入正题。BLC这东西,说白了就是给图像信号找个“零参考点”。你想想看,传感器在暗场下输出的电压并不是0,而是有一个固定的偏置。如果不把这个偏置去掉,你拍出来的黑色物体就会发灰,暗部细节全被淹没了。

我个人习惯把BLC分成两个阶段来看:模拟域数字域。这两个阶段做的事情不一样,但目标是一致的——把黑电平校准到目标值。

3.1 模拟域BLC:钳位电路

模拟域BLC,也叫钳位电路(Clamping Circuit)。它是在ADC转换之前,对像素信号进行电平搬移。

我在项目中遇到过一种情况:传感器输出的模拟信号,在暗场下居然有200mV的偏置。如果不处理,ADC量化后直接就是200个码值,图像看起来就像蒙了一层灰纱。

钳位电路的工作原理其实很简单:

  • 它会在每一行的消隐期(H-Blanking)采样一个参考电平
  • 然后把这个参考电平与目标黑电平做比较
  • 通过反馈环路调整像素信号的直流偏置

嗯,这里要注意:钳位电路通常只对光学黑像素(OB Pixels)起作用。这些像素被金属遮挡,不感光,所以它们的输出就代表了当前的黑电平。

关键点:模拟域BLC的优势在于,它在信号进入ADC之前就把偏置拉回来了。这样ADC的动态范围就能全部用来量化有效信号,不会被偏置浪费掉。

但钳位电路也有它的局限性。它只能处理全局的、缓慢变化的偏置。如果偏置随温度变化很快,或者不同通道的偏置不一致,模拟域就搞不定了。

3.2 数字域BLC:减法/加法

数字域BLC,说白了就是在ADC之后,对数字码值做加减法。这是最灵活、最常用的校准方式。

为什么需要数字域BLC?我给你举个例子。假设传感器有4个通道(R、Gr、Gb、B),每个通道的暗电流特性都不一样。模拟域钳位电路只能拉一个公共的偏置,但数字域可以针对每个通道单独校准。

数字域BLC的公式很简单:

// 数字域BLC核心公式
output_pixel = input_pixel - black_level + target_level

// 实际项目中常用的是:
output_pixel = input_pixel - black_level_offset

这里的black_level_offset就是我们要校准的目标值。通常这个值是0,但有些场景下我们会故意保留一个小的偏置,比如为了保留暗部细节。

我曾经踩过一个坑:在某个项目中,我把数字域BLC的减法做得太狠了,结果暗部像素直接变成了负数。虽然ISP内部会做截断处理,但那些本该有微弱信号的区域,信息全丢了。后来我学乖了,数字域BLC一定要留余量,不能一刀切。

我的建议:数字域BLC的校准值,最好用滑动窗口的方式动态更新。比如每帧采集OB行数据,计算平均值,然后平滑更新到下一帧。这样能有效抑制温度漂移带来的偏置变化。

3.3 硬件寄存器配置流程

好了,理论讲完了,咱们来看看实际怎么配寄存器。我以某款主流传感器为例,给你梳理一下配置流程。

配置BLC寄存器,通常分三步走:

  1. 使能模拟域钳位电路:设置钳位使能位,选择参考源(通常是OB像素)
  2. 配置数字域BLC参数:设置每个通道的偏置值,选择更新模式(静态/动态)
  3. 校准与验证:读取OB区域的统计值,确认BLC是否收敛到目标值

下面是一个典型的寄存器配置示例:

// 1. 使能模拟域钳位
write_reg(0x3000, 0x01);  // 钳位使能
write_reg(0x3002, 0x10);  // 选择OB行作为参考

// 2. 配置数字域BLC
write_reg(0x3010, 0x40);  // R通道偏置:64
write_reg(0x3012, 0x40);  // Gr通道偏置:64
write_reg(0x3014, 0x40);  // Gb通道偏置:64
write_reg(0x3016, 0x40);  // B通道偏置:64

// 3. 使能动态更新
write_reg(0x3020, 0x01);  // 使能帧间更新
write_reg(0x3022, 0x08);  // 更新速度:8帧平均

你可能会问:为什么四个通道的偏置都设成64?这是因为在暗场下,我测出来每个通道的原始码值都在64左右。减去64后,暗场输出就是0了。

注意:不同传感器的寄存器地址和位宽可能完全不同。上面这个例子只是示意,实际项目中一定要参考datasheet。我曾经见过有人把偏置值写反了,结果图像变成了负片效果,排查了半天才发现是寄存器地址搞错了。

3.4 模拟域 vs 数字域:怎么选?

说实话,现在大部分传感器都是模拟域+数字域混合使用。模拟域负责粗调,把大的偏置拉回来;数字域负责精调,处理通道间的差异和温度漂移。

我个人的经验是:

  • 如果传感器质量好,暗电流一致性高,只用数字域BLC就够了
  • 如果传感器有严重的列FSN(固定模式噪声),必须用模拟域钳位来抑制
  • 如果工作温度范围很宽(比如-40°C到85°C),建议两个都用,并且开启动态更新

下面这张图展示了BLC的整体处理流程:

BLC硬件实现流程 模拟域钳位电路 ADC 数字域BLC 像素信号输入 校准后输出 粗调:消除全局偏置 在ADC之前处理 精调:通道独立校准 在ADC之后处理 寄存器配置要点 1. 使能钳位电路,选择参考源(OB像素) 2. 设置各通道数字域偏置值(建议动态更新) 3. 验证OB区域统计值,确认收敛到目标

嗯,这张图把整个流程串起来了。你可以看到,信号从像素出来,先经过模拟域钳位,再经过ADC,最后到数字域做精细校准。每一步都有它的作用,缺一不可。

最后说一句:BLC的调试,说白了就是找对偏置值。这个值不是拍脑袋定的,而是要通过采集暗场数据、分析直方图、观察温度漂移来确定的。我建议你在调试时,先把模拟域和数字域分开调,确认各自没问题了再合起来。这样出了问题也好定位。

总结一下:模拟域BLC负责粗调,数字域BLC负责精调。寄存器配置要分三步走:使能、设值、验证。调试时注意留余量,别把暗部细节一刀切没了。


公众号:蓝海资料掘金营,微信deep3321