TM4C IQmath 使用教程+FPU介绍

1 篇文章 3 订阅
1 篇文章 0 订阅

TM4C IQmath 使用教程

  1. 介绍

Texas Instruments®Tiva™IQmath Library是一个高度优化和高精度的集合,数学函数为C/ C++程序员无缝地将浮点算法移植到Tiva设备上的定点代码。

这些例程通常用于计算密集型实时应用,其中最优的执行速度和高精度是至关重要的。通过使用IQmath库,它有可能实现比同等代码快得多的执行速度。

IQmath使用起来并没有想象中那么复杂,简单来说就是将浮点数转化为整数计算,然后再将整数转为浮点数。

使用过程中合数选和定义IQ变量,获得更好的计算性能。

IQmath使用手册在TIVAware中:

C:\ti\tivaware_c_series_2_1_4_178\docs

       FPU,编译器默认开启FPU,double型变量计算速度有所下降,1.0默认是double型变量,1.0f为float型变量,计算速度在某些情况下比double快几倍,大概5倍左右,如果对精度要求不是很高可以采用float。

2. 测试分析

代码如下。

while(1)

    {

        MAP_GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_6|GPIO_PIN_7,0);

        for(i=0;i<0xFF;i++)

        {

//           value = 0.4f+0.8f+0.8f*0.8f+79.8f/7.8f;

           c = _IQ24sin(a)+ _IQ24sin(b);

//           value = sin(3.1245)+ sin(2.14);

        }

       MAP_GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_6|GPIO_PIN_7,GPIO_PIN_6|GPIO_PIN7);

       for(i=0;i<0xFF;i++)

      {

//          value =0.4f+0.8f+0.8f*0.8f+79.8f/7.8f;

           c = _IQ24sin(a)+ _IQ24sin(b);

//           value = sin(3.1245)+sin(2.14);

      }

          value1=(float)(c*1.0/m24);

}

      当使用IQmath时候,每秒计算速度在480k左右,当不使用时在每秒计算次数在7k左右。这明显提高了计算三角函数的速度。

     当不用来计算三角函数时候,用来计算乘积运算,计算性能大大降低,不如不使用IQmath的计算速度。实测降低1536k左右。

      在求平方根时,采用,math库函数计算速度为34k/s,而采用IQ时候,计算速度为488k/s。

 

3. IQ变量定义范围

 

4.使用范例

#include "IQmath/IQmathLib.h"

int

main(void)

{

_iq24 X, Y, Z;

X = _IQ24(1.0);

Y = _IQ24(7.0);

Z = _IQ24div(X, Y);

}

其中iq24,定义IQ变量,X = _IQ24(1.0);则将数据1.0转为IQ数据。

    转换关系如下:

浮点数(x)转换为定点数(xq):xq=(int)x*2Q;

定点数(xq)转化为浮点数(x):x=(float)(xq*1.0/2Q);

5. 常用IQ库函数

以IQ30为例。IQ位数之间的转换这里不做说明。

转化一个数据为IQnumber

//*****************************************************************************

//

// Convert a value into an IQ number.

//

//*****************************************************************************

#define _IQ30(A)                (A)

IQ转浮点数,实验中数字可能变为0,不知道什么原因,谨慎使用。

//*****************************************************************************

//

// Convert an IQ number to a floating point value.

//

//*****************************************************************************

#define _IQ30toF(A)             (A)

//*****************************************************************************

//

// Convert an IQ number to a double-precision floating point value.

//

//*****************************************************************************

#define _IQ30toD(A)             (A)

乘积

//*****************************************************************************

//

// Multiplies two IQ numbers, with rounding.

//

//*****************************************************************************

extern _iq30 _IQ30rmpy(_iq30 A, _iq30 B);

//round() 函数作用就是,返回浮点数x的四舍五入值。

 

//*****************************************************************************

//

// Multiplies two IQ numbers, with rounding and saturation.

//

//*****************************************************************************

extern _iq30 _IQ30rsmpy(_iq30 A, _iq30 B);

//*****************************************************************************

//

// Multiplies two IQ numbers.

//

//*****************************************************************************

extern _iq30 _IQ30mpy(_iq30 A, _iq30 B);

整数相乘

//*****************************************************************************

//

// Multiplies an IQ number by an integer.

//

//*****************************************************************************

#define _IQ30mpyI32(A, B)       ((A) * (B))

