006、Sensor噪声源全解析:散粒噪声、读出噪声、暗电流、FPN与PRNU的测量与抑制
006、Sensor噪声源全解析散粒噪声、读出噪声、暗电流、FPN与PRNU的测量与抑制去年在调试某款车载环视摄像头时客户反馈夜间停车场画面“像在下雪”。我盯着示波器看了半小时发现暗场下像素值波动幅度达到12个DN——这根本不是ISP能压住的。后来拆了模组用液氮冷却sensor到-10℃噪声降到了3个DN。问题出在哪儿热噪声和暗电流耦合了。今天就把这些噪声的老底翻出来一个一个拆解。散粒噪声光子到达的随机性你躲不掉散粒噪声是光子本身的量子特性。光子到达sensor像素的速率服从泊松分布标准差等于均值的平方根。这意味着信号越强散粒噪声的绝对值越大但信噪比反而提高——这也是为什么暗光下噪点更明显。测量方法很简单用均匀光源照射sensor拍一组连续帧至少100帧对每个像素计算时间域上的标准差。如果标准差与像素均值的平方根成正比基本就是散粒噪声主导。注意光源必须稳定LED驱动纹波会引入额外波动这里踩过坑——用卤素灯加直流稳压电源更靠谱。抑制散粒噪声没有捷径。增大像素面积从1.0μm到1.4μm满阱容量翻倍、提高量子效率背照式比前照式好30%、或者用多帧降噪但会引入运动伪影。车载场景我倾向于物理方法用大像素sensor牺牲分辨率换信噪比。读出噪声ADC和模拟链路的“底噪”读出噪声是sensor读出电路从像素源跟随器到ADC引入的固定噪声与光信号无关。它决定了sensor的“本底噪声”——暗场下你能看到的最小信号。测量时盖住镜头绝对暗场拍多帧计算所有像素的标准差。如果这个值在1-3个DN之间12bit ADC算正常超过5个DN查一下供电纹波或者时钟抖动。有一次客户反馈暗场噪声异常我查了三天最后发现是MIPI时钟线走线太长串扰进了模拟电源——重新布局后噪声从7DN降到2DN。抑制读出噪声主要靠电路设计模拟电源用LDO单独供电别和数字电源共用、ADC参考电压用高精度基准源、像素源跟随器电流调大但功耗会上升。调试时可以用“双采样”技术——先读复位电平再读信号电平相减消除固定偏置。但注意双采样只能抑制FPN对随机噪声无效。暗电流温度每升高7℃噪声翻倍暗电流是sensor在没有光照时由于热激发产生的电子-空穴对。它随温度指数增长——Arrhenius公式告诉我们温度每升高7℃暗电流翻倍。车载摄像头夏天车内温度能到85℃暗电流会从室温下的10e-/s飙升到160e-/s。测量方法把sensor放在恒温箱里设置不同温度-20℃、0℃、25℃、60℃每个温度点拍100帧暗场取像素均值。画ln(暗电流) vs 1/T的曲线斜率就是激活能通常0.6-0.8eV。如果斜率异常可能是像素工艺缺陷——遇到过一批sensor暗电流不均匀后来发现是外延层掺杂浓度漂了。抑制暗电流主动冷却TEC制冷片但功耗大、像素设计钉扎光电二极管比普通PN结好10倍、或者用暗场校准帧每帧减去暗电流基线。但校准帧只能减固定部分温度变化导致的漂移需要实时补偿——我做过一个方案在sensor边缘放几个遮光像素实时监测暗电流变化动态调整黑电平。FPN固定模式噪声每一颗sensor都有自己的“指纹”FPN是像素之间固定的响应差异包括列FPN列放大器失配和像素FPN像素晶体管阈值电压差异。它不随时间变化但随温度、增益变化。测量方法均匀光照下拍一帧减去多帧平均后的“干净帧”剩下的就是FPN。如果看到竖条纹是列FPN如果看到随机分布的亮点/暗点是像素FPN。有一次调试安防摄像头发现画面有规律的“网格状”噪声查了三天发现是sensor的列ADC参考电压走线有电阻压降——每列参考电压差几个mV导致列增益不一致。抑制FPN双采样CDS可以消除像素FPN但对列FPN无效。列FPN需要用“列校准”——每列单独存储暗场偏移和增益系数实时校正。注意校准表需要随温度更新否则温度变化后校准反而引入新噪声。我踩过这个坑用室温校准表在60℃下运行FPN反而从0.5%恶化到1.2%。PRNU光响应非均匀性像素对光的“偏心”PRNU是像素对相同光照的响应差异通常用百分比表示标准差/均值。它随信号强度增大而增大因为每个像素的量子效率和微透镜对准有细微差异。测量方法用均匀光源积分球最好拍不同光照水平下的图像每个光照水平拍多帧平均然后计算每个像素的响应曲线。PRNU通常用“光响应非均匀性”指标——在50%饱和信号下PRNU应该小于1%高端sensor能做到0.3%。抑制PRNU出厂时做一帧校准每个像素存一个增益系数但注意校准只在特定增益和温度下有效。车载场景我建议做“多点校准”——至少三个光照水平低、中、高用线性插值。别用单点校准否则在暗光下PRNU会放大——因为暗光下散粒噪声占主导PRNU被掩盖但校准系数会错误地放大暗像素。实战一个完整的噪声测量流程以某款1/2.3英寸、2.0μm像素的手机sensor为例暗场噪声盖镜头拍100帧计算每帧均值和标准差。如果标准差3DN12bit查电源纹波。我遇到过LDO输出纹波10mV噪声从2DN跳到6DN——换了个PSRR高的LDO解决。散粒噪声验证用积分球提供均匀光照从暗到饱和拍10个光照水平每个水平拍100帧。画log(标准差) vs log(均值)曲线斜率0.5是散粒噪声主导斜率0是读出噪声主导。如果斜率0.5可能有闪烁噪声1/f噪声——查一下sensor的PLL时钟。暗电流测量恒温箱设置25℃、45℃、65℃每个温度拍100帧暗场。计算每帧均值画Arrhenius图。如果暗电流在65℃超过100e-/s考虑加散热片或者降低帧率帧率越高暗电流积分时间越短但读出噪声会增大。FPN和PRNU分离拍一帧均匀光照图像减去多帧平均后的“干净帧”得到FPN散粒噪声。再对多帧平均后的图像做空间域标准差得到PRNU。如果PRNU1%查微透镜对准——有一次发现sensor封装时微透镜偏移了0.5μmPRNU从0.5%恶化到2%。个人经验性建议别迷信“低噪声sensor”的datasheet。datasheet上的噪声值通常是在理想条件下测的低温、低增益、慢速读出实际系统中噪声至少翻倍。我习惯在项目初期就做“噪声预算”——把散粒噪声、读出噪声、暗电流、FPN、PRNU、ADC量化噪声、电源纹波噪声、时钟抖动噪声全部列出来加起来不超过目标信噪比的1/3。调试时先测暗场再测亮场。暗场噪声大先查电源和时钟亮场噪声大先查光学系统镜头脏污、微透镜对准。别一上来就调ISP降噪参数——那是在掩盖问题不是解决问题。最后记住一个经验公式sensor的“本底噪声”读出噪声暗电流决定了动态范围的下限散粒噪声决定了信噪比的上限。你可以在ISP里压掉FPN和PRNU但散粒噪声和读出噪声是物理极限只能通过硬件设计来改善。下次遇到“画面噪点”先问自己是光子不够还是电路不行