1. 高通Camera PDAF调试的核心逻辑与迁移背景
PDAF(Phase Detection Auto Focus,相位检测自动对焦)在高通Camera栈里一直是个让人又爱又恨的模块。爱的是它能让手机在光线尚可的场景下实现“秒对焦”,恨的是它的调试链路长、参数耦合度高,尤其是从Type2往Type3迁移的时候,稍有不慎就会出现对焦抽搐、拉风箱、甚至直接不合焦的问题。我最近刚在一个基于骁龙平台的项目上完成了这套迁移,踩了不少坑,也总结了一些可以复用的经验,这里一次性讲清楚。
先说说为什么会有Type2和Type3这两个概念。在高通Camera架构中,PDAF的数据流向和配置方式经历过一次比较大的调整。Type2模式下,PDAF的统计信息主要由ISP内部的硬件模块处理,AF算法从特定的统计通道读取相位差数据,然后计算出镜头需要移动的距离。这种模式的好处是链路短、延迟低,但缺点是灵活性差,不同sensor的PD像素排列方式不一样,硬件模块的适配成本很高。Type3模式则把PD数据的解析权下放到了更靠上的软件层,由专门的PD库或者算法模块来处理原始PD数据,再输出给AF算法。这样一来,sensor厂商可以更灵活地定义自己的PD pattern,平台端也不用为每一颗sensor去改硬件逻辑。
那为什么现在大家都在往Type3迁移?核心原因有两个。第一,多摄系统的普及让PD数据的来源变得复杂,广角、超广角、长焦可能用的是不同厂商的sensor,PD pattern五花八门,Type2那套硬件解析的方式已经扛不住了。第二,Type3模式下,PD数据的校准和补偿可以在软件层做更精细的处理,比如针对不同温度、不同光圈、不同对焦距离做分段补偿,这些在Type2里是很难实现的。
但迁移不是改个配置开关就完事的。Type2和Type3在数据格式、寄存器配置、算法接口、调试工具链上都有差异,如果只是照着文档把Type2的配置改成Type3,大概率会遇到对焦异常。我这次迁移的过程中,光是PD数据对齐就花了两天时间,后面又陆续解决了增益不匹配、ROI配置错误、置信度阈值不合理等问题。下面我会把整个迁移过程拆开,从架构理解到具体配置,再到问题排查,尽量把每个环节的“为什么”讲清楚。
1.1 Type2与Type3的本质差异
要理解迁移过程中会遇到什么问题,得先搞清楚Type2和Type3在数据流上的本质区别。Type2模式下,sensor输出的PD数据会直接进入ISP的PDAF硬件模块,这个模块负责把PD像素对进行相减,得到相位差信息,然后以统计值的形式提供给AF算法。AF算法拿到的是已经处理过的相位差,它不需要关心PD像素是怎么排列的,也不需要关心用的是哪种PD模式(比如屏蔽式、半屏蔽式、双光电二极管等)。
Type3模式下,sensor输出的PD数据会先经过一个叫PDAF Extract的环节,把原始PD像素提取出来,然后交给PD库进行处理。PD库会根据sensor的PD pattern配置,把PD像素对进行配对、相减、补偿,最终输出相位差。这个过程中,PD库需要知道很多细节信息,比如PD像素在sensor上的坐标、PD像素对的间距、PD像素的朝向、不同区域的补偿系数等。这些信息通常由sensor厂商提供,以XML或者头文件的形式集成到Camera栈里。
从调试的角度看,Type2的调试主要集中在ISP的PDAF模块参数上,比如ROI选择、增益补偿、阈值设置等。Type3的调试则要复杂得多,除了上述参数外,还要关注PD库的配置是否正确、PD数据是否对齐、PD像素的稀疏度是否合理等。我这次迁移遇到的第一个坑就是PD数据对齐问题,sensor厂商提供的PD坐标和实际输出的数据对不上,导致相位差计算出来完全是乱的。
1.2 迁移前必须确认的硬件与软件前提
在动手改配置之前,有几件事必须先确认清楚,否则后面会做很多无用功。第一,确认sensor是否支持Type3模式。不是所有sensor都支持Type3,有些老sensor只支持Type2,强行迁移会失败。确认的方法很简单,查sensor的datasheet或者直接问sensor厂商的FAE,看它是否支持PD数据以原始格式输出。第二,确认平台端的PD库是否已经集成。高通平台的PD库通常是和Camera HAL一起发布的,不同版本的HAL可能对应不同的PD库版本,需要确认当前使用的HAL版本是否包含Type3所需的PD库。第三,确认调试工具是否支持Type3。高通提供了一套PDAF调试工具,Type2和Type3的工具界面和参数项是不一样的,如果工具版本太老,可能无法正确解析Type3的数据。
我这次迁移之前,先花了一天时间做这些确认工作。结果发现手头的一颗sensor虽然支持Type3,但它的PD pattern配置文件和平台端PD库的版本不匹配,导致PD库无法正确解析。后来找sensor厂商要了一份更新后的配置文件才解决。所以这一步千万不能省,否则后面调试的时候会一头雾水。
2. Type3配置迁移的详细步骤与参数解析
确认完前提条件后,就可以开始正式的迁移工作了。我把整个过程分成了四个阶段:配置文件的替换与合并、PD库参数的校准、AF算法接口的适配、以及调试工具链的切换。每个阶段都有一些容易忽略的细节,下面逐一说明。
2.1 配置文件替换与合并的注意事项
Type2到Type3的迁移,最直观的变化就是配置文件。Type2的PDAF配置通常写在sensor的XML文件里,包括PD模式、PD像素坐标、ROI区域等。Type3则把这些配置拆成了两部分:一部分是sensor相关的PD pattern配置,通常由sensor厂商提供,以独立的XML或者头文件形式存在;另一部分是PD库的配置,包括库的路径、版本、初始化参数等,通常写在Camera HAL的配置文件中。
替换配置文件的时候,最容易犯的错误是直接覆盖。Type2的配置文件里可能还包含了一些其他模块需要的参数,比如AEC、AWB的配置,如果直接覆盖,可能会导致这些模块异常。正确的做法是把Type3的配置项合并到现有的配置文件中,保留其他模块的配置不变。我这次迁移的时候,就遇到过一个因为覆盖配置文件导致AEC曝光不准的问题,后来把AEC的配置项恢复回去才解决。
另外,PD pattern配置文件的格式也很重要。不同sensor厂商提供的配置文件格式可能不一样,有的用XML,有的用C头文件,有的甚至用二进制文件。高通平台的PD库通常支持XML格式,如果sensor厂商提供的是其他格式,需要先转换成XML。转换的时候要注意坐标系的定义,有些厂商用的是sensor坐标系,有些用的是图像坐标系,如果不一致,会导致PD数据错位。
2.2 PD库参数校准的关键点
PD库的校准是Type3迁移中最核心也最复杂的环节。PD库需要知道PD像素对的具体信息,才能正确计算出相位差。这些信息包括:PD像素对的坐标、PD像素对的间距、PD像素的朝向、PD像素的稀疏度、以及不同区域的补偿系数。
坐标和间距通常由sensor厂商提供,但补偿系数需要自己调试。补偿系数的作用是修正PD像素对之间的响应差异,因为制造工艺的原因,同一个sensor上不同位置的PD像素对可能存在响应不一致的情况,如果不补偿,会导致相位差计算出现偏差。补偿系数的调试方法一般是拍摄均匀亮度的场景,然后观察PD数据的分布,如果发现某个区域的PD数据明显偏离平均值,就需要调整该区域的补偿系数。
我这次调试的时候,发现画面中心区域的PD数据一直偏大,导致对焦总是往近处跑。后来查了PD库的日志,发现是中心区域的补偿系数设置得太大了,把补偿系数调小之后,对焦就正常了。这里要提醒一句,补偿系数的调整要循序渐进,每次调整的幅度不要超过5%,否则很容易调过头。
2.3 AF算法接口的适配
Type2和Type3的AF算法接口也不一样。Type2模式下,AF算法直接从ISP的PDAF模块读取相位差,接口比较简单,通常就是一个函数调用。Type3模式下,AF算法需要从PD库读取相位差,而PD库的输出格式可能和ISP的输出格式不一样,需要做一层转换。
转换的时候要注意单位。ISP输出的相位差通常是以像素为单位的,而PD库输出的相位差可能是以微米为单位的,如果不做单位转换,AF算法计算出来的镜头移动距离会完全错误。我这次迁移的时候,就因为这个单位问题,导致对焦时镜头移动距离过大,画面直接糊掉。后来在PD库的输出接口上加了一个单位转换,把微米转换成像素,问题才解决。
另外,AF算法的置信度阈值也需要重新调整。Type2模式下,置信度是由ISP硬件计算的,Type3模式下,置信度是由PD库计算的,两者的计算方式不一样,阈值也不能直接照搬。我一般是先把阈值设得宽松一些,然后根据实际对焦效果逐步收紧,直到找到一个既能快速对焦又不会误判的值。
2.4 调试工具链的切换与数据验证
Type2和Type3用的调试工具不一样。Type2通常用高通提供的PDAF调试工具,可以直接看到ISP输出的相位差和置信度。Type3则需要用PD库自带的调试工具,或者通过日志来观察PD数据。我这次迁移的时候,发现PD库的调试工具只能显示原始PD数据,不能直接显示相位差,需要自己写脚本把原始PD数据转换成相位差。
数据验证是迁移过程中必不可少的一步。我的做法是:先在Type2模式下拍摄一组标准场景,记录下每个场景的相位差和最终对焦位置;然后切换到Type3模式,拍摄同样的场景,对比两者的相位差和对焦位置。如果差异在可接受范围内,说明迁移基本成功;如果差异很大,就需要回头检查配置和参数。
我这次验证的时候,发现Type3模式下的相位差普遍比Type2模式小10%左右,一开始以为是配置问题,后来查了PD库的文档,发现是PD库默认做了一次增益补偿,把相位差缩小了。这个增益补偿是可以关闭的,关闭之后两者的相位差就基本一致了。
3. 实操过程中遇到的典型问题与排查方法
迁移过程中遇到的问题五花八门,我把其中最有代表性的几个整理出来,附上排查思路和解决方法,希望能帮到后面做同样迁移的人。
3.1 对焦抽搐与拉风箱问题
对焦抽搐是Type3迁移后最常见的问题,表现为镜头在焦点附近来回移动,无法稳定下来。这个问题的原因通常有三个:PD数据噪声太大、置信度阈值设置不合理、或者AF算法的滤波参数太激进。
排查的时候,先看PD数据的噪声水平。如果PD数据的波动范围超过相位差本身的20%,说明噪声太大,需要检查PD库的增益设置和补偿系数。我遇到过一次,PD数据的噪声达到了30%,后来发现是PD库的增益设置得太高了,把增益调低之后噪声就降下来了。
如果PD数据噪声正常,那就检查置信度阈值。置信度阈值太低,AF算法会把噪声当成有效信号,导致镜头来回移动;置信度阈值太高,AF算法又会忽略掉一些有效的相位差,导致对焦慢。我的经验是,先把阈值设在一个中间值,然后根据实际对焦效果微调,每次调整幅度不超过10%。
如果前两项都正常,那就检查AF算法的滤波参数。Type3模式下,PD数据的更新频率可能和Type2不一样,如果滤波参数还是照搬Type2的,可能会导致AF算法对PD数据的响应过快或过慢。我一般会把滤波参数调得比Type2稍微保守一些,让AF算法对PD数据的响应更平滑。
3.2 PD数据全零或全满问题
PD数据全零或全满是比较严重的问题,通常意味着PD库没有正确读取到PD数据。排查的时候,先确认sensor是否真的输出了PD数据。可以通过sensor的寄存器读取PD数据的输出状态,如果sensor没有输出PD数据,那就要检查sensor的PD模式配置是否正确。
如果sensor有输出PD数据,但PD库读到的全是零或全是满值,那就要检查PD库的配置。常见的原因包括:PD像素坐标配置错误、PD像素对的间距配置错误、PD库的输入格式配置错误等。我遇到过一次,PD库读到的数据全是零,后来发现是PD像素坐标配置成了图像坐标,而PD库期望的是sensor坐标,两者差了一个偏移量,修正之后数据就正常了。
还有一种可能是PD库的版本不匹配。不同版本的PD库对输入数据的要求可能不一样,如果PD库的版本和sensor厂商提供的配置文件不匹配,也可能导致数据读取异常。这种情况下,要么升级PD库,要么找sensor厂商要一份匹配的配置文件。
3.3 对焦精度下降问题
迁移到Type3后,有些场景下对焦精度会下降,表现为对焦位置总是偏离最佳焦点。这个问题的原因通常是PD数据的补偿不够准确,或者AF算法的镜头移动距离计算有误。
排查的时候,先看PD数据的线性度。在均匀亮度的场景下,PD数据应该和镜头的离焦量成线性关系。如果线性度不好,说明PD数据的补偿不够准确,需要重新校准补偿系数。我一般会用多个不同的离焦量拍摄一组照片,然后画出PD数据和离焦量的关系曲线,如果曲线不是直线,就说明补偿有问题。
如果PD数据的线性度正常,那就检查AF算法的镜头移动距离计算。Type3模式下,PD库输出的相位差单位可能和Type2不一样,如果AF算法没有做单位转换,计算出来的镜头移动距离就会偏大或偏小。我遇到过一次,对焦位置总是偏近,后来发现是PD库输出的相位差单位是微米,而AF算法以为是像素,导致计算出来的移动距离偏大,镜头移动过头了。
3.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方法 |
|---|---|---|---|
| 对焦抽搐 | PD数据噪声大 | 观察PD数据波动范围 | 降低PD库增益 |
| 对焦抽搐 | 置信度阈值不合理 | 检查置信度阈值设置 | 调整阈值,每次不超过10% |
| 对焦抽搐 | AF滤波参数太激进 | 检查AF滤波参数 | 调保守一些 |
| PD数据全零 | sensor未输出PD数据 | 读取sensor寄存器 | 检查sensor PD模式配置 |
| PD数据全零 | PD库配置错误 | 检查PD像素坐标和间距 | 修正配置 |
| PD数据全零 | PD库版本不匹配 | 检查PD库版本 | 升级PD库或更换配置文件 |
| 对焦精度下降 | PD数据补偿不准确 | 检查PD数据线性度 | 重新校准补偿系数 |
| 对焦精度下降 | 镜头移动距离计算有误 | 检查单位转换 | 添加单位转换 |
4. 迁移后的性能验证与长期维护建议
迁移完成之后,不能就这么算了,还得做一轮完整的性能验证,确保Type3模式下的对焦性能不低于Type2。验证的维度包括:对焦速度、对焦精度、功耗、以及在不同光照条件下的稳定性。
对焦速度的验证方法是:在标准光照条件下,拍摄一组从近到远、从远到近的场景,记录每次对焦的耗时。Type3模式下的对焦速度应该和Type2差不多,如果明显变慢,就要检查PD库的处理耗时和AF算法的响应速度。我这次迁移后,发现对焦速度比Type2慢了大约15%,后来查了PD库的日志,发现是PD库的初始化耗时比较长,把初始化移到相机启动阶段之后,对焦速度就恢复正常了。
对焦精度的验证方法是:拍摄一组分辨率测试卡,然后检查对焦后的图像清晰度。Type3模式下的对焦精度应该和Type2相当,如果明显下降,就要回头检查PD数据的补偿和AF算法的参数。我一般会用MTF(调制传递函数)来量化对焦精度,MTF值越高,说明对焦越准。
功耗的验证方法是:在连续对焦的场景下,测量相机的功耗。Type3模式下,PD库的处理会增加一些功耗,但通常不会太大。如果功耗明显增加,就要检查PD库的处理频率和AF算法的轮询间隔,适当降低处理频率可以节省功耗。
长期维护方面,有几点建议。第一,保留Type2的配置文件作为备份,万一Type3出现问题,可以快速回退。第二,记录迁移过程中的所有参数变更,方便后续排查问题。第三,定期检查PD库的版本更新,新版本通常会修复一些已知问题,提升对焦性能。第四,关注sensor厂商的PD pattern配置文件更新,有时候sensor厂商会优化PD pattern的设计,提升PD数据的质量。
4.1 不同光照条件下的对焦稳定性验证
Type3模式在不同光照条件下的表现可能和Type2不一样,尤其是低光照条件下。低光照时,PD数据的信噪比会下降,如果PD库的噪声抑制不够,可能会导致对焦不稳定。我这次迁移后,专门在低光照条件下做了一轮测试,发现Type3模式下的对焦成功率比Type2低了大约10%。后来调整了PD库的噪声抑制参数,把低光照下的对焦成功率提了上来。
低光照下的对焦稳定性验证方法是:在照度低于10 lux的环境下,拍摄一组不同距离的场景,记录对焦成功率和对焦耗时。如果对焦成功率低于90%,就需要调整PD库的噪声抑制参数或者AF算法的置信度阈值。我一般会把低光照下的置信度阈值调低一些,让AF算法更容易接受PD数据,但同时也会增加误判的风险,需要权衡。
强光下的对焦稳定性也不能忽视。强光下,PD数据可能会饱和,导致相位差计算错误。验证方法是:在照度高于10000 lux的环境下,拍摄一组场景,检查对焦是否准确。如果对焦不准,就要检查PD库的饱和处理逻辑,必要时增加饱和检测和补偿。
4.2 多摄切换时的PDAF一致性
现在的手机基本都是多摄系统,主摄、超广角、长焦可能都支持PDAF。迁移到Type3后,要确保不同摄像头之间的PDAF表现一致,否则在切换摄像头时会出现对焦跳变。我这次迁移的时候,就遇到主摄和长焦切换时对焦位置不一致的问题,后来发现是两颗sensor的PD库配置不一样,把配置统一之后问题就解决了。
多摄一致性的验证方法是:在同一个场景下,分别用不同的摄像头对焦,记录对焦位置和相位差。如果差异较大,就要检查各摄像头的PD库配置和AF算法参数是否一致。我一般会做一个表格,把各摄像头的关键参数列出来,逐一对比,确保没有遗漏。
4.3 长期维护中的版本管理
Type3的PD库和配置文件都是有版本的,不同版本之间可能存在兼容性问题。长期维护的时候,建议建立一个版本管理机制,记录每个版本的PD库、配置文件、以及对应的调试参数。这样在出现问题时,可以快速定位是哪个版本引入的。
我自己的做法是:每次更新PD库或配置文件时,都会在版本管理工具里打一个标签,并附上更新说明和测试结果。这样即使过了几个月,也能清楚地知道每个版本的变化。另外,建议定期回顾PD库的更新日志,看看有没有性能优化或问题修复,及时跟进。
4.4 实操心得与避坑建议
最后分享几条我在这次迁移中总结的心得。第一,不要迷信文档。文档里写的配置步骤往往是理想情况下的,实际调试时会遇到各种意外,一定要以实测数据为准。第二,多和sensor厂商的FAE沟通。PD pattern的配置和补偿系数,sensor厂商最清楚,遇到问题直接问他们,比自己去猜要快得多。第三,保留调试日志。PD库的日志里有很多有用的信息,比如PD数据的原始值、补偿后的值、置信度等,遇到问题时翻日志往往能找到线索。第四,不要一次改太多参数。每次只改一个参数,改完就测试,确认没问题再改下一个,否则出了问题都不知道是哪个参数导致的。
我在实际调试中发现,Type3的PD库对温度比较敏感,高温下PD数据会有漂移。后来在PD库的配置里加了一个温度补偿表,根据温度调整补偿系数,漂移问题就解决了。这个温度补偿表需要自己实测,方法是把手机放在不同温度的环境下,记录PD数据的变化,然后拟合出补偿曲线。虽然麻烦,但效果很好。
另外,Type3的PD库在处理高分辨率PD数据时,耗时可能会比较长,如果相机预览的分辨率很高,PD库的处理可能会成为瓶颈。我的做法是降低PD库的输入分辨率,只处理ROI区域内的PD数据,这样既能保证对焦精度,又能降低处理耗时。ROI区域的选择要根据实际场景来定,一般选择画面中心区域即可,因为大多数情况下用户对焦的主体都在画面中心。
还有一个容易被忽略的点是PD库的初始化时机。Type3的PD库需要在相机启动时初始化,如果初始化太晚,可能会导致首次对焦变慢。我一般会把PD库的初始化放在相机启动的早期阶段,确保在用户按下快门前PD库已经准备好。初始化的耗时取决于PD库的复杂度和sensor的PD pattern配置,一般在一百毫秒左右,如果超过两百毫秒,就要考虑优化了。
关于PD数据的对齐,我再补充一点。Type3模式下,PD库需要知道PD像素在sensor上的精确位置,这个位置通常由sensor厂商提供。但有时候sensor厂商提供的坐标是理论值,实际sensor上PD像素的位置可能会有偏差。这种情况下,可以通过拍摄特定的测试图案来校准PD像素的位置。测试图案一般是黑白相间的条纹,通过分析PD数据的变化,可以推算出PD像素的实际位置。这个过程比较繁琐,但能显著提升对焦精度。
最后再提一下调试工具的使用。高通平台的PDAF调试工具在Type3模式下功能有限,很多时候需要自己写脚本分析PD数据。我一般会用Python写一些简单的脚本,把PD库输出的原始数据转换成可视化的图表,这样能更直观地看到PD数据的分布和变化趋势。脚本不需要太复杂,能画出PD数据随离焦量变化的曲线就行。有了这个曲线,调整补偿系数和置信度阈值就方便多了。