我先介绍一下IQMath库,首先IQMath是干什么的?在计算机中,我们对于小数有两种使用方式,即定点与浮点类型,我们常用的float与double都属于浮点型。浮点型的好处是可以表示范围较大,但在计算中速度会慢;定点的范围比较固定,但是计算速度快。至于其他区别,大家可以到网上搜索,有非常全面的解答。而在28377里IQMath就可以进行浮点对定点的转换,定点转浮点,定点的各种计算函数。这样便可以加快我们计算的速度。同时,28377也支持将程序直接编译成定点的模式,加速计算。
在开始前先给发给大家一些IQMath使用教程,因为我对IQMath的具体函数没有进行大量的测试,因为我没有实际的应用场景,这里给大家一些链接,可以移植好后测试自己想要的函数。
TI的32位定点DSP库IQmath在H7和F4上的移植和使用 - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)
TMS320F28335使用IQmath库 - 知乎 (zhihu.com)
官方的文档也有,路径是这个C2000Ware_5_01_00_00\libraries\math\IQmath\c28\docs\IQmath_Quickstart.pdf
所有的文件在官方的SDK里有,路径是这个C2000Ware_5_01_00_00\libraries\math\IQmath\c28
文件夹是这样的,我们需要的东西主要在lib和include这两个文件夹里
lib是这样的
include文件夹是这样的
将这些文件放到工程下,最后是这样的
我这里因为编译后选择是输出elf文件,所以将elf文件编译,其他文件跳过编译即可
在cmd文件下我们也需要对IQMath预留空间,这部分没有固定要求,只需要是内存即可
首先在使用前我们需要将头文件包含进来,只需要包含一个IQmathLib.h这个文件即可
但是我们还不能使用,我们需要修改头文件里的东西。
最主要的是位数,其定义在这,我是将位数改为了16位。可以看到范围是从1-30
这个是全局的位数,说到位数不得不说,浮点转定点的计算方式了
正因如此,定点的位数越大,能确定小数点后的位数也就越高,即数字越精确。
但是于此同时,还有数字范围的问题,其表示范围如下图所示
随着位数的减小,表示的范围在增加,但是会越来越不精确。具体的计算方式大家可以再上网搜索,这里不再进行过多的介绍。
等上述内容都修改好了,我们就可以写程序调试了。
我们对于定点数的定义有两种方式,一种是_iq16,一种是long
我个人推荐使用_iq16这种方式,因为在后续使用其他定点函数的时候可能会涉及到强制类型转换,警告之类的。
定义完成后我们就可以测试了,最基础的就是将浮点类型转换为定点类型,其函数是_IQ(...)
我们进行仿真测试
可以看到数值是32768,我们再笔算一下
0.5*2^16=32768
没有问题,一切顺利。
总的来说IQMath的移植还是非常方便的,毕竟是TI自己开发的东西,不可能移植非常困难。总的来说用起来还是非常方便的,不过我没有太多使用场景,大家如果测试其他函数也可以告诉我,说说测试效果。库里面好像还包括FFT,FIR这些复杂的运算,我还没有测试过,如果有测试也可以在评论区告诉我测试的结果啊。
顺带说一嘴编译器浮点与定点设置在这有一个relaxed(浮点)与strict(定点)这以选择,大家可以选择。