TMS320F2833x处理器进行浮点运算最快捷的方法是直接使用浮点类型(定义float来完成)。但这样会使编译器产生大量代码来完成一段看似十分简单的浮点运算,不可避免地大量占用系统资源。定点处理器中如何对浮点运算进行高效处理变成十分重要的问题。
实现定点数和浮点数之间的转换,只需规定浮点数的整数位和小数位。以32位定点数为例,设转换因子为Q(即小数位数为Q),整数位数为31-Q(有符号数的情况),则定点数与浮点数的换算关系为定点数=浮点数×2 Q 。
例如,浮点数-2.0转换到定点数(Q=30):-2×2 30 =-2147483648。
32位有符号数的范围是-2147483648~2147483647。将2147483647转换为浮点数为2147483647/2 30 ,即1.999999999。
这表明Q30格式下,所能表示的最大浮点数为1.999999999(并不等于2),存在1E-9的误差。
表2-3所示为Q0~Q30对应的数据范围和分辨率。可借助MATLAB求取它们之间的转换,即在命令窗口中输入:
表2-3 Q0~Q30对应的数据范围和分辨率
例如,将5.0转换成Q格式,只能从iq1~iq28当中进行选择,而不能转换为iq29和iq30。因为iq29能转换的最大值为3.999999998,所以进行Q格式定标时要对数的范围做一下估计,也正是因为这个原因,诸如IQNsin、IQNcos、IQNatan2、IQNatan2PU、IQatan的三角函数不能采用Q30格式。
BootROM中内置了强大的数学表来帮助我们完成转换工作,只要按照一定的格式进行书写,编译器就会自动调用相关的库函数完成。TI公司所提供的IQMath库是由高度优化的高精度数学函数组成的集合,能够帮助C/C++编程人员将浮点算法无缝地连接到TMS320F2833x器件中,通过使用现成的IQMath库来完成这些烦琐的工作。
IQMath函数的输入/输出是典型的32位定点数据且定点数的Q格式可以在Q1和Q30之间变化。我们使用typedef来定义这些IQ数据类型。
(1)在工程中引用库文件
1)C语言编程时:包含头文件IQMathLib.h。
2)C++语言编程时:包含头文件IQMathLib.h和IQMathCPP.h。
(2)主程序中引用相关的头文件
1)C语言编程时:
2)C++语言编程时:
(3)CMD文件中指明IQMath数学表的位置