ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

PDAF调试完整指南:参数确认、对焦曲线标定与常见问题排查

PDAF调试完整指南:参数确认、对焦曲线标定与常见问题排查

1. 项目背景与调试思路拆解

1.1 什么是PDAF调试,这个任务到底在解决什么

接触相机模组调试这些年,PDAF是我觉得最需要耐心的一类工作。它本身看起来不复杂:传感器上做成对的半遮挡像素,分别记录光线经过镜头左右两侧的相位;对焦不准时,左右像素的灰度信息会出现相位差,这个差异的大小和正负能直接告诉对焦器该往哪个方向推动镜头、推多少。给相机用上PDAF,就像给对焦系统装了一把直读标尺,不像反差式对焦那样需要反复试探才能找到峰值。

但话说回来,从传感器支持PDAF到让相机真正拍出又快又准的照片,中间隔着大量只有实际调过才知道的细节。我这次接手的项目是在某国产移动芯片平台上做一颗主摄的相机调试,目标很明确:预览对焦要快、抓拍不能脱焦、录像追焦要稳。平台自带PDAF硬件加速,传感器也宣称支持全像素双核对焦,但第一次开机预览时,对焦速度完全达不到预期,拍出来的图片还有接近两成的脱焦率。于是整个调试过程变成了一条从硬件到算法再到应用场景的排查链条。

对刚接触这块的新人来说,PDAF调试最适合的第一步不是改代码,而是先弄明白一条链路:传感器端相位像素输出有没有正常,平台端PDAF统计值能不能拿到,统计值能不能正确换算成马达移动量,换算完之后的码值能不能让镜头精确停在合焦点上。这四步一环套一环,任何一环存在偏差,都会在对焦结果上暴露出来,只是现象往往比较隐蔽,需要靠数据和场景去挖。

这篇文章会按我实际操作的顺序来写:从项目需求拆解开始,到硬件参数确认、工具准备,再到数据通路验证、对焦曲线标定、静态和动态场景验证,最后把常见问题排查技巧单独整理出来。看过之后,哪怕你手上是完全不同的平台,这套方法论也能直接搬过去用。

1.2 调试流程的整体设计思路

我给自己定的流程分成三段:先把PDAF数据通路打通并验证,再做马达行程和镜头对焦曲线的标定,最后用静态和动态场景做整机验证。顺序可以局部调整,但我不建议跳步。

先通数据通路的原因很简单:如果PDAF统计值本身读不到、读出来的相位差符号是反的、或者左右像素的布点坐标和驱动配置对不上,后面做得再细也是对着一个坏温度计测体温。数据通路验证做完,确认统计值稳定、方向正确,再去做标定才有可信的基础。标定阶段解决的是“镜头走到哪个码值才是清晰的”这个机械层问题,它输出的对焦曲线会直接影响之后所有算法动作。最后用场景验证去暴露组合问题,比如光线从亮到暗时统计噪声变化、目标移动时对焦曲线跟不上速度、多摄切换时参数被串改。

这套思路背后的核心逻辑是分层处理问题。硬件误差单独清一遍,校准参数单独建一份,算法逻辑再根据场景去调。分层的好处很实际:一旦最终对焦效果不达标,你能快速定位是某一层的偏差,而不是在一堆寄存器之间来回试。我见过不少同行在遇到偏焦时第一反应是加偏置量,试了一轮改这个、改那个,最后一堆参数互相拖累,问题反而更隐蔽。分层的习惯能避免这种盲目试错。

2. 动手前的参数确认与工具准备

2.1 镜头、传感器、马达,先列一张硬件参数底表

我每次调试前的第一件事,就是整理一张硬件参数底表。心里有底,现场才不会慌。这张表至少要有以下几项内容。

  • 传感器型号、像素尺寸、单个像素物理大小,以及PD双像素的排列方式。这里要特别注意:是全局双像素还是局部区域带PD点,PD是2x1还是1x2排列,这些直接决定后续统计窗口怎么设。
  • 传感器RAW输出中PD点的行列坐标映射,以及平台侧怎么知道这些坐标。
  • 镜头最大口径、有效焦距、F数,以及按这些参数算出的理论景深范围。
  • 马达类型。音圈马达和闭环步进马达的调试逻辑差别很大,要区分开。
  • 马达行程范围、电流与位移的灵敏度、驱动IC寄存器码值范围。
  • 镜头模组组立公差,特别是倾斜和偏芯数据。
  • 温度传感器位置和采样精度,这部分是做温度补偿的依据。

