← 返回课程

3A与Tuning

Camera全栈开发(Qcom Camx) 第 23 / 30 节

第 21 章:3A 算法与 Tuning 基础


本章导读

这一章讲两个东西:3A 算法Tuning

3A 算法(AE / AWB / AF)是相机自动控制曝光、白平衡和对焦的算法。每次拍照时,它们都在后台自动工作。

**Tuning(调优)**是调整 ISP 处理参数的过程。每颗 sensor 型号不同,需要的 ISP 参数也不同——LSC 增益、CCM 矩阵、Denoise 强度……这些参数都放在 chromatix 文件中。Tuning 工程师的工作就是把这些参数调到最优。

这两个概念的关系:3A 算法决定每帧的动态参数(当前该用多少曝光、什么颜色矩阵),Tuning 决定静态参数(这颗 sensor 的 LSC 表、Gamma 曲线应该是什么值)。


21.1 Tuning 和 Chromatix 是什么

21.1.1 为什么需要 Tuning

同样的 ISP 硬件,不同的 sensor 模组,出来的图像效果完全不同:

  Sensor A 的 R/G/B 响应     → 需要不同的 CCM 矩阵
  Sensor A 的镜头暗角程度    → 需要不同的 LSC 增益表
  Sensor A 的噪声特性       → 需要不同的 Denoise 强度

Tuning = 针对某一颗具体 sensor,找到一组最优的 ISP 参数。
没有 Tuning → 图像偏色、暗角明显、噪点多。
有了 Tuning → 图像颜色准、亮度均匀、噪声可控。

21.1.2 Chromatix 是什么

Chromatix 是高通的 Tuning 文件格式。它包含了 ISP 各模块的全部参数。

源码中 tuning 数据位置:
  chi-cdk/oem/qcom/tuning/<sensor_name>/  → sensor 特定的 tuning 项目文件

编译后生成的库:
  libchromatix_<sensor>_<mode>.so        → 编译为 .so 格式(供 CamX 运行时加载)

