前言
本文主要学习定点数以及浮点数,理解它们分别是什么,应该怎么样处理,同时以一个定点数的题目和高斯模板的定点化处理进行分析练习。
1、定点数和浮点数区别
浮点数和定点数的区别在于:定点数的小数点位置是固定不变的,而浮点数的小数点的位置不确定。比如 1.1*1.1 = 1.21 这就是浮点数,其小数点后由一位变成了两位,若取1.1 * 1.1 = 1.2 为定点数(定点一位小数),小数点后丢弃了一位,使得小数点的位置没有发生变化。
2、定点化处理的优点
FPGA不擅长进行浮点数的运算,一般采用移位的方式进行计算,先扩大倍数在进行相应的缩小,但是如果不进行定点化,而是直接进行放大一定倍数,其误差比较大,因此我们引入定点化处理,使得计算简单的同时误差更小。
3、定点化处理
定点化处理的步骤
1、确定量化的位宽,位宽越大量化的精度越高,但是也要结合逻辑资源来取。
2、根据位宽对整数和小数部分进行位宽的划分
3、根据小数部分的位宽进行整数定点值的确定,例如小数部分是8位,其最大的定点整数是256,那么就可以将小数部分量化到0~255(整数)范围。至此将小数部分转换成了整数。
4、对于矩阵来说也采用位宽的方式进行扩大,但由于矩阵图像映射关系,我们还需要进行对浮点数处理结果进行微调,避免直接定点化处理后造成的图像失真。
无损定点化
定点化处理中存在量化误差,该量化误差能进行计算。当我们对小数部分定点化处理后,得到一个整数值,该整数值/最大定点化整数值,即可得到该小数部分的反量化值,然后减去原来的小数部分,即可得到误差,再次利用有效位进行比对,即可知道是否为无损误差。
比如:0.928 用 8位定点化
1、则换成整数:0.928*256 = 238
2、对其反量化:238/256=0.930
3、减去原来的小数部分 0.930-0.928 = 0.002
4、有效位比对 ,原来的小数部分有效位3位,而0.002 小数点后后第三位是2,因此不是无损误差。
例题
该题目需要注意的是需要进行无损定点化,当求最小位宽的时候给出了两种,12和13位,我们即可先对12位进行无损误差的计算验证,如果是无损误差,那么最小位宽就是12位。在根据我们上面给出的步骤以位宽为11进行量化误差的计算。
解题如下
4、高斯模板定点化处理
对于高斯模板来说,也存在浮点数,比如高斯模板如下
0.0016 | 0.0163 | 0.0860 |
---|---|---|
0.2333 | 0.3253 | 0.2333 |
0.860 | 0.0163 | 0.0016 |
我们对其进行定点化处理,首先确定量化位宽的小数保留部分为10位,因此用移位操作对其进行2^10 = 1024 倍数的扩大。
1.630 | 16.710 | 88.106 |
---|---|---|
238.901 | 333.137 | 238.901 |
88.106 | 16.710 | 1.630 |
将该定点化后的小数部分进行取整
2 | 17 | 88 |
---|---|---|
239 | 333 | 239 |
88 | 17 | 2 |
标准的高斯函数的系数总和为1,扩大1024倍后,总和为1024,由于四舍五入带来的误差,系数也会造成偏差,导致图像失真同时不便于进行极值点检测,因此进行手动调整。
调整准则:必须保持系数和为1024,若系数和小于1024,那么将小数后一位接近0.5的上调,如果系数和大于1024,那么将小数后一位稍微超过0.5的下调;另外还要保证模板的对称性,系数和差1,改动最中间的系数,差2改动两边的系数。
可以计算出取整后系数总和为1025,因此差1,改动中间系数为332,因此调整后的高斯模板:
2 | 17 | 88 |
---|---|---|
239 | 332 | 239 |
88 | 17 | 2 |
这种模板调整更适用于FPGA进行处理,在很多场合均可应用。比如SIFT算法中的尺度空间构建步骤,需要用到高斯模板进行卷积,如果不进行定点化处理,直接将浮点数放大倍数来卷积计算,那么可能导致卷积后的图像失真,或者在极值点检测的过程中,导致没有办法定位真正的极值点,破坏尺度不变性等,因此我们遇到浮点数,对其进行定点化处理。