实操中我踩过的坑,主要是物料端和软件端的信息“打架”。有一次拿到的封样规格书标称马达行程0.35毫米,实际用光具座一测只有0.31毫米,差了将近12%。如果不做机械行程实测,直接用标称值去写对焦算法,无穷远端就会差很大一块,但对焦近景反而可能没事。这种偏差在调试初期根本不会暴露,直到用户拍远景时抱怨“拍不清”才知道坏了。所以行程标定必须发生在第一次点亮传感器之后、写对焦算法之前。

另一个值得注意的点是景深和允许弥散圆的关系。像素大约1.0微米、焦距4.7毫米、光圈F1.9的模组,在0.5米距离下的景深范围加起来可能只有几个厘米宽。镜头偏芯一旦导致焦面倾斜,画面边缘就会明显比中心偏。这类问题不归PDAF算法管,但它在PDAF调试阶段一定会干扰判断,所以要在调试早期先把模组光学品质测掉。否则你会把镜头装歪误判成对焦算法故障,浪费大量时间。

参数底表我建议做成表格,过一版刷一版,标注数据来源是规格书还是实测。项目后期追查问题时,这张表就是第一手证据。

2.2 调试工具清单和测试图卡布置

工具部分我习惯分成软件和硬件两类。

软件类主要用到四样:

  • 平台提供的相机调试工具,用来读写传感器寄存器、PDAF统计寄存器、马达驱动IC,以及抓取预览画面和RAW图。
  • 能打开RAW文件并显示像素坐标的分析软件,这个环节用来验证PD像素位置。
  • 拍摄参数记录脚本,把每一帧的PDAF统计值、马达码值、曝光时间、场景亮度一起记录成可排序的表格。
  • 对焦曲线标定脚本,最好能自动控制马达步进并记录清晰度评价函数,能省下大量重复劳动。

硬件类同样四样:

  • 光具座,用于精确标定马达行程和镜头极限位置。
  • 多距离目标卡座。我常用的距离档位是0.1米、0.3米、0.5米、1米、2米、5米、无穷远。注意每一档都要用平面目标,不能用倾斜目标代替。
  • 标准照度计,确保每轮验证的亮度和色温能复现。
  • 亮度可调的柔光箱,用来模拟从约1000勒克斯到约5勒克斯多个亮度档位。

工具准备解决的是“能不能立刻做”的问题,图卡布置才决定验证结论可不可信。测试卡要和镜头光轴垂直,卡面平整,不能用反光材质。贴卡时用带水平泡的夹具,花五分钟调垂直和水平,能省掉后面两小时对失焦原因的瞎猜。另外,目标距离的测量要统一参考点。我习惯以镜头前镜片表面为起点,而不是以手机后盖或者模组基板为起点。这个细节如果不统一,多轮验证的曲线会互相矛盾。

3. 核心调试环节的实操记录

3.1 相位像素数据通路验证

这个环节的目标只有一个:确认PDAF统计值是从正确的PD像素读出来的,方向正确、噪声合理。

我按这样的顺序操作:

  1. 在传感器初始化脚本里打开PDAF模式,把传感器输出配置成带PD像素的RAW格式。
  2. 抓一帧RAW,用分析软件找到左右相位点的实际坐标。
  3. 和驱动配置里的PD区域坐标做对比,确认行列位置不差。
  4. 让镜头分别停在离焦前方和后方,观察PDAF统计值的符号变化。符号不对时,优先检查坐标镜像和翻转有没有同步到平台侧。
  5. 在不同亮度下记录统计值的标准差,建立一条“亮度-噪声”基线。

