017、PDAF 像素技术深度解析遮罩式、双PD式对焦像素的读出时序与数据处理一、从一次“对焦抽搐”的现场说起去年Q3我接手一个旗舰机项目Sensor是IMX7xx系列双PD像素客户反馈暗光下对焦“像癫痫发作”——画面忽远忽近偶尔还卡在某个位置不动。我第一反应是AF算法参数没调好但翻遍log发现PD值波动异常大相邻帧的相位差能差出3~4个像素。更诡异的是在均匀光照的灰卡下PD值居然也有±1.5像素的抖动。当时团队里有人怀疑是Sensor坏了有人说是LSC校正没做。我让FAE抓了raw图逐行看PD像素的读出值才发现问题双PD像素的左右半区读出时序有错位导致相位差计算时混入了行间噪声。这个坑后来在遮罩式PDAF上也遇到过只是表现形式不同。二、遮罩式PDAF老派但依然能打的方案遮罩式PDAF说白了就是在普通像素上盖个“半边帽子”——一半像素遮左一半像素遮右。读出时这些遮罩像素和普通像素混在一起通过MIPI接口一股脑儿传给ISP。读出时序的“暗坑”遮罩像素的读出顺序取决于Sensor的Hblank和Vblank设计。常见做法是每一行里遮罩像素和普通像素按固定pattern排列比如每4个普通像素插1个遮罩像素。读出时Sensor的ADC会按行顺序扫描遮罩像素的积分时间与普通像素完全同步——这里有个容易被忽略的点遮罩像素因为遮光光电转换效率低实际信号强度只有普通像素的30%~50%但读出时间窗口是一样的。我踩过的一个坑某款Sensor的遮罩像素在读出时ADC的增益通道和普通像素共用但遮罩像素的暗电流特性不同导致读出值里混入了固定模式噪声FPN。当时调试时发现遮罩像素的左右差值在暗场下居然有0.5%的偏移后来在ISP里加了逐像素的遮罩校正表才搞定。数据处理从raw到相位差遮罩式PDAF的数据处理核心是“配对”。假设Sensor输出raw图我们需要找到同一行里相邻的左遮罩像素和右遮罩像素计算它们的亮度差值。这个差值就是相位差的基础。伪代码示意别这样写实际要处理边界和坏点// 假设raw图是Bayer格式遮罩像素标记为mask_left和mask_right// 这里踩过坑遮罩像素的坐标偏移量因Sensor而异别硬编码for(introw0;rowheight;row){for(intcol0;colwidth;col){if(is_mask_left(row,col)){// 找到同一行最近的右遮罩像素intright_colfind_next_mask_right(row,col);if(right_col!-1){intphaseraw[row][right_col]-raw[row][col];// 这里要除以增益差遮罩像素的增益通常比普通像素高1~2倍phasephase*gain_ratio;// 存入相位图phase_map[row][col]phase;}}}}实际工程中遮罩像素的密度决定了相位图的分辨率。比如每4x4像素里放1个遮罩像素那么相位图的分辨率就是raw图的1/16。这个分辨率直接影响AF的精度——分辨率太低对焦会“跳步”。三、双PD式PDAF每个像素都是半个侦探双PD像素也叫2x1 OCL片上透镜每个像素内部被分成左右两个光电二极管共享一个微透镜。读出时左右半区可以独立读出也可以合并成一个普通像素。读出时序的“双通道陷阱”双PD像素的读出通常有两种模式独立模式左右半区分别读出输出两倍于普通像素的数据量。比如2M的双PD像素独立模式输出4M数据。合并模式左右半区在Sensor内部合并输出2M数据但保留相位信息通过差分信号。我遇到的那个“对焦抽搐”问题就是出在独立模式下的读出时序。Sensor的ADC在读取左右半区时存在一个微小的行间延迟——左半区读完后右半区要等一个像素时钟周期才开始读。这个延迟在高速读出时比如60fps会被放大导致左右半区的积分时间差了约0.5个像素时钟。对于暗光场景这个时间差足以让相位差产生1~2个像素的偏移。解决方案是在ISP里做“时序补偿”根据Sensor的读出速率和行数计算每个像素的延迟量然后在相位差计算时减去这个偏移。这个补偿值需要随帧率、曝光时间动态调整否则高帧率下会过补偿。数据处理差分信号的“去噪艺术”双PD像素的相位差计算比遮罩式简单——左右半区是同一个像素内的两个子像素不需要跨像素配对。但简单不代表容易噪声问题更突出。// 双PD像素的相位差计算// 注意左右半区的增益必须一致否则相位差会偏// 这里踩过坑某些Sensor的左右半区增益通道独立需要校准for(introw0;rowheight;row){for(intcol0;colwidth;col){// 假设raw图里左右半区交替存储uint16_tleftraw[row][col*2];uint16_trightraw[row][col*21];// 差分信号intdiffleft-right;// 归一化除以总和消除光照影响floatphase(float)diff/(leftright1);// 这里要加一个阈值防止除零和噪声放大if(leftrightNOISE_THRESHOLD){phase0;// 暗场下直接置零别算}phase_map[row][col]phase;}}这个归一化操作看似简单但暗场下leftright接近0时phase会剧烈抖动。我见过有人用除法后直接取整结果暗场下相位图全是雪花点。正确的做法是先做降噪滤波再归一化最后对低信噪比区域做掩膜处理。四、两种方案的对比与选型建议遮罩式PDAF的优势在于成本低普通Sensor加个mask就能实现但相位图分辨率低且遮罩像素的FPN校正麻烦。双PD像素的相位图分辨率高每个像素都有相位信息但读出数据量大对ISP带宽和时序要求高。从调试经验看如果Sensor是1/2.3英寸以下的小底遮罩式PDAF够用但要做好遮罩像素的暗电流校正。如果是1/1.7英寸以上的大底双PD像素是主流但必须关注读出时序的抖动尤其是高帧率场景。还有一种混合方案部分像素用双PD部分用遮罩这种方案在华为Mate系列上见过但调试复杂度翻倍不推荐新手尝试。五、个人经验性建议别迷信Sensor的datasheet上面写的读出时序参数通常是理想值。实际量产时不同批次Sensor的ADC延迟可能差10%~20%。一定要在产线上做时序校准用灰卡拍100帧统计相位差的均值与方差超出阈值就调整补偿参数。相位差计算前先做坏点校正双PD像素的左右半区如果有一个是坏点算出来的相位差会直接带偏AF。我习惯在ISP里加一个“双PD坏点检测”模块如果左右半区的差值超过正常范围比如3倍标准差就把这个像素标记为无效不参与AF计算。暗光下的相位差宁可不算也别乱算当信噪比低于某个阈值比如SNR10dB直接让AF切换到对比度检测模式。强行用PDAF只会让对焦抽搐这是我在项目里用血泪换来的教训。调试时一定要看相位图的直方图正常场景下相位差应该集中在0附近呈高斯分布。如果直方图出现双峰或偏态说明读出时序或校正参数有问题。这个习惯帮我快速定位了至少3个Sensor的时序bug。最后别把PDAF当成万能药它只解决“对焦方向”和“对焦距离”的粗估计精细对焦还得靠对比度检测。好的AF算法是PDAF和CDAF的混合体PDAF负责“快”CDAF负责“准”。写到这里想起那个“对焦抽搐”的项目最后发现是Sensor的MIPI时钟抖动导致左右半区读出错位。换了晶振后问题消失。有时候问题不在算法而在硬件。做影像系统得懂点硬件不然被坑了都不知道怎么死的。
017、PDAF 像素技术深度解析:遮罩式、双PD式对焦像素的读出时序与数据处理
发布时间:2026/6/5 9:53:24
017、PDAF 像素技术深度解析遮罩式、双PD式对焦像素的读出时序与数据处理一、从一次“对焦抽搐”的现场说起去年Q3我接手一个旗舰机项目Sensor是IMX7xx系列双PD像素客户反馈暗光下对焦“像癫痫发作”——画面忽远忽近偶尔还卡在某个位置不动。我第一反应是AF算法参数没调好但翻遍log发现PD值波动异常大相邻帧的相位差能差出3~4个像素。更诡异的是在均匀光照的灰卡下PD值居然也有±1.5像素的抖动。当时团队里有人怀疑是Sensor坏了有人说是LSC校正没做。我让FAE抓了raw图逐行看PD像素的读出值才发现问题双PD像素的左右半区读出时序有错位导致相位差计算时混入了行间噪声。这个坑后来在遮罩式PDAF上也遇到过只是表现形式不同。二、遮罩式PDAF老派但依然能打的方案遮罩式PDAF说白了就是在普通像素上盖个“半边帽子”——一半像素遮左一半像素遮右。读出时这些遮罩像素和普通像素混在一起通过MIPI接口一股脑儿传给ISP。读出时序的“暗坑”遮罩像素的读出顺序取决于Sensor的Hblank和Vblank设计。常见做法是每一行里遮罩像素和普通像素按固定pattern排列比如每4个普通像素插1个遮罩像素。读出时Sensor的ADC会按行顺序扫描遮罩像素的积分时间与普通像素完全同步——这里有个容易被忽略的点遮罩像素因为遮光光电转换效率低实际信号强度只有普通像素的30%~50%但读出时间窗口是一样的。我踩过的一个坑某款Sensor的遮罩像素在读出时ADC的增益通道和普通像素共用但遮罩像素的暗电流特性不同导致读出值里混入了固定模式噪声FPN。当时调试时发现遮罩像素的左右差值在暗场下居然有0.5%的偏移后来在ISP里加了逐像素的遮罩校正表才搞定。数据处理从raw到相位差遮罩式PDAF的数据处理核心是“配对”。假设Sensor输出raw图我们需要找到同一行里相邻的左遮罩像素和右遮罩像素计算它们的亮度差值。这个差值就是相位差的基础。伪代码示意别这样写实际要处理边界和坏点// 假设raw图是Bayer格式遮罩像素标记为mask_left和mask_right// 这里踩过坑遮罩像素的坐标偏移量因Sensor而异别硬编码for(introw0;rowheight;row){for(intcol0;colwidth;col){if(is_mask_left(row,col)){// 找到同一行最近的右遮罩像素intright_colfind_next_mask_right(row,col);if(right_col!-1){intphaseraw[row][right_col]-raw[row][col];// 这里要除以增益差遮罩像素的增益通常比普通像素高1~2倍phasephase*gain_ratio;// 存入相位图phase_map[row][col]phase;}}}}实际工程中遮罩像素的密度决定了相位图的分辨率。比如每4x4像素里放1个遮罩像素那么相位图的分辨率就是raw图的1/16。这个分辨率直接影响AF的精度——分辨率太低对焦会“跳步”。三、双PD式PDAF每个像素都是半个侦探双PD像素也叫2x1 OCL片上透镜每个像素内部被分成左右两个光电二极管共享一个微透镜。读出时左右半区可以独立读出也可以合并成一个普通像素。读出时序的“双通道陷阱”双PD像素的读出通常有两种模式独立模式左右半区分别读出输出两倍于普通像素的数据量。比如2M的双PD像素独立模式输出4M数据。合并模式左右半区在Sensor内部合并输出2M数据但保留相位信息通过差分信号。我遇到的那个“对焦抽搐”问题就是出在独立模式下的读出时序。Sensor的ADC在读取左右半区时存在一个微小的行间延迟——左半区读完后右半区要等一个像素时钟周期才开始读。这个延迟在高速读出时比如60fps会被放大导致左右半区的积分时间差了约0.5个像素时钟。对于暗光场景这个时间差足以让相位差产生1~2个像素的偏移。解决方案是在ISP里做“时序补偿”根据Sensor的读出速率和行数计算每个像素的延迟量然后在相位差计算时减去这个偏移。这个补偿值需要随帧率、曝光时间动态调整否则高帧率下会过补偿。数据处理差分信号的“去噪艺术”双PD像素的相位差计算比遮罩式简单——左右半区是同一个像素内的两个子像素不需要跨像素配对。但简单不代表容易噪声问题更突出。// 双PD像素的相位差计算// 注意左右半区的增益必须一致否则相位差会偏// 这里踩过坑某些Sensor的左右半区增益通道独立需要校准for(introw0;rowheight;row){for(intcol0;colwidth;col){// 假设raw图里左右半区交替存储uint16_tleftraw[row][col*2];uint16_trightraw[row][col*21];// 差分信号intdiffleft-right;// 归一化除以总和消除光照影响floatphase(float)diff/(leftright1);// 这里要加一个阈值防止除零和噪声放大if(leftrightNOISE_THRESHOLD){phase0;// 暗场下直接置零别算}phase_map[row][col]phase;}}这个归一化操作看似简单但暗场下leftright接近0时phase会剧烈抖动。我见过有人用除法后直接取整结果暗场下相位图全是雪花点。正确的做法是先做降噪滤波再归一化最后对低信噪比区域做掩膜处理。四、两种方案的对比与选型建议遮罩式PDAF的优势在于成本低普通Sensor加个mask就能实现但相位图分辨率低且遮罩像素的FPN校正麻烦。双PD像素的相位图分辨率高每个像素都有相位信息但读出数据量大对ISP带宽和时序要求高。从调试经验看如果Sensor是1/2.3英寸以下的小底遮罩式PDAF够用但要做好遮罩像素的暗电流校正。如果是1/1.7英寸以上的大底双PD像素是主流但必须关注读出时序的抖动尤其是高帧率场景。还有一种混合方案部分像素用双PD部分用遮罩这种方案在华为Mate系列上见过但调试复杂度翻倍不推荐新手尝试。五、个人经验性建议别迷信Sensor的datasheet上面写的读出时序参数通常是理想值。实际量产时不同批次Sensor的ADC延迟可能差10%~20%。一定要在产线上做时序校准用灰卡拍100帧统计相位差的均值与方差超出阈值就调整补偿参数。相位差计算前先做坏点校正双PD像素的左右半区如果有一个是坏点算出来的相位差会直接带偏AF。我习惯在ISP里加一个“双PD坏点检测”模块如果左右半区的差值超过正常范围比如3倍标准差就把这个像素标记为无效不参与AF计算。暗光下的相位差宁可不算也别乱算当信噪比低于某个阈值比如SNR10dB直接让AF切换到对比度检测模式。强行用PDAF只会让对焦抽搐这是我在项目里用血泪换来的教训。调试时一定要看相位图的直方图正常场景下相位差应该集中在0附近呈高斯分布。如果直方图出现双峰或偏态说明读出时序或校正参数有问题。这个习惯帮我快速定位了至少3个Sensor的时序bug。最后别把PDAF当成万能药它只解决“对焦方向”和“对焦距离”的粗估计精细对焦还得靠对比度检测。好的AF算法是PDAF和CDAF的混合体PDAF负责“快”CDAF负责“准”。写到这里想起那个“对焦抽搐”的项目最后发现是Sensor的MIPI时钟抖动导致左右半区读出错位。换了晶振后问题消失。有时候问题不在算法而在硬件。做影像系统得懂点硬件不然被坑了都不知道怎么死的。