[Camera效果]高通 AF 搜索与控制机制(MSM8909)

本文来自于我的前同事-小卢,一个很有个性,能力又不错的年轻小伙子!
(文章已经得他本人同意分享)

AF搜索与控制机制

Auto Focus,即以一定的搜索策略找出能使场景最清晰的音圈马达位置的算法,常见的搜索策略有反差对焦(CAF),相位对焦(PDAF),激光对焦(LDAF)等等,其中反差对焦是最通用且准确度也是最高的。本文介绍 MSM8909 关于 CAF 的算法机制,并配以log辅助说明。

CAF

CAF通过在一定范围内推动马达,同时平台软硬件统计出每个马达位置的对焦值(FV),并找出最大 FV 对应马达 position 的过程

因此有需要特别注意的几个因素:搜索范围,合焦策略,场景触发机制

1、搜索范围

根据电流磁效应,通过给音圈马达(VCM)供电,可以让它在磁场内带动镜头进行小范围的移动,基于这种原理,当供给不同的电流时,其产生的位移不同。

当 AF 算法得到一个 AF position,会在 driver 将其转换成 driver 的 pos code,再根据数模转换器 (DAC) 将其转换为电流,进而驱动马达,因此,这里有两次转换关系:
高通:AF position -> pos code -> current
这点与 MTK 的 AF 算法就不同,MTK算法直接使用 pos code 作为 AF position
MTK:pos code -> current

AF position 范围从 0~1023,但由于多了一层转换关系,pos code 不一定如 tuning 所想的也有这么大范围;pos code 的范围由 initial_code 和 step_bound 决定,且经实验发现, AF position = far_end + initial_code - pos code

AF OTP 通过修改 initial_code 和 step_bound 来保证模组的对焦一致性

2、场景触发机制

MSM8909 的 AF 有三种控制机制,FV(对焦值)、SAD(亮度绝对误差和)、GYRO(陀螺仪运动值),当场景变化时,会触发 refocus

is_scene_change = gyro | sad | fv
当 is_scene_change 被置 1 时,trig_refocus 会被置 1,然后会触发新一次的 CAF

  1. FV变化
    MSM8909 会计算 FV 的变化率 fRatio,根据 fRatio 与 AF 参数设定的变化阈值fv_change_trigger 进行对比,如果 fRatio > trigger,则认为 scene_change;

这里 trigger 有两种设定,分别表示连续两帧的 FV 变化,以及平均 FV 变化;Caculated value 表示 Algo 计算出来的 FV 变化率(计算公式未知),fvavg 表示平均 FV 触发阈值,change th 代表连续两帧 FV 变化阈值,当 is_fv_var && is_fv_avg_var 时,is_scene_change = 1

  1. SAD
    SAD 为当前图像帧的亮度与上一帧的亮度差,通过亮度变化来检测场景变化。除此之外, SADR 表示当前图像与上一对焦完成的图像亮度差。

1、首先 AF ALGO 会得到 AE ALGO 传下来的曝光增益 gain,并根据 gain 去计算当前场景的 SAD threshold 和 SADR threshold;马达参数中会定义 gain_min,gain_max,threshold_min,threshold_max

2、Algo 计算出当前场景的 SAD 以及 SADR(计算公式未知),再根据 gain 以及参数的线性关系得出当前 gain 下的 SAD_thd 和 SADR_thd,最终决定 sad_change;
当 sad > sad_thd || sadr > sadr_thr, sad = 1

  1. GYRO
    使用该机制需要有陀螺仪设备,当前不支持,暂时略过。

3、合焦策略

在判断合焦条件前,需要先确认搜索开始标志与结束标志;根据之前的介绍

  • 开始标志可以通过 trig_refocus 判断;
  • CAF结束时有两种状态,第一是通过算法找到了 peak 点,此时会返回 af_success;当失败时会将马达推向 default position,此时状态为 af_failed

MSM8909 的 AF log 会不间断的输出,如果不确定起始与结束,根本无法判断 FV 的计算趋势

  1. AF_SUCCESS

从 log 中可以发现,当 trig_refocus 时,会隔几帧再去进行 CAF,其中应该与跳帧,3A同步等有关,具体原因不详从 log 中可以发现,当 trig_refocus 时,会隔几帧再去进行 CAF,其中应该与跳帧,3A同步等有关,具体原因不详

AF ALGO 通过统计出每一个 pos 对应的 FV 变化率,先大致判断当前情况处于哪种场景:flat(平坦景)、macro(近景)等,再选用不同的 FV thres,当某一个 position 的
fRatio > FV thres 时,就认为 find a peak

因为 ALGO 代码不开放,再加上没有相关 log 的介绍,高通平台从 log 判断 AF 行为是比较麻烦的,暂时只能大致判断 thres 的大小、FV 变化趋势等等,但是对于 fRatio 的详细计算等仍然未知。

  1. AF_FAILED

此种情况下,虽然找到了一个极值点 396,但通过 FV 分析可以知道,一次 CAF search 中出现了两个极值,使得算法无法确定 peak 点

一般而言,出现这种情况的可能只有两个:

  1. 场景突变,使得 FV 计算出错(例如光源影响);
  2. 模组本身有问题。
    此时只需要在相同条件下进行一次 fullsweep,通过其 FV 表现可知是否是物料问题
  • Stay hungry,Stay foolish!

猜你喜欢

转载自blog.csdn.net/justXiaoSha/article/details/121327530
AF