//*****************************************************************************

//

// Multiplies an IQ number by an integer, and returns the integer portion.

//

//*****************************************************************************

extern _iq30 _IQ30mpyI32int(_iq30 A, long B);

相除,A/B

//

// Divides two IQ numbers.

//

//*****************************************************************************

extern _iq30 _IQ30div(_iq30 A, _iq30 B);

//*****************************************************************************

//

// Computes the sin of an IQ number.

//

//*****************************************************************************

求根

//*****************************************************************************

//

// Computes the square root of an IQ number.

//

//*****************************************************************************

extern _iq30 _IQ30sqrt(_iq30 A);

1/A的算术平方根

//*****************************************************************************

//

// Computes 1 over the square root of an IQ number.

//

//*****************************************************************************

extern _iq30 _IQ30isqrt(_iq30 A);

求平方和的根

//*****************************************************************************

//

// Computes the square root of A^2 + B^2 using IQ numbers.

//

//*****************************************************************************

extern _iq30 _IQ30mag(_iq30 A, _iq30 B);

 

三角函数计算,以弧度为单位

//*****************************************************************************

//

// Computes the arcsin of an IQ number.

//

//*****************************************************************************

extern _iq29 _IQ29sin(_iq29 A);

//*****************************************************************************

//

// Computes the cos of an IQ number.

//

//*****************************************************************************

extern _iq29 _IQ29cos(_iq29 A);

//*****************************************************************************

//

// Computes the arccos of an IQ number.

//

//*****************************************************************************

#define _IQ29acos(A)            (_IQ29(1.570796327) - _IQ29asin(A))

//*****************************************************************************

//

// Computes the arctan of an IQ number.

//

//*****************************************************************************

#define _IQ29atan(A)            _IQ29atan2(A, _IQ29(1.0))

 

//*****************************************************************************

//

// Computes e^x of an IQ number.

//

//*****************************************************************************

extern _iq30 _IQ30exp(_iq30 A);

//*****************************************************************************

//

// Computes 2^x of an IQ number.

//

//*****************************************************************************

extern _iq30 _IQ30exp2(_iq30 A);

返回整数

//*****************************************************************************

//

// Returns the integer portion of an IQ number.

//

//*****************************************************************************

#define _IQ30int(A)             ((A) >> 30)

字符串转整数

#define _atoIQ30(A)             _atoIQN(A, 30)

数字转字符串

#define _IQ30toa(A, B, C)       __IQNtoa(A, B, C, 30);

取绝对值

 

//*****************************************************************************

//

// Computes the absolute value of an IQ number.

//

//*****************************************************************************

#define _IQ30abs(A)             (((A) < 0) ? - (A) : (A))

 

  1. 一个实例

 

/**

 * main.c

 */

 

#include "common.h"

_iq24 a,b,c;   //8位数

_iq d;        //global iq

volatile int value = 0.0;

volatile float value1 = 0;

volatile float value2 = 0;

unsigned int i=0;

#define m24 16777216  //2^24

int main(void)

