这一章讲两个东西:3A 算法和 Tuning。
3A 算法(AE / AWB / AF)是相机自动控制曝光、白平衡和对焦的算法。每次拍照时,它们都在后台自动工作。
**Tuning(调优)**是调整 ISP 处理参数的过程。每颗 sensor 型号不同,需要的 ISP 参数也不同——LSC 增益、CCM 矩阵、Denoise 强度……这些参数都放在 chromatix 文件中。Tuning 工程师的工作就是把这些参数调到最优。
这两个概念的关系:3A 算法决定每帧的动态参数(当前该用多少曝光、什么颜色矩阵),Tuning 决定静态参数(这颗 sensor 的 LSC 表、Gamma 曲线应该是什么值)。
同样的 ISP 硬件,不同的 sensor 模组,出来的图像效果完全不同:
Sensor A 的 R/G/B 响应 → 需要不同的 CCM 矩阵
Sensor A 的镜头暗角程度 → 需要不同的 LSC 增益表
Sensor A 的噪声特性 → 需要不同的 Denoise 强度
Tuning = 针对某一颗具体 sensor,找到一组最优的 ISP 参数。
没有 Tuning → 图像偏色、暗角明显、噪点多。
有了 Tuning → 图像颜色准、亮度均匀、噪声可控。
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 强度

Tuning 工程师的工作流程:
① 在 PC 上打开高通 Tuning Tool(Windows 软件)
② 通过 USB 连接手机
③ 手机端实时预览画面
④ 在 PC 上调整某个参数(如 CCM 矩阵)
⑤ 调整效果实时反映在手机预览画面上
⑥ 找到最优值 → 保存到 chromatix 文件
⑦ 编译 chromatix → push 到设备 → 测试验证
ISP 处理每一帧时,都会读取 chromatix 参数:
Snapshot → IFE 读 chromatix → BLS 值
LSC 增益
BPC 坏点表
↓
BPS 读 chromatix → CCM 矩阵
Denoise 强度
Gamma 曲线
↓
IPE 读 chromatix → Sharpen 强度
CNR 强度

用一次拍照的完整流程来看 3A 算法在 ISP 中是怎么工作的。
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 步
① 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 更清晰

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

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

移动 actuator → 逐帧算对比度 → 找最大值
慢(300~500ms),不需要特殊硬件
sensor 有相位检测像素 → 一次算方向和距离
快(<100ms),需要硬件支持
AF 算法: camx/src/swl/stats/camxautofocusnode.h/.cpp
AF 状态机: camx/src/swl/stats/camxafstatemachine.h/.cpp

Stats = 3A 算法的"输入数据"
Stats Node 负责接收 IFE 发来的 Stats,分发给 AE/AWB/AF
源码: camx/src/hwl/statsparser/ (硬件 Stats 解析)
camx/src/swl/stats/ (3A 算法)
chi-cdk/api/stats/ (API 接口)
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"