整个环节最容易出三个问题。第一个是传感器切换binning模式以后PD像素没跟着切换,导致统计值混入非PD像素的信息。第二个是镜像翻转导致相位差方向和物理运动方向相反,对焦算法会把镜头往反方向推。第三个是统计窗口太小,噪声大到相位差一会儿正一会儿负,算法根本没法收敛。

我在测亮度噪声基线时遇到过一种情况:某个PD区域的统计值在高亮场景很稳定,到了低亮场景噪声直接放大三倍。排查半天发现是该区域本来就有一组坏点,在暗光下被异常点亮。处理办法很简单,把这些坏点坐标加进传感器坏点表,再把平台PDAF统计窗口的坏点排除功能打开。这个现象如果不做亮度扫档,只在高亮环境下验证的话,永远发现不了。

这个环节的产出不止是一句“通了”,还包括一份PD坐标确认记录、一份符号方向测试记录、一份亮度-噪声基线表。后续对焦曲线标定如果出现异常,先拿这三份数据对照,能省一半排查时间。

3.2 对焦曲线标定与马达行程写入

数据通路没问题之后,进入对焦曲线标定。先明确目的:对焦算法需要知道“目标在某个距离时,镜头该用哪个码值”,这组“距离-码值”的关系就通过标定来获得。

步骤分解:

  1. 通过驱动IC把马达推到机械最远端和最近端,记录两个方向对应的寄存器码值,同时用光具座确认极限位置。
  2. 从最大行程中找出成像合焦范围,不要盲目用满行程,机械结构两端往往存在非线性和回差区域。
  3. 目标距离从近到远排成一列,每个距离让马达从远端往近端来回扫,记录清晰度峰值对应的码值。
  4. 把多个距离的“距离-码值”组合拟合成对数曲线,或者按平台要求用分段线性插值写入校准表。
  5. 在低温和高温环境下各测一轮,生成温度补偿表。

这里必须提醒一个细节:标定时马达移动方向要统一。如果有的距离段从远端往近端扫,有的反过来扫,马达回差会把曲线弄得不平滑,拟合出来的表也会带锯齿。无论远近距离,统一从同一方向进入对焦搜索,可以有效抑制回差影响。

温度补偿对音圈马达尤其重要。音圈马达的磁路特性在低温下会变化,同样码值对应的镜头位置会偏移。项目里驱动工程师给过一个估算:环境温度从25度降到0度,某些马达的位移灵敏度会降低约6%。如果不做补偿,5米外的对焦点可能偏到4.5米。我调完曲线后实测的趋势基本吻合。所以温度补偿不是一个可选项,只要项目对低温场景有要求,就一定要做。

标定完成后的验证方式,是用一组未参与拟合的距离点做回验。比如拟合用了0.1米、0.5米、1米、3米、无穷远,回验就选0.3米、2米、5米。如果回验点对焦误差在景深范围内,曲线才算通过。只拿拟合点自测是典型的自欺欺人行为,一定要避免。

3.3 静态对焦准确率验证矩阵

标定完成,进入静态场景验证。我固定一张验证矩阵,每一轮都完整跑一遍,结果记录为“通过”或“不通过”,并附带原始数据。这张矩阵长这样:

目标距离照度(勒克斯)目标类型中心对焦边缘对焦
0.1米约1000高对比黑白卡通过通过
0.3米约1000纹理彩色卡通过边缘偏软
0.5米约500人像模拟卡通过通过
1米约200低对比灰卡通过通过
3米约100高对比黑白卡边缘偏软不通过
5米约1000远景建筑物场景通过边缘偏软

判断“通过”我用的标准是两条:画面清晰度指数不低于峰值清晰度的80%,同时对焦过程中马达没有明显的往返振荡。边缘对焦偏软时,先排查镜头模组焦面倾斜;排除模组问题后,再看PDAF统计窗口是否只覆盖画面中心区域。如果边缘对焦需求高,就要调大统计窗口范围。

这个环节最耗时间的其实是收集“偏软但不明显”的样本。单看一两张图很难看出问题,但把连续十次对焦的清晰度曲线拉出来,能看到某些场景稳定地差一截。处理方法是提高抽样次数:每个距离至少测10次,出现一次不合格就重测一轮,连续两轮不合格才真正记录为缺陷。这样能过滤掉偶发因素,也能暴露出系统性的偏软。

