ISP Pipeline RAW数据预处理——位宽扩展(移位/放大)说明
1. 概述
在ISP(图像信号处理器)流水线中,Sensor输出的RAW数据位宽通常为10-bit、12-bit或14-bit,而ISP内部处理单元采用固定的高位宽总线(如16-bit)。在进入核心算法模块之前,需对RAW数据进行位宽扩展,通常通过左移操作实现。
此操作并非简单放大,而是数据格式归一化的关键步骤,为后续减法、乘法等运算提供必要的数值空间。
2. 操作方式
映射规则:将输入RAW数据左移
(16 - N)位,其中N为Sensor输出位宽。示例:10-bit RAW数据左移6位,对齐至16-bit数据总线的高位,低6位补零。
实质:数据表示格式由
[0, 2^N - 1]映射至[0, 2^16 - 1]区间,物理含义不变,仅数值尺度改变。
3. 设计目的
| 目的 | 说明 |
|---|---|
| 统一硬件接口 | ISP内部计算单元(乘法器、加法器)采用固定位宽设计,通过预归一化处理,可使流水线兼容不同位宽的Sensor,简化硬件控制逻辑。 |
| 支持负值运算,保护暗部细节 | 黑电平校正(BLC)等模块需执行减法操作(减去暗电流偏移量)。若原始值范围过小,减去偏移量后接近黑色的像素会变为0或负数,在小位宽下负数无法表示,被截断后导致暗部细节永久丢失。扩展位宽后,配合有符号数表示,负值得以保留,为降噪、去马赛克等模块保留暗部纹理信息。 |
| 提高抗溢出能力,延迟饱和 | 后续色彩校正矩阵(CCM)与数字增益均为乘法运算。左移放大后,数值基数增大,中间结果整数部分占比提高,在多次乘加运算中能有效降低截断误差,并延迟像素值达到饱和(最大值)的时机,使高光区域过渡更平滑。 |
4. 注意事项
此操作不产生小数精度,不改变数据物理分辨率。
位宽扩展后的数据在内部处理中通常以有符号整数形式参与运算,确保减法结果可负。
最终输出前,需根据目标格式进行相应的右移截断和钳位(Clamp)操作,还原至标准动态范围。
5.是否可以不做移位处理?不做移位有什么副作用
如果强行跳过此操作,将Sensor的原始低位宽数据直接送入后续模块,虽然芯片能“跑通”,但会产生一系列严重的副作用,导致图像质量大幅下降。以下是详细的技术分析:
5.1. 硬件接口不匹配(直接副作用)
ISP内部的算术逻辑单元(ALU)、乘法器和累加器(MAC)是为固定位宽(如16-bit)设计的。
直接后果:如果不做移位,10-bit数据只占16-bit总线的低10位,高位始终为0。这会导致后续所有乘加运算的结果数值范围严重受限。例如,原本能累加到65535的中间结果,现在最大只能累加到1023,相当于动态范围被硬生生压缩了64倍,这在硬件上属于数据溢出前的“隐性截断”。
5.2. 黑电平校正(BLC)导致“暗部死黑”(最严重的副作用)
黑电平校正是ISP的第一个核心步骤,需要从像素值中减去一个固定的偏移量(如64)。
不做移位时:有效数据范围是0~1023。减去64后,所有小于64的像素值(深色区域)结果为负数。
副作用:在10-bit无符号数中,负数无法表示,硬件会强制将其饱和钳位(Clamp)为0。这意味着画面中原本富有层次感的极暗区域细节被直接抹除,变成一片毫无信息的“死黑”,且后续的降噪和去马赛克算法无法恢复这部分数据。
5.3. 数字增益(Digital Gain)导致“高光死白”
ISP需要根据环境亮度对RAW数据乘以增益系数(如2.0倍)。
不做移位时:最大值仅为1023。乘以2.0后,理想结果是2046,但16-bit寄存器依然只取其低10位,或直接溢出饱和。
副作用:画面中原本只是较亮的区域(如800~1023),乘以增益后会瞬间击穿最大值,被强制钳位为1023(全白)。这导致高光区域失去所有纹理,出现大面积的“死白”(过曝),且高光向低光过渡的渐变区会产生明显的硬截止断层。
5.4. 定点数乘法导致“精度断崖式下跌”
ISP为了节省算力,大量使用定点数(而非浮点数)进行乘法。例如计算数值 × 0.5,在定点数中通常转化为(数值 × 增益系数) >> 移位位数。
不做移位时:被乘数(RAW值)只有10位有效值,其整数部分占比过小。在进行右移还原时,小数部分会被直接丢弃。
副作用:导致量化误差急剧放大。特别是在暗光环境下,10-bit数据本来的信噪比就很低,若不放大直接运算,每一次乘除都会丢失低位比特,最终输出的图像会出现明显的色块断层(Posterization),原本平滑的天空或肤色会变成一圈圈的色带。
5.5. 统一流水线(Pipeline)兼容性丧失
现代ISP需要兼容不同厂商(Sony、Samsung、OV)输出的8/10/12/14-bit Sensor。
副作用:如果不做统一的左移对齐(归一化到16-bit高位),那么针对12-bit Sensor设计的降噪阈值参数,直接套用在10-bit Sensor上就会全部失效,因为两者的数值尺度不同。为了兼容,工程师必须为每种Sensor重写全套算法参数,导致固件极其臃肿且难以维护。