一些硬件优化技巧
我们知道,在处理器中最耗时的基本运算是乘除运算和小数计算,尤其是除法运算和小数计算可能还要涉及到浮点运算,这大大增加了设计的难度和运算时间。而对于ASIC设计来说乘除运算和小数运算是需要避免的,因为这些运算不仅消耗资源还会增加功耗。尤其是在ASIC设计中可以适当的降低数据的精度,从而换取资源和时I旬。下面就介绍一下我们的设计中这方面的经验。
1 乘法计算
对于乘运算来说,可以将其变换成加运算和移位的组合,这个很容易理解,
例如24×12,这个运算就可以拆分如下:
24×12=24×(8+4)=24×(1<<3+1<<2)=24<<3+24<<2
如上式推导,24X 12变换为了24先做两次移位再进行加运算的结果。这样就去除了乘运算,只需要进行加运算和移位运算。
2.小数运算
小数计算也是图像处理中常常会用到的,小数计算可以分为小数乘法和小数加法(小数除法可以转化为小数乘法,小数减法可以看作是小数加法)。
小数乘法其实可以看成是乘法和除法的结合,也就是说可以看作是乘以一个数之后再除以一个数。上面已经对乘法和除法硬件实现进行了讲解,那么就很容易想到将上面的优化方法相结合来实现小数乘法的运算。这并不是不可以,但是
对于精度要求不高的场合还有更加简单的方法,那就是将小数乘法转化为整数乘法和移位的组合,乘法进一步可以变换为左移运算和加法的组合。举例说明,例如随便给定一个数0.123,我们将它与2^n相乘,按照n从小到
大依次列出O.123×2^n的结果:0.123,0.246,0.492,0.984,1.968,3.936,7.872,
15.744,31.488,62.976⋯⋯。从观察我们可以看出,3.936和62.976非常接近整数,3.936≈4,62.976≈63,那么根据n的值,0.123就可以表示为4/2^5或是63/2^9。这种近似是否有意义呢,我们可以计算出近似值与原数据的差来衡量:
4/一0.123=0.125—0.123=0.002.0.002/0.123=1.6%
63/—0.123=0.000046875.0.000046875/0.123=0.038%
从上面的计算可以看出,近似值与原数据的差值很小,尤其是使用63/2^9进行近似所产生的误差可以忽略不计。如果进行K×0.123的计算,就可以近似为(K×63)>>9,如果精度要求不高,也可以近似为(K×4)>>5=K>>3,这样更加节省寄存器资源。所以使用这种近似方法就可以将小数乘法表示为整数乘法和移位的组合。从上面两个近似方案中也可以得出另一个结论,对于精度要求不高的计算可以使用误差较大而节省计算资源的方案,但如果精度要求较高,就必须使用更精确的方案,精度越高的近似值所消耗的寄存器位数越多。有了小数乘法的近似基础,对于小数加法也很容易找到解决方法。例如
K+0.123,按照上面的方法就可以近似为K+63>>9=(K<<9+63)>>9。这样小数加法就变成了整数加法和移位的组合。
另外,在除法运算中,当除数是常数时,我们可以将其看作是小数乘法,也就可以按照小数计算的近似方法来做处理。但是如果除数是变量,或者对除法的精度要求很高,那么就无法使用小数计算的近似方法了。在ISP系统设计的过程中我们发现,所有的小数计算都可以使用上面的近似方法,对最终输出结果的影响很小。经过我们的精巧设计,乘法运算、除法运算和小数运算都可以转化为整数的加法和移位运算的组合。这样的处理无疑大大降低了图像算法在进行硬件实现的难度。
颜色空间变换实际使用:
以下内容转载自刘斯宁的Digital Design Methods for ISP
颜色空间变换即Color Space Conversion,这是图像处理领域中经常用到的方法。图像的采集和显示一般都在RGB空间进行,这是因为采集设备(包括人眼)和显示设备的工作原理天然地符合RGB模型。但是图像信号的处理则大多在YUV空间进行,这就可以利用YUV空间具备的色度与亮度分离特性,针对亮度和色度选用不同的处理算法,互不干扰。
ITU-R BT.601 定义了一种RGB转YUV的方法,广泛应用于早期的模拟标清设备,采用的公式如下
它的一种等价形式是
ISP硬件中,一个必不可少的处理步骤就是将像素从RGB空间变换到YUV空间,该步骤可以使用以上公式实现。以亮度为例,该公式等价于
Y=(77R + 150G + 29B) / 256
将系数写成二进制形式的话,可以得到
r=77/256=0.01001101,
g=150/256=0.10010110,
b=29/256=0.00011101
在数字设计领域,除法可以用移位操作实现,因此得到Y公式的等价形式
Y=r*R + g*G + b*B
r*R=(R>>2) + (R>>5) + (R>>6) + (R>>8)
g*G=(G>>1)+(G>>4)+(G>>6)+(G>>7)
b*B=(B>>4)+(B>>5)+(B>>7)+(B>>8)
以上三个系数存在一个共同点,就是都包含4个移位运算,因此可以用相同的逻辑单元进行处理,这个逻辑单元可以设计4个移位单元和一个加法单元,如图所示。
将上述通用设计赋予不同的参数,可以针对r、g、b例化出3个实例,如下图所示。
以上设计通过并行化的方法,实现了在两个时钟周期内完成 Y=r*R + g*G + b*B 计算。
接下来继续计算U和V,先计算 dV=(R-Y) 和 dU=(B-Y),这需要设计两个减法单元:
然后再用移位的方法实现 V=dV/1.402 和 U=dU/1.772,此处使用到
1/1.402=23/32=0.10111,1/1.772=18/32=0.10010=0.01001+0.01001
至此即完成了RGB->YUV的计算。