静态验证还有一个容易忽略的点:记录相机内部sensor温度。对焦长时间工作后,sensor温度会上升,热量传导给马达,导致同一码值对应的位置发生变化。如果调试时发现上午测的结果和下午不一致,先查温度数据,大概率能找到原因。

3.4 动态追焦和多摄切换验证

静态过了以后看动态。我固定做四个动态验证项目:

  • 目标在0.5米到3米之间来回移动,速度分别设为慢速、中速、快速。
  • 画面从亮场景瞬间切换到暗场景,再切回来。
  • 从微距瞬间切换到无穷远。
  • 多摄相机之间连续切换,确保切换后的第一次对焦正常。

第一个场景最能暴露PDAF和反差式对焦的切换策略问题。平台逻辑通常是先用PDAF粗对焦,快速靠近合焦点,再用反差式对焦精细收敛。如果粗对焦段给的时间太长,运动目标会跑出镜头对焦范围;如果反差收敛段的搜索窗口太小,低对比度目标又会收敛不到峰值。

我在这个平台上的调节经验:把PDAF粗对焦的收敛阈值从“相位差小于满量程20%”改成“相位差小于满量程35%”,提前切换反差式对焦,同时限制反差搜索只在对焦曲线的平滑区间内进行。改完之后,中速运动目标脱焦率明显下降。代价是低速或者静止目标的对焦时间会略微增加,但整机体验整体提升了。

多摄切换是我这个项目里比较特殊的场景。项目同时上了主摄、广角、长焦三颗摄像头,切换时确实出现过从长焦切回主摄后,主摄第一次对焦用了比平时多一倍时间的现象。排查后确认是切换时没有把上一颗摄像头的PDAF状态清掉,新摄像头加载了一次错误的对焦状态。后来在切换逻辑里增加了“摄像头关闭时复位PDAF状态,打开时重新加载校准表”的步骤,问题就消失了。这个坑很典型,做多摄项目的同行可以提前预防。

4. 常见问题与排查技巧实录

4.1 对焦偏移:偏前还是偏后,先分清是方向问题还是曲线问题

对焦偏移是投诉最多的现象。我遇到这种问题后的排查顺序是这样。

第一步,看PDAF统计值的符号。把镜头人为停在合焦点前和合焦点后,分别记录统计值的正负,确认符号和方向定义一致。这一条检查很快,能直接排除三分之一的问题。

第二步,看偏移是否随距离变化。如果近距离准、远距离偏,多半是对焦曲线中段斜率不对,重新标定中间距离点即可。如果所有距离都偏移相同的物理距离,更可能是马达码值和镜头位移的换算系数错了。

第三步,如果偏移总是固定偏向同一个方向,比如永远偏近,要考虑镜头主光线角(CRA)和传感器PD像素微透镜偏移不匹配。这个属于光学层面的系统误差,需要在PDAF统计值上叠加一个固定相位偏置。

第四步,极端温度下的偏移,优先查温度补偿表是否在正确生效。可以把温度补偿表临时屏蔽,在同一温度下比较对焦结果,很快就能确认补偿有没有真的起作用。

在项目里最常见的情况,是第二步和第三步混合出现。这时候不要急着加偏置,先重新标定一遍中段曲线,再用系统偏置去修正残余偏差。顺序反了的话,两个问题会互相掩盖。

4.2 弱光、低对比度场景下PDAF失效

弱光下最常见的表象是:对焦时间变长,甚至直接停在失焦位置。

先看统计方差。如果PDAF统计值在暗光下跳变幅度很大,说明噪声超限。试三种办法:

  • 扩大统计累计帧数,把多帧统计值平均后再给算法,代价是对焦时间变长。
  • 打开平台的低照度PDAF增强模式,部分传感器在暗光下会用特殊读出方式提高PD像素灵敏度。
  • 设一个可信度阈值,统计方差超过阈值时直接切反差式对焦,避免用坏的相位差硬算。

