1.PDAF 驱动功能验证
1.1 pdaf log 设置
log 设置,打开AF(8),State(2),Sensor(2) 的log
CT30P:/ # cat /vendor/etc/camera/camxoverridesettings.txt
overrideLogLevels=0x3F
logWarningMask=0x08000202
logInfoMask=0x08000202
logVerboseMask=0x08000202
enable3ADebugData=TRUE
dumpSensorEEPROMData=TRUE
enableTuningMetadata=TRUE
afFullsweep=3
enablePDLibLog=3
1.2 验证pdaf.xml 是否编译进系统
02-25 14:52:07.993 887 887 I CamX : [ INFO][SENSOR ] camxsensornode.cpp:3165 IsPDAFEnabled() PDAFType = 3: isPDAFEnabled 1
02-25 14:52:08.037 887 887 I CamX : [ INFO][SENSOR ] camxpdafdata.cpp:1104 GetCurrentPDAFModeIndex() Current Sensor Mode: 0, Corresponding PDAF Mode: 0
02-25 14:52:08.037 887 887 V CamX : [ VERB][SENSOR ] camxpdafdata.cpp:950 PrintDebugPDAFData() PDAF Debug Data for s5k3l6_pdaf
02-25 14:52:08.037 887 887 V CamX : [ VERB][SENSOR ] camxpdafdata.cpp:952 PrintDebugPDAFData() =====PDAF Information:=====
02-25 14:52:08.038 887 887 V CamX : [ VERB][SENSOR ] camxpdafdata.cpp:954 PrintDebugPDAFData() Actuator Sensitivity: 0.928074
02-25 14:52:08.038 887 887 V CamX : [ VERB][SENSOR ] camxpdafdata.cpp:956 PrintDebugPDAFData() Black Level: 64
02-25 14:52:08.038 887 887 V CamX : [ VERB][SENSOR ] camxpdafdata.cpp:958 PrintDebugPDAFData() Pixel Depth: 10
02-25 14:52:08.038 887 887 V CamX : [ VERB][SENSOR ] camxpdafdata.cpp:960 PrintDebugPDAFData() Is Hdr Mode Enabled: 0
02-25 14:52:08.038 887 887 V CamX : [ VERB][SENSOR ] camxpdafdata.cpp:962 PrintDebugPDAFData() PDPixelOverflowThreshold: 0
02-25 14:52:08.038 887 887 V CamX : [ VERB][SENSOR ] camxpdafdata.cpp:964 PrintDebugPDAFData() Macro DAC: 525
02-25 14:52:08.038 887 887 V CamX : [ VERB][SENSOR ] camxpdafdata.cpp:966 PrintDebugPDAFData() Infinity DAC: 262
02-25 14:52:08.038 887 887 V CamX : [ VERB][SENSOR ] camxpdafdata.cpp:968 PrintDebugPDAFData() Pixel order Type: 0
02-25 14:52:08.038 887 887 V CamX : [ VERB][SENSOR ] camxpdafdata.cpp:970 PrintDebugPDAFData() =====Native Pattern Information:=====
02-25 14:52:08.038 887 887 V CamX : [ VERB][SENSOR ] camxpdafdata.cpp:972 PrintDebugPDAFData() originalImageWidth: 4208
02-25 14:52:08.039 887 887 V CamX : [ VERB][SENSOR ] camxpdafdata.cpp:974 PrintDebugPDAFData() originalImageHeight: 3120
02-25 14:52:08.073 887 887 I CamX : [ INFO][SENSOR ] camxpdafdata.cpp:507 PDAFInit() Initializing PDAF s5k3l6_pdaf
1.3 dump pd 数据是否同模组厂提供数据一致.
1.4 查看pd 功能是否正常
将设备固定在三脚架上, 在灯箱中 触发一个full-sweep ,然后抓取haf/af 的日志。 日志的关键字: af_pdaf_proc_pd_single grid|af_pdaf_proc_pd_single roi|af_fullsweep_final|sweep_srch_far_to_near|af_fullsweep_srch_near_to_far|af_fullsweep_start_srch 从log 中可以查看 pd ,defocus 和 confidence information 。有了所有这些信息,您可以决定从传感器获得的pd 是否正确。
Line 16362: 02-25 14:55:03.995 897 1187 V CamX : [ VERB][STATS_AF ] af_fullsweep.cpp:501: af_fullsweep_start_srch AEC Settled count:1
Line 16758: 02-25 14:55:04.053 897 1188 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4610: af_pdaf_proc_pd_single grid: num rows=1, num cols=1
Line 16763: 02-25 14:55:04.053 897 1188 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4710: af_pdaf_proc_pd_single grid(0) pd=-6.37, defocus(dac)=-133, conf=533, weight=1.00
Line 16766: 02-25 14:55:04.054 897 1188 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4798: af_pdaf_proc_pd_single roi(0) orig_conf = 533 orig_pd=-6.37, orig_defocus(dac)=-133
Line 16767: 02-25 14:55:04.054 897 1188 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4810: af_pdaf_proc_pd_single roi(0) lens_pos=345 index=6, pd=-6.37, defocus(um)=-123, conf=533, is_conf=TRUE, not_conf_cnt=0, is_stable=TRUE
Line 16942: 02-25 14:55:04.102 897 1187 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4610: af_pdaf_proc_pd_single grid: num rows=1, num cols=1
Line 62081: 02-25 14:55:15.560 897 1187 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4798: af_pdaf_proc_pd_single roi(0) orig_conf = 465 orig_pd=-6.88, orig_defocus(dac)=-144
Line 62082: 02-25 14:55:15.560 897 1187 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4810: af_pdaf_proc_pd_single roi(0) lens_pos=384 index=6, pd=-6.88, defocus(um)=-133, conf=465, is_conf=TRUE, not_conf_cnt=0, is_stable=TRUE
Line 62348: 02-25 14:55:15.603 897 1183 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4610: af_pdaf_proc_pd_single grid: num rows=1, num cols=1
Line 62633: 02-25 14:55:15.678 897 1185 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4610: af_pdaf_proc_pd_single grid: num rows=1, num cols=1
Line 62892: 02-25 14:55:15.717 897 1188 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4710: af_pdaf_proc_pd_single grid(0) pd=-6.76, defocus(dac)=-141, conf=476, weight=1.00
Line 63129: 02-25 14:55:15.760 897 1185 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4710: af_pdaf_proc_pd_single grid(0) pd=-6.78, defocus(dac)=-142, conf=493, weight=1.00
Line 63131: 02-25 14:55:15.760 897 1185 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4798: af_pdaf_proc_pd_single roi(0) orig_conf = 493 orig_pd=-6.78, orig_defocus(dac)=-142
Line 63693: 02-25 14:55:15.884 897 1183 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4610: af_pdaf_proc_pd_single grid: num rows=1, num cols=1
Line 63696: 02-25 14:55:15.884 897 1183 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4710: af_pdaf_proc_pd_single grid(0) pd=-0.87, defocus(dac)=-18, conf=698, weight=1.00
Line 64150: 02-25 14:55:15.971 897 1187 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4610: af_pdaf_proc_pd_single grid: num rows=1, num cols=1
Line 64153: 02-25 14:55:15.971 897 1187 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4710: af_pdaf_proc_pd_single grid(0) pd=0.02, defocus(dac)=0, conf=601, weight=1.00
Line 64156: 02-25 14:55:15.971 897 1187 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4798: af_pdaf_proc_pd_single roi(0) orig_conf = 601 orig_pd=0.02, orig_defocus(dac)=0
Line 64158: 02-25 14:55:15.971 897 1187 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4810: af_pdaf_proc_pd_single roi(0) lens_pos=208 index=17, pd=0.02, defocus(um)=0, conf=601, is_conf=TRUE, not_conf_cnt=0, is_stable=FALSE
有的log镜头位置都有三帧pd信息,这是因为全扫描中的帧延迟,只需要知道每一个镜头位置的最后一帧信息。 defocus is near to 0 ,pd is less than 1 。
af_haf_pdaf.cpp:4810 | af_fullsweep_srch_far_to_near max_pos|af_fullsweep_srch_near_to_far CAF_SCAN_Fullsweep_end Final_lens_pos 从关键字中搜素defocus 和lens position 做出图。 从pd 的 log 中没看到focusvalue,不知道怎么将pd 的defocus 和 af 的focusvalue 画到一张图上。 有知道怎么弄的可以告诉我下。 pd 指画了far_to_near defocus =0 为201. af 的far_to_near 的峰值也为201。所以pd 准确。 pd不动的问题,发现当前镜头位置为0时离焦是负的,方向不对。定位是pd效果的一个重要标志。 注意:由远到进,离焦率 为负。由进到远,离焦率为正。
2.PDAF 驱动功能验证
2.1 pdaf 调试前提
不跑fullsweep。 AF 工作期间, 从日志中获取下列信息:
af_haf_pdaf.cpp:4810: af_pdaf_proc_pd_single roi(0) lens_pos=206 index=8, pd=0.00, defocus(um)=0, conf=1023, is_conf=TRUE, not_conf_cnt=0, is_stable=TRUE
对准附近目标,附近的目标移除后, 应能从日志信息中观察到以下情况: PD 为正值并随着镜头的对焦逐渐降至 0 散焦值为正值并随着镜头的对焦逐渐降至 0
2.1 调试 ROI 配置
roi_loc_y
roi_loc_y
roi_num_rows
roi_num_cols
使用 [2, 3, 2, 2] 。适用PDAF Type 1。 位置和网格数。 使用 [0, 0, 1, 1] 。适用2PD。 Qualcomm PD lib 已优化为使用整个帧的 30% 作为沿水平和垂直两个方向的 ROI。 使用默认。
2.2 调试Focus Table
当镜头在一帧内从近到远或从远到近移动时,它看起来非常跳跃和不稳定。为了使AF平滑,有必要使用迭代运动来提供良好的AF收敛 为了提供良好的用户体验,参数move_percentage根据原始离焦距离将一个大的镜头移动分解为小的镜头移动. If the reported defocus is 200, the next driving lens movement is 2000.3 = 60 If the reported defocus is 40, the next driving lens movement is 400.45 = 18.
调试指南
- move_percentage 控制着收到报告的 PD 后反复执行最终镜头移动的次数。
- 百分比值越高, 意味着镜头反复移动次数越少, AF 速度越快。 但这可能会导致过度跳跃, 为用户带来不顺畅的 AF 收敛体验。
- 如果对较大的散焦值采用较小的百分比值, 可以防止不正确的 AF 跳跃, 从而带来更加顺畅的用户体验。
- 利用 Inf(1m)-Macro(15cm) 跳跃实验调试对焦值表。 应降低百分比, 直至跳跃行为消失。
2.3 调试Noise Table
应用较高的增益时, 来自传感器的 PD 信息可能包含噪点。 噪点增益较高时, PDAF 可能会得到不可靠的散焦值, 因为跳跃可能导致对焦失败。 当噪声增益较高和PD噪声较大时,增大精细搜索范围以保持精度 Fine-step focus scan range =Fine scan step size x Range multiplier(noise gain [dB]
调试 Focus Scan 和 Noise Table 参数。 调试指南
- 当噪点增益很高且 PD 噪点增多时, 应增大精确搜索范围, 以保持精确性。
- 精确对焦扫描范围通过 Fine_scan_step_size 乘以一个乘数计算
例如: 如果范围 = 2, 则意味着可以等于 -2、 -1、 0、 +1、 +2
2.4 调试Confidence Table
它主要用于控制在什么样的光照条件下选择PD触发对焦 客户可以根据他们的测试标准和测试用例分布或传感器性能来决定在哪些光照条件下不使用PD触发器
首先请记住噪声增益并不等于AEC算法直接输入的传感器增益。 noise_gain = 20.0f * log10( input->sensor_gain )
For example
/* Entry 4 */
{
10.000000f, /* Noise Gain */
700, /* Minimum Confidence */
}
在上述情况下,客户不希望触发PD超过10倍增益的场景。他们认为PD在这种情况下不太可靠。因此,他们给出了一个更高的阈值(700)来分块算法选择PD。
03-31 18:51:30.741 893 1186 V CamX : [ VERB][STATS_AF ] af_haf_pdaf.cpp:4798: af_pdaf_proc_pd_single roi(0) orig_conf = 1023 orig_pd=0.00, orig_defocus(dac)=0
ROI 信息有:相位差(pd) 和 置信度 高置信度意味着该 ROI 中 PD 的偏差较小并且可能具有更高的边缘密度。 置信度表用于定义相对于传感器增益的最小置信度阈值。
调试指南
- 最小置信度阈值越高, PD 越可靠, 但可能导致在定义的 ROI 范围内找到的 PD 越少,
或者根本找不到。 - 值得注意的是, 需要分别在弱光 (50 Lux)、 正常照明 (300 Lux) 和室外照明 (1000 Lux)条件下调试置信度表, 以观察使用垂直条纹测试卡时哪个最小置信度能够在 ROI 内产生最精确的 PD。
- 在室外使用较高的最小置信度值可以为天空场景产生更可靠的 PD 数据。
- 在弱光条件下使用较高的最小置信度值可以产生更可靠的 PD, 避免 PD 包含噪点。
2.5 调试Stable Table
它对调优没有很大的影响,因为主要是由相关的预留参数决定的。 首先使用Chromatix工具生成的默认值 FPS/Minimum Stable Count
Min Stable Count 是用于确定 PD 是否进入稳定状态的阈值。
2.6 调试Focus Scan
要获得更顺畅的 AF 收敛过程, 可使用 Conv Frame Skip 参数提高 AF 收敛速度。 此参数可降低 AF 速度, 但会带来更顺畅的收敛用户体验。
1, /* Conv Frame Skip */ better to use default 1.
1, /* Enable Fine Scan */ better to use default 1.
x, /* Min Fine Scane Range */ finally will compared with noise_multiplier.
x, /* Fine Scan Step Size */ fine search steps.
x, /* Focus Done Treshold */ need combine with dof_multiplier * noise_multiplier to check.
调试指南
- 建议仅为 AF 收敛设置一个跳帧。
- 跳帧过多会产生抖动, 并降低 AF 速度。
Focus Done Threshold 参数用于确定 PDAF 是否已收敛 如果报告的散焦值大于 Focus Done Threshold, PDAF 会继续搜索并等待进入收敛状态。 如果报告的散焦值小于 Focus Done Threshold, 则 PDAF 结束搜索并进入精确搜索模式,或者在精确扫描被禁用时, 直接向 AF_success 报告。
调试指南
- 阈值越大, PDAF 搜索结束得越快, 越容易进入精确搜索模式。
2.7 调试Scene Monitor
4, /* Wait After Focus Count */
4, /* Conf Recover Count */
25, /* Defocused Threshold */ need combine with dof_multiplier to check.
20.00000f, /* Depth Stable Threshold */ need combine noise_multiplier to check.
Above all params recommend use default value ggenerated by Chromatix tool at first.
/* Defocused Threshold */ tuning procedure is similar confidence table. Just focus the
key word defocus(um)
Defocus Threshold 用于确定 AF 是否失焦。 Depth Stable Threshold 会触发稳定状态计数的增加。
调试指南
- Defocus Threshold 越大, 意味着 PDAF 越难触发。
此参数可作为场景切换触发标准。 如果报告的散焦值大于 Defocus Threshold, PDAF将进入搜索状态。 - MinStableCount 和 Depth Stable Threshold 值越大, 意味着 PDAF 越难稳定, AF 收敛速度也越慢。
突发的深度变化期间, PD 库会临时丢弃两帧或三帧的置信度。 试置信度恢复计数 Conf Recover Count 参数可以帮助 PDFA 区分置信度的丢弃是持续发生(即无垂直边缘)还是临时发生(例如突发的深度变化) 。 这样可以防止在每次突发景深变化期间过早触发对比度 AF。如果 not_conf_cnt 大于 Conf Recover Count, 则没有可信 PD, 将转换 为对比度 AF
|