视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
IQmath基本使用方法
2025-09-29 05:09:07 责编:小OO
文档
IQmath基本使用方法(2812为例子)

一. 配置CMD

PRAMH0         : origin = 0x100000, length = 0x008000     

BOOT_ROM       : origin = 0x3ff000, length = 0x000fc0

IQmathTables   : > BOOT_ROM, type = NOLOAD, PAGE = 0

IQmath         : > PRAMH0,   PAGE = 0

二. 载入gel文件,加入IQmath库和头文件

IQmath.gel

IQmath.lib

IQmathLib.h

三.定义全局Q格式,和调试Q格式

#define GLOBAL_Q     20 //全局为Q20格式,默认为Q24格式

long GlobalQ = GLOBAL    //调试用为Q20格式(这样可以使用_IQ(x)在监视器中查看)

//-----------------------------

IQmath中常用的变量和字符

QN    16bitQ格式

IQN   32bitQ格式 N表示Q多少

int 16bit

long 32bit

_iq = _iqN = long

F 浮点数输入

S 浮点字符串

P 正数最大值

N 负数最大值

格式转化函数

一般情况下IQ都有IQN版本的函数

float _IQtoF(A)         //_iq浮点转成正常浮点

float _IQNtoF(A)

int _IQtoQN(A)          //iq和q(16bit)的转化

long _IQint(A)          //提取iq的整数部分

_IQ(float F)            //浮点转化成iq

_IQN(float F)

_atoIQ(char *s)         //字符串转化成iq

_IQfrac(A)              //提取iq的小数部分

_IQtoIQN(A)             //全局iq和普通iq的转化       

_IQNtoIQ(A)

_QNtoIQ(int A)

算术函数

long _IQmpyI32int(A, B) //N*long IQ乘long 返回整数部分

long _IQmpyI32frac(A, B)//N*long IQ乘long 返回小数部分

_IQmpy(A, B)            //N*N乘法 

_IQrmpy(A, B)           //N*N四舍五入的乘法最后保存结果前(四舍五入)

_IQrsmpy(A, B)          //N*N四舍五入的饱和处理乘法(如果Q26[-32,+32],如果相乘结果超过也会到这个范围)

_IQmpyI32(A, B)         //N*long IQ乘long

_IQmpyIQX(A, A1, B, B1) //N1*N2两个不同的Q格式乘法,返回全局Q格式

_IQdiv(A, B)            // N/N iq除法

三角函数

_IQsin(A)

_IQsinPU(A)             //正弦函数(标幺值),你占这个圆周的几分之几为单位如果sin((0.25*PI)/(2*PI))

_IQcos(A)

_IQcosPU(A)

_IQatan2(A, B)           //第四象限反正切 tan-1(sin, cos)

_IQatan2PU(A, B)         //第四象限反正切 tan-1(sin, cos)

_IQatan(A, B)           //定点反正切    tan-1(1),,1=sin/cos

_IQNsin(A)

_IQNsinPU(A)            //正弦函数(标幺值),你占这个圆周的几分之几为单位如果sin((0.25*PI)/(2*PI))

_IQNcos(A)

_IQNcosPU(A)

_IQNatan2(_iqA, B)      //第四象限反正切 tan-1(sin, cos)

_IQNatan2PU(_iqA, B)    //第四象限反正切 tan-1(sin, cos)

_IQNatan(A, B)          //定点反正切    tan-1(1),,1=sin/cos

数学函数

_IQNsqrt(A)             //平方根        a^0.5

_IQNisqrt(A)            //平方根倒数    1/a^0.5

_IQNmag(A, B)           //求模运算(sqrt(A^2 + B^2)

_IQsqrt(A)              //平方根        a^0.5

_IQisqrt(A)             //平方根倒数    1/a^0.5

_IQmag(A, B)            //求模运算(sqrt(A^2 + B^2)

其它函数

_IQsat(A, long P, long N)//IQ数值的限幅函数 把A到[N P]之间

_IQNabs(A)              //IQ数据的绝对值    |A|

