在博文JPL 公式由来讲解了JPL公式的由来广泛应用ISPPIPELINE中需要用到开方运算的模块中。比如所YUV域UV色域中计算器色度幅值大小。我们进一步思考有和在数学上是等价的那么在ISPPipeline为什么要大费周章的使用而不直接使用毕竟数学上两者是完全等价的出于什么缘由使用要好于呢一、优劣比较1.1、硬件实现优劣1不开方直接用 u2v2优点省面积、省功耗开方SQRT是 ISP 里大功耗、大面积运算流水线深、延迟高。速度快乘法 加法组合逻辑就能完成一拍出结果。容易定点实现u、v 一般 8~12bit平方后 16~24bit累加后仍可控。无精度损失风险开方模块本身需要近似牛顿迭代、查表会引入误差。缺点数值范围变大平方后动态范围翻倍比较阈值也要用更宽位宽。人眼感知不是线性的不开方得到的是 “能量”不是色度幅度调参不直观。另外ISPPIPELINE中都是按照固定位宽进行处理的。比如RAw域处理12bit转到yuv域处理10bit最后在输出8bit的yuv数据。那么在固定位宽的域中插入一个比位宽还大的一个数据不知道是否会增加硬件设计的复杂度或者芯片的面积大小比如是否存在以下问题呢平方值的麻烦如果直接输出 U2V2你会得到 20bit~24bit 的宽数据。这就要求统计 RAM、总线宽度、寄存器组全部扩容。开方的妙用开方是一个非线性压缩它能把 20bit 的大数强行 “压” 回 10bit。一举两得既得到了色度幅度又完美适配了现有 10bit/12bit 的标准统计接口不需要为了这一个计算去修改整个架构的位宽定义。2开方u2v2​优点物理意义清晰结果是色度幅度与人眼感知更接近调试阈值更直观。数值范围小阈值位宽窄比较逻辑简单。缺点硬件代价极高SQRT 一般需要多级迭代或大 ROM 查表增加关键路径延迟可能限制最高工作频率实现复杂容易引入定点量化误差增加面积与功耗对移动端 / 安防 ISP 不友好1.2、软件实现优劣CPU/DSP 上1不开方 u2v2优点极快只做乘法和加法无函数调用无循环迭代。避免浮点纯整数运算无精度坑。对嵌入式 CPU/DSP 极其友好。缺点阈值要提前平方调试时不够直观。2开方 sqrtf /sqrt优点代码直观阈值好理解。缺点浮点运算慢很多尤其在无 FPU 的 MCU 上。函数调用开销 流水线停顿。浮点转定点会有精度问题。1.3 连续控制曲线线性 vs 非线性如果是做开关Threshold绝对用 U2V2开方多余。如果是做连续控制Gain/Strength虽然 U2V2 也可以配 LUT 来控制但开方后的曲线更接近 “线性” 的心理感受。因为它能提供近似线性、符合人眼感知、平滑易调的控制曲线直接用平方和会导致控制曲线陡峭、低色度不敏感、高色度过激工程上不可用比如色度从 10 变到 20强度增加一点。用开方值10→20每增加 10强度增量均匀。用平方值100→400每增加 300强度瞬间拉满。工程现实直接用平方值控制曲线容易 “头重脚轻”高色度时控制反应过猛而开方后的数值更适合做线性映射控制起来更顺滑。如果是用平方值用来做类似线性插值的操作是否出现之前博文线性插值中当x,y坐标的数值大小数量级相差太大导致的问题出现的线性插值问题了。比如我想根据色度幅值的大小控制调整饱和度大小一般饱和度控制强度为0-100为10的2次方二平方值可能达到20bit~24bit大概10的6次方左右两者实在相差太大插值的时候可能存在一些精度损失或者截断或者溢出问题。二、总结对比维度平方值 U2V2 (理论最优)开方值 U2V2​ (工程现状)为什么选开方硬件代价极低(乘加运算一拍出)极高(迭代 / LUT费功耗)硬件更优不选它数值跨度20~24bit (大数难读)10~12bit (小数直观)调试方便 接口兼容控制手感曲线陡峭高饱和易溢出曲线平滑梯度稳定控制体验更好