3. 统计信息采集:AEC/AGC统计、AWB统计、AF统计、3A统计的硬件实现

各位同学,今天我们来聊聊ISP pipeline里最“底层”但也最关键的一环——统计信息采集。说白了,3A算法(自动曝光、自动白平衡、自动对焦)能不能跑得准,全靠底层喂过来的统计信息够不够“干净”、够不够“实时”。

我在高通的平台上调试过几款Sensor,发现很多刚入行的工程师容易忽略一个问题:统计信息的精度,直接决定了3A算法的收敛速度和最终画质。你算法写得再花哨,底层统计采歪了,出来的图像不是过曝就是偏色。嗯,这章我们就来拆解一下,硬件到底是怎么把这些统计信息算出来的。

3.1 统计信息采集的整体架构

先看一张整体框架图,我习惯把统计采集模块放在ISP的“前端”位置,通常在Bayer域处理之后、RGB域处理之前。

核心观点:统计信息采集是硬件加速的“眼睛”,它不参与像素级的图像增强,但为所有3A算法提供决策依据。

统计信息采集硬件架构图 Bayer域输入 AEC/AGC统计 亮度直方图/均值 AWB统计 R/G/B通道统计 AF统计 对比度/相位差 3A统计汇聚模块 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输出,用最小的延迟换取最准的统计。