{

    MAP_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);   //50MHz

    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

    MAP_GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_6|GPIO_PIN_7);

    a=_IQ24(3.1245);

    b=_IQ24(2.15);

    while(1)

    {

        MAP_GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_6|GPIO_PIN_7,0);

        for(i=0;i<0xFF;i++)

        {

//           value = 0.4f+0.8f+0.8f*0.8f+79.8f/7.8f;

           c = _IQ24sin(a)+ _IQ24sin(b);

//           value = sin(3.1245)+ sin(2.14);

        }

 

       MAP_GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_6|GPIO_PIN_7);

       for(i=0;i<0xFF;i++)

      {

//          value =0.4f+0.8f+0.8f*0.8f+79.8f/7.8f;

           c = _IQ24sin(a)+ _IQ24sin(b);

//           value = sin(3.1245)+sin(2.14);

      }

          value1=(float)(c*1.0/m24);

          value2=_IQ24toF(c);

    }

}

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: IQMath是一种一种用于处理定点数的数学库。它提供了一系列的函数和工具,可以用来进行定点数的加减乘除运算、取整、取模和其他数学运算操作。IQMath的基本使用方法如下: 首先,我们需要定义和初始化一个IQ数。IQ数由一个整数部分和一个小数部分组成,以固定的格式表示浮点数。我们可以使用IQ设置函数来将一个浮点数转换为IQ格式,例如: ``` IQ x = IQSET(1.5); ``` 上述代码将把浮点数1.5转换为IQ数,并将其赋值给变量x。 接下来,我们可以使用IQ的数学函数来对IQ数进行各种运算。例如,我们可以使用IQ的加法函数来计算两个IQ数的和,如下所示: ``` IQ sum = IQADD(x, y); ``` 上述代码将计算x和y的和,并将结果赋值给变量sum。 除了基本的加减乘除运算外,IQMath还提供了其他常用的数学函数,如取整函数、取绝对值函数和取模函数等。例如,我们可以使用IQ的整数取整函数来将一个IQ数取整到最接近的整数,如下所示: ``` IQ rounded = IQINT(x); ``` 上述代码将把x取整到最接近的整数,并将结果赋值给变量rounded。 除了数学函数外,IQMath还提供了一些用于调整IQ数精度和格式的函数。例如,我们可以使用IQ的规格化函数来规范化一个IQ数,使其满足一定的精度要求,如下所示: ``` IQ normalized = IQNORM(x, IQ_BITS); ``` 上述代码将规范化x,使其满足IQ_BITS位的精度,并将结果赋值给变量normalized。 总而言之,IQMath是一种用于处理定点数的数学库,可以进行各种数学运算和格式转换。通过使用IQ的数学函数和工具,我们可以方便地处理和操作定点数。 ### 回答2: IQMath是一种用于嵌入式系统中的定点数学计算库。它采用了定点数表示,并提供了高效的整数运算函数。其基本使用方法如下: 1. 定义变量类型:IQMath库提供了一系列的宏定义来定义不同位数的定点数类型。可以根据需求选择合适的类型。 2. 初始化变量:在使用IQMath库之前,需要先初始化相应的变量。可以使用宏定义或直接赋值进行初始化。 3. 数值运算:IQMath库提供了一系列的运算函数,包括加法、减法、乘法、除法、平方根等等。可以根据需要选择相应的函数进行运算。 4. 转换为浮点数:如果需要将IQMath的定点数转换为浮点数,可以使用相应的转换函数。这样可以方便地与其他浮点数进行比较或计算。 5. 输出结果:最后,将结果输出或使用。可以使用printf函数将结果输出到终端或使用其他方式进行处理。 总的来说,IQMath库提供了一种在嵌入式系统中进行高效定点数运算的方法。使用IQMath库可以避免使用浮点数运算带来的性能和精度问题,同时提高了嵌入式系统的计算效率。但需要注意的是,在使用IQMath库时要仔细选择定点数的位数,以兼顾精度和性能。 ### 回答3: IQmath是一种基于定点数的数学运算库,用于在嵌入式系统中进行高效的数值计算。其基本使用方法如下: 1. 引入IQmath库:首先需要将IQmath库引入到你的工程中。这可以通过将IQmath库的源文件添加到你的项目中,或者将IQmath库作为静态库或动态库链接到你的项目中来实现。 2. 定义和初始化IQ数:在使用IQmath库之前,需要定义和初始化IQ数。IQ数是一种由整数和小数部分组成的定点数表示方法,可以非常方便地进行数值计算。例如,你可以使用IQ数表示长度、角度、速度等物理量。 IQ数的初始化可以通过将一个整数和一个小数作为参数传递给IQ数的构造函数来实现。 3. 进行数值计算:一旦IQ数被初始化,你可以使用IQmath库提供的各种函数进行数值计算。例如,你可以使用IQmath库中的加法、减法、乘法和除法函数对IQ数进行基本的数学运算。此外,IQmath库还提供了各种高级数学函数,例如三角函数、指数函数和对数函数等,以满足各种复杂的数值计算需求。 4. 结果转换和输出:在完成数值计算后,你可能需要将IQ数转换回常规的整数或浮点数表示。为此,IQmath库提供了将IQ数转换为整数、浮点数以及字符串的功能函数。你可以根据自己的需要选择合适的函数,并将结果输出到合适的输出设备上显示或存储。 总之,使用IQmath库进行数值计算非常简单。你只需引入库文件,定义和初始化IQ数,使用库中的函数进行数值计算,然后将结果转换和输出即可。通过灵活运用IQmath库,我们可以在嵌入式系统中轻松高效地进行各种数值计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值