FPGA中浮点数的定点化处理技术及高斯模板定点化处理方法

前言

本文主要学习定点数以及浮点数,理解它们分别是什么,应该怎么样处理,同时以一个定点数的题目和高斯模板的定点化处理进行分析练习。

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.00160.01630.0860
0.23330.32530.2333
0.8600.01630.0016

我们对其进行定点化处理,首先确定量化位宽的小数保留部分为10位,因此用移位操作对其进行2^10 = 1024 倍数的扩大。

1.63016.71088.106
238.901333.137238.901
88.10616.7101.630

将该定点化后的小数部分进行取整

21788
239333239
88172

标准的高斯函数的系数总和为1,扩大1024倍后,总和为1024,由于四舍五入带来的误差,系数也会造成偏差,导致图像失真同时不便于进行极值点检测,因此进行手动调整。
调整准则:必须保持系数和为1024,若系数和小于1024,那么将小数后一位接近0.5的上调,如果系数和大于1024,那么将小数后一位稍微超过0.5的下调;另外还要保证模板的对称性,系数和差1,改动最中间的系数,差2改动两边的系数。
可以计算出取整后系数总和为1025,因此差1,改动中间系数为332,因此调整后的高斯模板:

21788
239332239
88172

这种模板调整更适用于FPGA进行处理,在很多场合均可应用。比如SIFT算法中的尺度空间构建步骤,需要用到高斯模板进行卷积,如果不进行定点化处理,直接将浮点数放大倍数来卷积计算,那么可能导致卷积后的图像失真,或者在极值点检测的过程中,导致没有办法定位真正的极值点,破坏尺度不变性等,因此我们遇到浮点数,对其进行定点化处理。


版权声明:本文为H19981118原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。