简介
1.1 简介
德州仪器公司TMS320C280X系列的IQmath库为C/C++程序收集了高度优化和准确的数学函数库,并精确地在TMS320C280X芯片上将浮点算法转换成定点算法的运算代码。这些函数被经常用在密集的实时计算且运行速度和精度又是至关重要的程序里。使用这些函数你能拥有比使用同等标准的ANSI C语言编写的代码更快的运行速度。此外提供可以使用的高精密功能的TI IQmath库明显缩短你DSP应用开发时间。
安装IQmath
2.1 IQmath的内容
TI IQmath库可以同时用于C和C++程序,它包含以下5个部分:
1)IQmath头文件
头文件包括与IQmath库接口所需的定义。C程序使用IQmathLib.h;C++程序同时使用IQmathLib.h和IQmathCPP.h
2)IQmath对象库。该库包含所有的IQmath函数和查找表。该库有两个构建版本:
a) IQmath.lib:这个库的可以与定点代码相链接。IQmath.lib库在标准C28x固定点设备上使用。 此库可与C和C++代码一起使用。
b) IQmath_f32.lib:这个库的构建可以与使用--float_support=fpu32构建的代码相链接。在带有FPU的C28X设备上,这对混用IQmath和本地浮点代码很有帮助,就是说可以使用浮点加定点。
FPU:(Float Point Unit,浮点运算单元)FPU是专用于浮点运算的处理器。
3)连接指定文件IQmath.cmd
4) IQmath调试文件GEL:IQmath.gel
5) 例程
2.2 如何安装IQmath库
库文件目录:D:\ti\controlSUITE\libs\math\IQmath\v160(参考你安装的ControlSUITE的位置)
使用IQmath
3.1 IQmath参数与数据类型
IQmath 输入/输出系统是典型的32位定点数系统,定点数的Q可在Q1到Q30之间定义,我们也可以使用自定义的 IQ 数据类型,这更方便了开发者在应用程序中定义各种类型的IQmath数据类型。
3.2 IQmath数据类型:Range 和 Resolution
下表总结了不同 Q 格式的32位定点数的 Range 和 Resolution。典型的Q函数支持Q1到Q30的歌手,但是对于IQNsin,IQNcos,IQNatan2,IQNatan2PU,iqatan等不支持Q30格式,因为这些函数的输入和输出需要在 -Pi ~ Pi 范围中改变。
3.3 在C中调用一个IQmath函数
添加IQmathLib.h,可能需要修改cmd文件,添加IQmath_fpu32.lib(因为我使用的是28335,有fpu),其他的就是在使用IQmath库之前先包含IQmathLib.h头文件。
我的工程文件链接,提取码1234
什么是定点数什么是浮点数参考:https://www.bilibili.com/video/av15622701/
28335使用fpu:https://zhuanlan.zhihu.com/p/341602336
CCS显示程序运行时长:https://jingyan.baidu.com/article/1612d5009c004ae20e1eee21.html
当然也有C++调用IQmath库的方法,具体可以查看TI官方的手册。
3.4 IQmath函数命名规则
3.5 选择GLOBAL_Q格式
数值精度和动态范围的要求将因不同的应用而有很大的差异。IQmath库方便了在定点算法中的程序应用,不用实现确定数字的精度。这个允许工程师用不同的竹子精度检查应用效果并最终确定数字定点的位置。高精度会导致低的动态量程,因此,在设置GLOBAL_Q格式前必须平衡精度和量程的关系。
CASE 1:
默认的GLOBAL_Q格式设置为Q24。编辑“IQmathLib.h”头文件,根据需要修改此值,用户可以选择从Q1到Q29作为GLOBAL_Q格式。修改此值意味着所有GLOBAL_Q函数都将使用此Q格式进行输入/输出,除非在源代码中覆盖此符号定义。
CASE 2:
模块可能需要不同的精度,然后是系统的其他部分。在这种情况下,我们需要重写在“IQmathLib.h”文件中定义的GLOBAL_Q,并使用本地Q格式。
这可以通过在包含语句之前在模块的源文件中定义GLOBAL_Q常量来很容易地实现 。
3.6 在调试过程中使用IQmath GEL文件
IQmath GEL 文件包含GEL功能,这些功能用于帮助在观察窗口查看IQ变量值。而且IQ变量值也可以通过对话窗进行设置。下面介绍在CCS 10中的实现过程,首先我们编译好程序然后进入调试界面,如下图。
然后在出现的菜单中选择 Open GEL Files View
然后出现下面的显示,然后右击屏幕右下角的GEL Files(TMS320C28XX)图表中的空白处,如下图,按图操作。
然后找到你的IQmath.gel的位置,添加就可以了,添加好了如下图。
以上操作是不能在线修改定义的IQ格式变量的值的,可以采用接下来介绍的方法。当然我们需要修改上面给的工程文件的main函数。修改如下。
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
InitSysCtrl();
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
LED_Init();
TIM0_Init(150,500000);
// int i;
// while(1)
// {
// for(i=0;i<256;i++)
// {
// input = _IQ24(i*PI/1000);
// sin_out = _IQ24sin(input);
// SampleTable[i] = sin_out;
// }
// }
input = _IQ24(0.25*PI);
sin_out = _IQ24sin(input);
}
在调试状态下,按照下图操作,依次点击Scripts-->IQ C Support-->Set_IQvalue。
IQmath函数概述
IQmath库函数中包含如下几部分:
1) 格式转换函数:atoIQ,IQtoF,IQtolQN等。
2) 算术函数:IQmpy,IQdiv等等
3) 数学函数:IQsqrt, IQisqrt等等
4) 其他:IQabs, IQsat等等
4.1 常用的变量和字符
在各函数的描述说明中采用了如下一些变量或符号:、
4.2 IQmath函数
函数描述与应用
5.1 格式转换函数
5.1.1 IQN:浮点转化为IQN数据类型
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "IQmathLib.h"
#include "leds.h"
#include "time.h"
#define PI 3.14159
_iq X1,X2,Y1,Y2,M;
long GlobalQ = GLOBAL_Q;
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
InitSysCtrl();
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
LED_Init();
TIM0_Init(150,500000);
/*
* 用IQmath方法执行方程
* 浮点数方程: Y = M*1.26 + 2.345
* */
M = _IQ(1.2);
Y1 = _IQmpy(M,_IQ(1.26)+ _IQ(2.345));
Y2 = _IQ23mpy(M,_IQ(1.26) + _IQ(2.345));
}
计算结果:
5.1.2 IQNtoF:转化IQN数据格式为浮点数
5.1.3 atoIQN:转化字符串为IQN
5.1.4 IQNint:IQN数值的整数部分
5.1.5 IQNfrac:IQN数值的小数部分、
5.1.6 IQtoIQN:全局IQ格式转换为特定IQ格式
5.1.7 IQNtoIQ:特定IQ格式转换为全局IQ格式
5.1.8 IQtoQN:全局IQ格式转换为QN格式
5.1.9 QNtoIQ:QN格式转换为全局IQ格式
5.2 算术函数
5.2.1 IQNmpy:IQ乘法(IQN*IQN)
5.2.2 IQNrmpy:进行四舍五入的IQ乘法(IQN*IQN)
5.2.3 IQNrsmpy:带四舍五入带饱和处理的IQ乘法(IQN*IQN)
5.2.4 IQNmpyl32:IQ格式与长整型相乘(IQN*LONG)
5.2.5 IQNmpyl32int:IQN与LONG相乘结果的整数部分
5.2.6 IQNmpyl32frac:IQN与LONG相乘结果的小数部分
5.2.7 IQNmpyIQX:乘法(GLOBAL_Q=IQN1*IQN2)
5.2.8 IQNdiv:定点除法
5.3 三角函数
5.3.1 IQNsin:定点正弦函数(输入弧度)
5.3.2 IQNsinPU:定点正弦函数(输入:标幺值)
5.3.3 IQNcos:定点余弦函数(输入弧度)
5.3.4 IQNcosPU:定点余弦函数(输入:标幺值)
5.3.5 IQNatan2:第四象限定点反正切函数atan(输入弧度)
5.3.6 IQNatan2PU:第四象限定点反正切函数atan(输入标幺值)
5.3.7 IQNatan:定点反正切函数atan(输入标幺值)
5.4 数学函数
5.4.1 IQNsqrt:定点平方根函数
5.4.2 IQNisqrt:定点开方根的倒数
5.4.3 IQNmag:IQ复数的幅值函数
5.5 其他函数
5.5.1 IQNabs:IQ数值的绝对值函数
5.5.2 IQNsat:IQ数值的限幅函数
input = _IQsat(_IQ(-120),_IQ(70),_IQ(-100));//限制输出,input = -100,非IQ值。就是正常的正数值