036、Dual Conversion Gain的巧妙之处——一个电容如何解决低光和高光不可兼得的矛盾——DCG切换的时序控制与HDR融合的联动调优

发布时间:2026/8/12 14:42:08
036、Dual Conversion Gain的巧妙之处——一个电容如何解决低光和高光不可兼得的矛盾——DCG切换的时序控制与HDR融合的联动调优 036、Dual Conversion Gain的巧妙之处——一个电容如何解决低光和高光不可兼得的矛盾——DCG切换的时序控制与HDR融合的联动调优去年夏天在调试一颗车规级前视摄像头时客户反馈了一个极其刁钻的场景傍晚六点半车头正对西边低角度太阳路面阴影里蹲着一个穿深色衣服的行人。ISP的HDR融合算法在明暗交界处拉出了明显的鬼影而更让人头疼的是同一帧画面里天空的云层已经过曝成了纯白而行人身上的纹理却还埋在噪声里。我们当时用的是一颗支持DCG的BSI传感器标称动态范围120dB理论上不该是这个表现。我盯着寄存器表看了半天突然意识到问题可能不在HDR融合算法本身而在DCG的切换时序上——传感器在帧内切换高低转换增益时如果切换点落在曝光积分的中段等效于给像素的电荷积分过程人为制造了一个“阶梯”而这个阶梯的台阶高度恰好就是高低增益的比值。这个比值在融合算法里被当作常数来用但实际像素的响应曲线在切换点附近是非线性的于是融合权重算错了鬼影和噪声就都冒出来了。DCG的基本原理说白了就是给像素的浮置扩散节点FD并联一个额外的电容。低增益模式下这个电容接入FD的电荷-电压转换系数变小满阱容量变大能存下更多光生电子高光不饱和高增益模式下电容断开转换系数变大同样数量的电子能产生更高的电压低光信号被放大噪声被压下去。一个电容两种状态理论上解决了“一像素既要能看暗又要能看亮”的矛盾。但问题在于这个电容的接入和断开不是瞬间完成的它需要时间而且这个时间点必须精确地落在曝光积分结束之后、读出开始之前。如果落在积分中间电荷还在源源不断地从光电二极管转移到FD此时突然改变FD的电容FD上的电压会跳变这个跳变幅度等于电荷量乘以电容变化量而电荷量本身又是光强的函数——于是高光像素的跳变幅度大低光像素的跳变幅度小整个响应曲线在切换点处出现一个拐点这个拐点就是非线性失真的来源。我们当时在实验室里用积分球均匀光源拍了一组灰阶卡把DCG切换点从曝光积分的10%位置逐步挪到90%位置每个位置拍20帧然后提取灰阶卡上每个色块的灰度值拟合成响应曲线。结果非常直观切换点越靠近积分末端响应曲线的线性度越好切换点越靠近积分前端曲线在中间灰度区域出现明显的“S”形弯曲。这个S形弯曲就是融合算法里鬼影和噪声的元凶——因为HDR融合通常会把高增益帧和低增益帧的像素按权重混合权重系数是根据两帧的响应曲线标定出来的如果响应曲线在某个灰度区间发生了非线性偏移权重就会算错导致暗部像素被错误地赋予了高增益帧的权重而高增益帧在这个灰度区间的噪声是放大的于是暗部噪声被放大亮部像素被错误地赋予了低增益帧的权重而低增益帧在这个灰度区间的信号已经接近饱和于是亮部细节丢失。找到根因之后解决方案其实就两条路要么把DCG切换点严格锁定在曝光积分结束后的消隐期内要么在融合算法里引入一个“切换点位置”的补偿项。第一条路受限于传感器硬件设计有些传感器允许你通过寄存器配置切换点的精确位置有些则固定死在某个位置没法改。我们当时用的那颗传感器切换点位置是可配的但配置范围只有积分时间的5%到95%而且最小步进是1%——听起来很灵活但实际调起来发现切换点位置对响应曲线的影响不是线性的靠近积分末端时1%的步进对应的灰度偏差可能只有半个LSB但靠近积分前端时1%的步进对应的灰度偏差可能达到十几个LSB。所以光靠寄存器配置很难做到在所有光照条件下都完美。于是我们把重心放在第二条路上在融合算法里加一个“切换点位置”的实时估计器。具体做法是在每一帧的曝光积分开始前读取当前帧的曝光时间和增益配置然后根据传感器手册里给出的切换点位置与曝光时间的对应关系表插值出当前帧的切换点位置再把这个位置作为参数输入到融合权重计算模块里。这个对应关系表不是固定的它跟温度有关——电容的充放电速度受温度影响温度升高切换时间变长等效切换点位置会后移。所以我们又加了一个温度传感器每100ms读一次温度动态修正对应关系表。这套方案在实验室里跑了两周把温度从-20℃到85℃扫了一遍响应曲线的线性度偏差从原来的最大12%压到了2%以内鬼影和暗部噪声的问题基本消失。但这里有个坑必须提醒你切换点位置的估计不能只看曝光时间还得看光强。因为DCG切换的本质是FD电容的变化而FD上的电荷量是光强和曝光时间的乘积。同样的曝光时间强光下FD上的电荷多切换时电压跳变大弱光下电荷少跳变小。所以单纯用曝光时间查表在强光场景下会低估切换点的影响在弱光场景下会高估。我们后来在估计器里加了一个光强前馈项——用上一帧的全局平均亮度作为当前帧光强的近似然后把这个近似值乘到切换点位置的修正系数上。这个前馈项不需要很精确因为融合算法本身对切换点位置的敏感度在弱光下本来就低在强光下敏感度高所以只要保证强光下的修正方向正确弱光下的误差可以容忍。另一个容易被忽略的联动点是DCG切换和HDR融合的帧同步。很多传感器的DCG切换是逐帧进行的也就是说一帧用高增益下一帧用低增益然后两帧融合成一张HDR。这种情况下切换点位置只影响单帧的响应曲线不影响帧间融合。但有些传感器支持帧内DCG切换——在一帧的曝光积分过程中前半段用高增益后半段用低增益这样一帧就能同时获得高低增益信息但代价就是前面说的响应曲线拐点问题。我们当时用的就是帧内切换模式因为帧间切换在运动场景下容易产生鬼影帧内切换可以避免这个问题。但帧内切换对时序的要求极其苛刻切换点必须落在曝光积分的精确位置而且这个位置要跟传感器的行读出时序对齐——因为不同行的曝光积分起始时间不同如果切换点按全局时间固定那么不同行的实际切换点位置会随行号偏移导致画面上下部分的响应曲线不一致。我们当时用示波器抓了传感器的VSYNC和行同步信号发现切换点寄存器配置的是全局时间但实际生效是按行同步信号逐行触发的所以每行的切换点位置会有一个固定的行偏移。这个偏移量在传感器手册里没有明确写是我们通过拍均匀光场然后逐行分析灰度值才发现的。解决这个行偏移问题我们用了两个手段一是把切换点配置值减去一个行偏移补偿量这个补偿量等于行同步周期乘以行号二是把融合算法的权重计算从逐像素改成逐行——因为同一行的切换点位置一致所以同一行的响应曲线一致权重可以按行计算然后行内像素共享权重。这个改动让融合算法的计算量下降了不少因为权重计算从像素级变成了行级而且行级权重可以用查表实现不用每个像素都做除法。但代价是如果画面里有局部高光或局部阴影行级权重会在明暗交界处产生轻微的块状伪影——这个伪影在最终图像上表现为横向的细线不仔细看发现不了但用专业测试卡一测就能测出来。我们后来在行级权重的基础上加了一个3x3的平滑滤波把块状伪影抹掉了但代价是边缘锐度略有下降。这个取舍最终跟客户确认了他们更在意暗部噪声和鬼影边缘锐度下降1%以内可以接受。最后说点个人经验。DCG这个东西从原理上看就是一个电容开关但真正量产调优时你会发现它牵扯到传感器时序、ISP融合算法、温度补偿、行同步对齐、光强前馈五个维度任何一个维度没对齐最终图像上都会以噪声或鬼影的形式暴露出来。我的建议是如果你在调DCG相关的HDR问题先别急着动融合算法的权重先用均匀光场拍一组灰阶卡把响应曲线拉出来看如果曲线在中间灰度有拐点那八成是DCG切换点位置不对而不是融合算法的问题。另外传感器手册里给的切换点配置值往往是在常温下测的温度一变就要重新标定所以量产时一定要留一个温度补偿的校准接口别把切换点配置值写死。还有帧内DCG切换的行偏移问题很多传感器手册不会写你得自己用示波器抓时序或者用均匀光场逐行分析灰度值来反推——这个坑我踩过希望你别再踩一遍。