3. 统计信息采集:AEC/AGC统计、AWB统计、AF统计、3A统计的硬件实现
各位同学,今天我们来聊聊ISP pipeline里最“底层”但也最关键的一环——统计信息采集。说白了,3A算法(自动曝光、自动白平衡、自动对焦)能不能跑得准,全靠底层喂过来的统计信息够不够“干净”、够不够“实时”。
我在高通的平台上调试过几款Sensor,发现很多刚入行的工程师容易忽略一个问题:统计信息的精度,直接决定了3A算法的收敛速度和最终画质。你算法写得再花哨,底层统计采歪了,出来的图像不是过曝就是偏色。嗯,这章我们就来拆解一下,硬件到底是怎么把这些统计信息算出来的。
3.1 统计信息采集的整体架构
先看一张整体框架图,我习惯把统计采集模块放在ISP的“前端”位置,通常在Bayer域处理之后、RGB域处理之前。
核心观点:统计信息采集是硬件加速的“眼睛”,它不参与像素级的图像增强,但为所有3A算法提供决策依据。
你看,三个统计模块是并行工作的。硬件上它们共享同一份Bayer数据,但各自只关心自己需要的特征。这样做的好处是——一次数据读取,三次统计复用,带宽利用率很高。
3.2 AEC/AGC统计的硬件实现
AEC(自动曝光控制)和AGC(自动增益控制)的统计,说白了就是算“画面亮不亮”。但硬件实现上,它比你想的要精细得多。
3.2.1 亮度统计的基本单元
高通平台通常把画面分成M×N个统计块(比如15×15或16×16),每个块独立计算亮度均值。我个人习惯把块大小设为64×64像素,这样既不会太粗导致局部过曝,也不会太细增加硬件开销。
| 统计块大小 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 32×32 | 细节丰富,局部响应快 | 硬件资源消耗大 | 高精度场景(如医疗) |
| 64×64 | 平衡性好 | 无明显缺点 | 通用场景(推荐) |
| 128×128 | 硬件开销小 | 容易丢失局部细节 | 低功耗场景 |
我的经验:在调试夜景模式时,我曾经把块大小从64×64改成32×32,结果AEC对暗部区域的响应速度快了将近一倍。代价是硬件面积增加了约15%,但效果值得。
3.2.2 亮度直方图的硬件加速
除了块均值,硬件还会生成整帧的亮度直方图。高通平台支持256 bins的直方图,每个bin统计对应亮度级别的像素个数。
// 伪代码:硬件直方图累加逻辑
for each pixel in frame:
bin_index = pixel_y >> 4; // 10-bit数据右移4位,得到6-bit索引
histogram[bin_index] += 1;
// 硬件实现时,这是并行流水线,一个时钟周期处理4个像素
你想想看,如果软件来做这个统计,每帧要遍历几百万个像素,CPU直接跑满。但硬件用一组累加器阵列,一帧数据还没传完,直方图就已经算好了。
3.3 AWB统计的硬件实现
AWB统计的核心是“颜色特征提取”。硬件需要从Bayer数据中,快速统计出R、G、B三个通道在不同亮度区间的分布情况。
3.3.1 色温统计网格
高通平台把色温空间划分成若干个“色温区间”,每个区间对应一个统计计数器。硬件在扫描像素时,根据当前像素的R/G和B/G比值,判断它落在哪个色温区间,然后累加计数。
关键点:AWB统计不是简单的全图平均,而是加权统计。硬件会排除过曝区域(亮度阈值以上)和纯色区域(饱和度阈值以下),只统计“可信”像素。
3.3.2 硬件实现的几个坑
我在项目中遇到过一个问题:AWB统计模块的输入数据是Bayer格式,但R/G/B通道的采样位置不同。硬件需要做“通道对齐”才能计算比值。如果对齐逻辑写错了,出来的色温统计全是乱的。
注意:Bayer格式下,R和B通道的像素密度只有G通道的一半。硬件在做色温统计前,必须对R和B通道做插值对齐,否则统计结果会有系统性偏差。
3.4 AF统计的硬件实现
AF统计可能是3A里最“硬核”的。它需要从图像中提取“清晰度”特征,硬件实现方式主要有两种:对比度检测和相位检测。
3.4.1 对比度检测(CDAF)
硬件通过计算相邻像素的梯度来评估清晰度。高通平台支持多种滤波器,我常用的是一种3×3的Sobel算子变体:
// 水平梯度计算
Gx = (pixel[x+1][y-1] + 2*pixel[x+1][y] + pixel[x+1][y+1])
- (pixel[x-1][y-1] + 2*pixel[x-1][y] + pixel[x-1][y+1]);
// 垂直梯度计算
Gy = (pixel[x-1][y+1] + 2*pixel[x][y+1] + pixel[x+1][y+1])
- (pixel[x-1][y-1] + 2*pixel[x][y-1] + pixel[x+1][y-1]);
// AF统计值 = sum(|Gx| + |Gy|) over all pixels in ROI
硬件实现时,这些滤波器是并行的。一个3×3窗口只需要9个寄存器和一个加法树,延迟只有几个时钟周期。
3.4.2 相位检测(PDAF)
高通平台从骁龙865开始全面支持PDAF统计。硬件需要从专用的相位检测像素中提取“相位差”信息。这些像素在Bayer阵列中是特殊排布的,硬件需要识别它们的位置,单独处理。
避坑指南:我曾经调试过一款Sensor,它的PDAF像素位置和平台默认配置不一致。结果AF统计出来的相位差全是噪声,对焦一直在来回震荡。后来我手动配置了PDAF像素的mask表,问题才解决。
3.5 3A统计的汇聚与输出
三个统计模块各自算完后,数据会汇聚到3A统计接口模块。这个模块负责:
- 时间戳对齐:确保AEC、AWB、AF的统计来自同一帧
- 数据打包:把统计结果按固定格式写入内存(通常是DMA方式)
- 中断触发:通知3A算法引擎“新统计已就绪”
高通平台的数据包格式大致如下:
| 偏移地址 | 内容 | 大小 |
|---|---|---|
| 0x00 | AEC块均值数组(15×15个uint16) | 450 bytes |
| 0x1C2 | AEC直方图(256个uint32) | 1024 bytes |
| 0x5C2 | AWB色温统计(32个uint32) | 128 bytes |
| 0x642 | AF梯度统计(ROI区域,16个uint32) | 64 bytes |
| 0x682 | 时间戳+状态字 | 16 bytes |
总结一下:统计信息采集是ISP pipeline里最“默默无闻”但最“不可或缺”的模块。它不产生任何视觉上的效果,但没有它,3A算法就是瞎子。硬件实现的核心思路是:并行采集、流水线处理、DMA输出,用最小的延迟换取最准的统计。