035、高通Spectra ISP的IFE/BPS/IPE流水线深度解析——从RAW到YUV的硬件加速路径与Chromatix调优入口 035、高通Spectra ISP的IFE/BPS/IPE流水线深度解析——从RAW到YUV的硬件加速路径与Chromatix调优入口去年年底有个项目主芯片SM8250传感器IMX686客户反馈夜景模式预览取景框里暗部噪点像下雪但抓拍RAW用PC工具拉一下又觉得底子还行。当时我第一反应是IFE和IPE之间的带宽分配出了问题后来查下来果然TFE就是IFE的前身在SM8250上叫TFE输出的YUV直接进了IPE做降噪但IPE的时域降噪参考帧没对齐导致暗部细节被当成噪声抹掉了。这种问题如果你只看ISP的顶层框图永远找不到根因。今天就把Spectra这条流水线从RAW到YUV的硬件路径掰开揉碎顺便把Chromatix里对应的调优入口指给你。先明确一个概念高通Spectra在骁龙平台上ISP不是一颗大而全的芯片而是拆成了IFE、BPS、IPE三个独立硬件模块外加一个LPMLow Power Manager做电源和时钟控制。这三个模块各司其职但很多人搞混IFE和BPS的分工。简单说IFE是前端直接接传感器做的是RAW域的粗加工——坏点校正、黑电平、镜头阴影、去马赛克部分平台、色彩校正矩阵、Gamma还有最关键的它负责把RAW转成YUV或者直接输出统计信息给AEC/AWB/AF算法。BPS是后端的预处理它不接传感器接的是IFE或者内存里的RAW数据主要干两件事一是做高精度的降噪和边缘增强二是做多帧合成的对齐和融合前的预处理。IPE则是真正的后端接BPS或者IFE的输出负责YUV域的精细调整——色调映射、局部对比度、色彩增强、锐化、还有时域降噪。这里有个容易踩坑的点很多人以为RAW到YUV是一条直线IFE做完就出YUV了。实际上在Spectra里IFE输出的YUV是“快速预览路径”质量一般给取景框和视频预览用的。真正的高质量YUV尤其是拍照走的是IFE输出RAW或者BPS从内存读RAW→ BPS做多帧降噪和HDR合成 → 输出YUV → IPE做最终美化。这条路径的延迟比IFE直出高不少但画质是两码事。所以你在Chromatix里调参数时一定要先搞清楚当前场景走的是哪条路径否则你调IFE的降噪强度发现预览变了拍照没变那就是因为拍照根本没走IFE的降噪模块。再往细里说IFE的内部流水线。IFE在硬件上分几个子模块Crop、BNSBayer Noise Scaling、LSCLens Shading Correction、BPCBad Pixel Correction、Black Level、Demosaic部分平台在IFE做部分在BPS做、Color Correction、Gamma、CSCColor Space Conversion、还有统计引擎。这里重点说BNS这是高通比较有特色的模块它做的是Bayer域的降采样不是简单的抽行抽列而是带抗混叠滤波的。很多工程师调暗光噪点第一反应去调IFE的降噪强度其实暗光下BNS的降采样比例如果没设对高频噪声会折叠成低频色块这个在Chromatix里对应的是IFE_BNS_scale和IFE_BNS_filter_coeff两个参数。我见过有人把BNS的scale从1.0改成0.5噪点确实少了但解析力也掉了拍文字边缘全是锯齿。正确做法是配合Tuning的Sensor_Exposure来动态调整BNS的scale亮场景用1.0暗场景用0.75再配合BPC的强度别一刀切。BPS这边核心模块是MNALMotion Noise Adaptive Low-pass和MFSRMulti-Frame Super Resolution。MNAL是空域降噪MFSR是时域多帧融合。这里有个大坑MFSR的参考帧选择。BPS在做多帧合成时会从内存里读前一帧或者前几帧的RAW/YUV作为参考但参考帧的对齐精度直接决定融合质量。如果对齐没做好运动区域会出现鬼影静止区域会出现“涂抹感”。在Chromatix里MFSR的对齐强度由BPS_MFSR_motion_search_range和BPS_MFSR_confidence_threshold控制。我建议你把motion_search_range设成传感器满分辨率下的4像素confidence_threshold设成0.7左右这样既能保证暗光下的降噪效果又不会在手持轻微抖动时产生鬼影。别信那些“拉满就完事”的鬼话拉满的结果就是拍夜景人像头发边缘全是虚的。IPE这块最容易忽略的是它的时域降噪模块TNRTemporal Noise Reduction。TNR不是简单的帧间平均它带运动补偿而且运动补偿的精度是1/4像素。但TNR有个前提——它需要参考帧的YUV数据这个参考帧是存在DDR里的。如果你在低内存配置的机型上DDR带宽不够TNR的参考帧可能会被丢弃导致降噪失效。这时候你去看log会看到IPE_TNR_frame_dropped的计数在涨。解决办法不是调TNR参数而是去调LPM_clock_gating把IPE的时钟频率降下来减少带宽争抢。这个思路很多人想不到因为问题出在系统层面不是ISP算法层面。再说Chromatix的调优入口。高通把ISP参数组织成Chromatix库每个传感器对应一个XML文件里面按场景Scene和触发条件Trigger分类。你调IFE的参数找chromatix_ife_core节点调BPS找chromatix_bps_core调IPE找chromatix_ipe_core。但这里有个关键——每个core下面又分preview、video、snapshot、high_speed等不同use case参数是独立的。你改了snapshot的降噪不影响preview这是正常的。但很多人调完发现没生效是因为没改对use case或者改了但没重新编译chromatix库。记住改完参数后要跑chromatix_gen工具重新生成二进制然后push到手机/vendor/etc/camera/目录下重启cameraserver才生效。别问我怎么知道的当年我调了一个下午的IFE降噪最后发现是没重启服务。还有一个容易忽略的入口是chromatix_common节点这里面有全局的ISP_Global_Clock_Setting和ISP_Bus_Width_Setting。这两个参数决定了ISP各模块的时钟频率和数据位宽。如果你发现某个分辨率下ISP处理时间超标或者带宽不足导致丢帧先别急着调算法参数看看这两个设置是不是匹配。比如4K60视频录制IFE的时钟至少要设到480MHz数据位宽要设成16bit否则处理不过来。这个在量产调试时特别重要因为不同项目用的DDR频率不一样ISP的时钟上限也不同。最后说点个人经验。做Spectra调优别一头扎进Chromatix里调参数先花半天时间把平台的camx日志打开看每一帧的ISP pipeline耗时和带宽占用。高通有camxoverlay工具可以实时显示每个模块的负载。我见过太多人调了三天降噪最后发现是传感器输出的RAW格式不对导致IFE的BPC模块没生效。另外多帧合成场景下一定要验证BPS的MFSR和IPE的TNR是否同时开启这两个模块如果同时工作会互相干扰——MFSR已经做了时域融合TNR再做一次暗部会被抹成死黑。正确做法是开了MFSR就关掉TNR或者把TNR的强度降到最低。这个在Chromatix里没有直接的联动开关需要你在tuning脚本里写条件判断根据当前帧的ISO值来切换。做影像系统这行没有银弹每个平台都有自己的脾气。Spectra的脾气就是模块化太彻底导致问题定位难但好处是调优灵活。你只要把IFE/BPS/IPE的边界画清楚知道每个模块的输入输出是什么再配合Chromatix的调试工具大部分问题都能在半天内定位到根因。别指望一次调优就能覆盖所有场景量产机型的调优是持续迭代的过程每换一个传感器、每改一版驱动都要重新过一遍这条流水线。