低对比度场景(比如一面纯色墙)的情况不同。PDAF统计值本身就缺少可检测的纹理,相位差信息很弱,属于“无中生有难”。这时候平台通常会做场景识别,判断对比度过低时主动切到反差式对焦。我调试时遇到过片刻画阈值过松,导致墙面场景总进入PDAF模式然后对不上焦。最后把场景识别阈值收紧,让低对比度场景优先走反差式,问题就消失了。

这个问题的排查关键在于拿数据和场景对照说话。弱光失效先看方差曲线,低对比失效看纹理统计量,两者处理路径完全不一样,不要一看到“PDAF失效”就统一调参。

4.3 马达回差引起的对焦抖动

问题现象是:对焦完成后,画面在一个小范围内来回颤,录像里晃得明显,单张静态照片反而不太看得出来。

马达哪怕闭环,在微米级移动时也存在回差,尤其是从两个不同方向逼近目标位置时,停点会有差异。调试手法是对所有方向不一致的场景做“同方向到位”处理:如果目标点在上一个位置的内侧,就先让马达越过目标点一点,再反向回拉到位。这个回拉量就是死区补偿,需要实测标定。

另一个常见原因是步进马达的启停参数没调好,过流保护误触发。马达刚走到位就触发保护,然后又重新启动,看起来就像对焦在抖动。这种问题靠改代码常常压不住,需要用示波器量马达驱动波形,确认电流和时序。我们最后把驱动IC的斩波模式换了,抖动就消失了。改驱动参数这一类操作,建议在量测数据支撑下进行,不要凭感觉。

4.4 多摄切换时的PDAF状态串扰

多摄项目的切换串扰,我列几种排查手段:

  • 在所有切换入口打印日志,输出当前摄像头的PDAF状态组ID,确认切换前后状态是否正确。
  • 检查每颗摄像头的PDAF校准数据表是否独立,文件名尽量用全小写加下划线,避免大小写混用导致加载错文件。
  • 给每颗摄像头分配独立的马达位置状态区,不要共用同一块公共内存区域。
  • 切换后立刻触发一次强制对焦,让新摄像头重新建立对焦基准,可以掩盖大部分状态残留类问题。

这个项目的经验是:串扰问题不到现场往往复现不出来,因为切换时序受上层调度影响很大。所以我测切换时用脚本连续切50次,统计每次对焦响应时间和准确性,基本能复现所有状态残留类问题。如果你在实验室怎么测都正常,但用户反馈切换后对焦异常,大概率就是这个方向。

5. 写在最后:三件比改代码更值得做的事

最后聊几句调试心态。PDAF调试最磨人的地方在于它太容易让人陷入“试来试去”。我刚做这类项目时,遇到偏焦就先加一个偏置试试,不行再加另一个,最后改了一堆参数,问题不但没解决,还把自己改糊涂了。吃了亏之后,慢慢形成一套习惯:对焦问题先分类——是统计值方向问题还是数值噪声问题;是马达机械问题还是曲线标定问题;是算法逻辑问题还是场景触发问题。每类问题用对应的工具去查,基本都能在两三轮内定位。

有三件比改代码更值得做的事,我想单独强调。

第一,硬件参数和实测数据一定要汇总成一张表。所有调试结论都要能落到表上的某个数据点。没有数据支撑的“我感觉”和“应该是”,在PDAF调试里是最贵的浪费。

第二,静态测试验证至少覆盖三个距离、两个亮度档位。只在一个环境验证通过的“正常”,很可能只是偶然现象。这个项目如果我只在高亮环境下调,大概永远发现不了那个暗光坏点问题。

第三,记录每一条修改和对应的现象变化。哪怕当时觉得没用,三天后回头看就是救命稻草。我当时靠这种记录才在隔了一周后回查时,快速定位到某次改统计窗口大小引起的弱光对焦衰退。

PDAF调试说到底不是调一个像素、一个寄存器,而是调一整条从光到电、从电到动的反馈链路。链路通了,对焦自然就快了。这也是我在这类任务里收获最大的部分:把看似玄学的问题,拆解成一组可测、可调、可复现的工程数据。下次你拿到新的平台项目、新的传感器,这套方法论依然能帮你省下大把时间。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进