_IQabs(A)               //IQ数据的绝对值    |A|

(为提高计算精度,变量定义成IQ前,范围提前要搞清楚,切忌)

在F2812的ROM中,有3K×16位被保留用于存放数学公式表以及未来的开发。主要应用于高速度和高精度的实时计算,比同等程度的ANSIC C语言效率更高,同时可以节省用户更多的设计和调试时间。

1、IQmath库

为了应用IQmath,首先要从TI官方网站下载IQmath库,文档名称为SPRC087。我们主要应用库里面的:IQmath.cmd,IQmathLib.h,IQmath.lib。新建一个工程,将IQmath.lib,IQmath.cmd添加到工程,同时在main()函数之前增加语句:#include “IQmathLib.h”。注意:rts2800.lib和DSP281x_Headers_nonBIOS.cmd也要加到工程里面。

当然也可以不用IQmath.cmd文件,而用自己的CMD文件,只要在你的CMD里面添加以下代码即可:

MEMORY

{

   PAGE 0:

   BOOTROM (RW) : origin = 0x3ff000 , length = 0x000fc0

   RAMH0 (RW)   : origin = 0x3f8000 , length = 0x002000

}

SECTIONS

{

   IQmathTables   : load = BOOTROM , type = NOLOAD , PAGE=0

   IQmath        : load = RAMH0 , PAGE=0           

}

以上代码的红色部分可以适当修改。IQmathTables段必须设置为NOLOAD型。

2、IQmath应用

完成以上几步之后就可以在你的主函数里应用IQmath提供的函数进行计算了。建议在应用之前把IQmathLib.h浏览一下,了解各个函数是怎样实现的。下面举一个简单的例子:

#include "DSP281x_Device.h"

#include "IQmathLib.h"

#define  PI  3.14159

_iq   sinout_iq;

float  sinout_flt;

void main(void)

{

  InitSysCtrl();

  InitXintf();

  DINT;

  IER=0X0000;

  IFR=0X0000;

  

  sinout_iq=_IQ29sin(_IQ29mpy(_IQ29(0.25),_IQ29(PI)));

  sinout_flt=_IQ29toF(sinout_iq);

  for(;;){}

}

上述代码的功能是计算sin(π/4)的值,然后赋给sinout_flt。

 

sinout_iq值的格式为_iq29类型(也就是long型,参见IQmathLib.h),所以要通过函数_IQ29toF(sinout_iq)转化为float类型,才是我们需要的最终结果。

除个别函数外,一般情况下,计算公式里的所有变量都为一个iq类型,如上述主函数的第6行语句,全为_iq29类型。函数的具体讲解请参考IQmath手册,在此不再啰嗦。

3、Q格式的选择

IQmath一共提供了30种Q格式,具体选择哪种格式要兼顾精度和值的大小依据下表而定:

 

例如将数5.0转为Q格式,只能从_iq1~_iq28里面选择,而不能转化为_iq29和_iq30表示,因为_iq29能转化的最大值为3.999999998,否则会发生溢出。所以在定Q格式时要对数的范围做一下估计。也正是由于这个原因,有些三角函数不能采用_iq30格式。

4、计算arcsin与arccos

很多人有这样的疑问,函数表里面为什么没有提供arccos()和arcsin()函数呢?怎样才能计算这两个函数呢?其实只要你的高等数学过关的话,就很容易理解。因为arccos()和arcsin()可以通过反正切函数atan()间接求得,而函数表里面恰好提供了反正切函数,参见以下两个公式:

arcsin(X) = atan(X / sqr(-X * X + 1))                         反正弦

arccos(X) = atan(-X / sqr(-X * X + 1)) + 2 * atan(1)               反余弦

arcsec(X) = atan(X / sqr(X * X - 1)) + sgn((X) - 1) * (2 * atan(1))    反正割

arccosec(X) = atan(X / sqr(X * X - 1)) + (sgn(X) - 1) * (2 * atan(1))  反余割

原文地址:http://blog.csdn.net/yantaoliu/article/details/5487859下载本文

显示全文
专题