运行时路径:
  /vendor/lib/<sensor>_chromatix.so       → 或
  /vendor/etc/camera/chromatix/*.xml      → chromatix XML 格式

每个 chromatix 文件中包含:
  - LSC Table(镜头阴影增益网格,17×13 个点的 R/G/B 增益)
  - CCM(颜色校正矩阵,3×3 矩阵)
  - Gamma 曲线(256 个点的查表值)
  - Denoise 强度(空域/时域)
  - Sharpen 强度

21.1.3 Tuning 是怎么做的(Tuning 工具的工作方式)

Tuning 工具连接设备实时调参

Tuning 工程师的工作流程:

① 在 PC 上打开高通 Tuning Tool(Windows 软件)
② 通过 USB 连接手机
③ 手机端实时预览画面
④ 在 PC 上调整某个参数(如 CCM 矩阵)
⑤ 调整效果实时反映在手机预览画面上
⑥ 找到最优值 → 保存到 chromatix 文件
⑦ 编译 chromatix → push 到设备 → 测试验证

21.1.4 Chromatix 和 ISP 的关系

ISP 处理每一帧时,都会读取 chromatix 参数:

Snapshot → IFE 读 chromatix → BLS 值
                              LSC 增益
                              BPC 坏点表
                              ↓
                    BPS 读 chromatix → CCM 矩阵
                                       Denoise 强度
                                       Gamma 曲线
                                       ↓
                             IPE 读 chromatix → Sharpen 强度
                                                CNR 强度

21.2 3A 算法在 ISP 中的完整流程

3A 控制闭环

用一次拍照的完整流程来看 3A 算法在 ISP 中是怎么工作的。

帧 N:采集

Sensor 曝光(exposureTime=20ms, ISO=200)
  ↓
IFE 接收 RAW 数据 → 做黑电平校正(BLS)/LSC/坏点校正(BPC)
  ↓
IFE 硬件同时提取 3A 统计信息:
  → AE Stats: 画面亮度直方图(15×15 区域)
  → AWB Stats: 各区域 R/G、B/G 比例
  → AF Stats: 焦点区域对比度
  ↓
Stats 数据 → Stats Node(camx/src/swl/stats/)

消隐期:计算

Stats Node 收到 IFE 的 3A Stats:
  ↓
AE 算法(camxaecengine.cpp):
  → 当前亮度比目标暗 1/3 EV → exposureTime 20ms→30ms, ISO 保持 200
  ↓
AWB 算法(camxawbnode.cpp):
  → R/G=0.55, B/G=0.48 → 画面偏绿(绿通道占比偏高)→ 更新 CCM 矩阵,提升 R、B 增益
  ↓
AF 算法(camxautofocusnode.cpp):
  → 对比度=85 → 偏低 → actuator 前移 10 步

帧 N+1:应用

① AE 新参数 (exposureTime=30ms, ISO=200)
   → I2C 写入 Sensor 寄存器
   → 帧 N+1 用 30ms 曝光
   → 影响: 帧 N+1 更亮

② AWB 新 CCM 矩阵
   → 写入 BPS 模块寄存器
   → 帧 N+1 经过 BPS 时用新矩阵
   → 影响: 帧 N+1 颜色更准

③ AF 新 actuator 位置
   → I2C 写入 Actuator
   → 帧 N+1 镜头移动
   → 影响: 帧 N+1 更清晰

21.3 AE(Auto Exposure)

AE 算法原理

作用位置

AE 控制 Sensor 的曝光时间(exposureTime)和增益(ISO)。
exposureTime → Sensor 感光时长 (单位: ns)
ISO         → 信号放大倍数

AE 的计算结果不经过 ISP,直接写入 Sensor 寄存器。

算法原理

① 画面分为 N×M 个区域
② 统计每个区域的 Y(亮度)均值
③ 计算整体亮度偏差
④ 调整:
    欠曝 → 先加 exposureTime,不够再加 ISO
    过曝 → 先降 ISO,不够再减 exposureTime

源码路径

算法核心: camx/src/swl/stats/camxaecengine.h/.cpp
API 接口: chi-cdk/api/stats/chiaecinterface.h

21.4 AWB(Auto White Balance)

AWB 算法原理

作用位置

AWB 的控制参数(CCM 矩阵 + R/G/B Gain)写入 BPS 模块。
BPS 处理每帧时,用 CCM 矩阵做颜色校正。

CCM 是一个 3×3 矩阵:
  [R_out]   [a11 a12 a13] [R_in]
  [G_out] = [a21 a22 a23] [G_in]
  [B_out]   [a31 a32 a33] [B_in]

算法原理

① 统计画面中 R/G 和 B/G 比例
② 在色温曲线上定位当前光源
③ 计算 CCM 矩阵
④ 应用白平衡增益

源码路径

算法核心: camx/src/swl/stats/camxawbnode.h/.cpp
API 接口: chi-cdk/api/stats/chiawbinterface.h

21.5 AF(Auto Focus)

AF 算法原理(CDAF vs PDAF)

CDAF

移动 actuator → 逐帧算对比度 → 找最大值
慢(300~500ms),不需要特殊硬件

PDAF

sensor 有相位检测像素 → 一次算方向和距离
快(<100ms),需要硬件支持

源码路径

AF 算法: camx/src/swl/stats/camxautofocusnode.h/.cpp
AF 状态机: camx/src/swl/stats/camxafstatemachine.h/.cpp

21.6 Stats Node

Stats Node 数据流(IFE → 3A 算法)

Stats = 3A 算法的"输入数据"
Stats Node 负责接收 IFE 发来的 Stats,分发给 AE/AWB/AF

源码: camx/src/hwl/statsparser/  (硬件 Stats 解析)
      camx/src/swl/stats/       (3A 算法)
      chi-cdk/api/stats/        (API 接口)

21.7 本章总结

Tuning = 调 ISP 参数(CCM/LSC/Denoise...)
Chromatix = 存放 Tuning 参数的文件
3A = 每帧自动调节的算法(AE/AWB/AF)

AE → Sensor: exposureTime + ISO
AWB → BPS: CCM 矩阵
AF → Actuator: 镜头位置

每帧循环: Sensor → IFE(采 Stats) → Stats Node(算法) → 硬件(应用)

动手验证

# 查看 chromatix 相关库
adb shell ls /vendor/lib64/ | grep chromatix

# 查看 3A 算法日志(使用源码中的特定关键词)
# AE:  "AEC Engine"  (camxaecengine.cpp)
# AWB: "AWBNode"     (camxawbnode.cpp)
# AF:  "AutoFocusNode" (camxautofocusnode.cpp)
adb logcat -s "[CamX]" | grep -E "AEC Engine|AWBNode|AutoFocusNode"