初学DSP(4)-TMS320F280049C IQmath的使用与理解

lib路径:E:\ti\c2000\C2000Ware_3_03_00_00\libraries\math\IQmath\c28\lib

总结就是:使用fpu加速和不使用fpu加速的,coff格式和eabi格式的

索引加函数lib

我使用eabi格式,fpu加速的。

试一试例子

 

我对Q进行全局定义,不然改起来太麻烦。

#include<IQmathLib.h>
#define PI 3.14159
#define GLOBAL_Q  29
float input_F,sin_out_F;
long GlobalQ = GLOBAL_Q;      // Used for legacy GEL & Graph Debug.
_iq input, sin_out;


void main(void )
{
/* 0.25 x PI radians represented in Q29 format */
input=_IQ(0.25*PI);
//input_F=_IQtoF(input);

sin_out =_IQsin(input);
sin_out_F=_IQtoF(sin_out );

}

 

新建工程

添加工程需要基本文件

添加lib和头文件,cmd

 

开始设置

折叠C文件

 设置属性

检查路径

 

可以删掉libc.a

 

添加预定义,因为我使用flash

 

添加测试代码

 

提示一个错误,因为我把inc文件夹放到include里面,两个办法,添加路径或者改变路径,我把inc移出来,在当前文件夹吧

出现内存分配出错,这个一般两个原因,1、预定义没有加_FLASH,2、同时存在两个cmd

 

删除原来的cmd,保留一个

 

编译成功,调试看看结果

调试出错,这是因为我还没接板子。。。。。。。。。。。。。。。。。

观察值的变化

 

调试结果

但这个值是什么意思呢?

参考:IQMath是什么 浮点转定点运算,dsp

头文件里面的一段定义

#define   _IQ30(A)      (long) ((A) * 1073741824.0L)
#define   _IQ29(A)      (long) ((A) * 536870912.0L)
#define   _IQ28(A)      (long) ((A) * 268435456.0L)
#define   _IQ27(A)      (long) ((A) * 134217728.0L)
#define   _IQ26(A)      (long) ((A) * 67108864.0L)

乘法
#define _IQmpy2(A)          ((A)<<1)
#define _IQmpy4(A)          ((A)<<2)
#define _IQmpy8(A)          ((A)<<3)
#define _IQmpy16(A)         ((A)<<4)
#define _IQmpy32(A)         ((A)<<5)
#define _IQmpy64(A)         ((A)<<6)

除法
#define _IQdiv2(A)          ((A)>>1)
#define _IQdiv4(A)          ((A)>>2)
#define _IQdiv8(A)          ((A)>>3)
#define _IQdiv16(A)         ((A)>>4)
#define _IQdiv32(A)         ((A)>>5)
#define _IQdiv64(A)         ((A)>>6)

IQ29(0.25*pi)=0.25*3.14159*2^29=421657072

IQ29sin()

_IQ29toF()  转换为浮点数

计算器三角函数输入用角度,有点坑到我了

使用_IQ()转换浮点数,一定不能超过范围

定义一个全局的Q

// Select the global Q value to use:
#define GLOBAL_Q    24
long GlobalQ = GLOBAL_Q;      // Used for legacy GEL & Graph Debug.


_IQmpy()乘法
_IQdiv()除法
_IQlog()对数
_IQexp()

 

IQ数据转换

IQmath的IQ型不像FLOAT32分成3个部分,而是分成了2个部分,整数(符号位包括其中)位和小数位,我仔细看了下IQmath官方的手册,其实每个IQ都是个LONG型,通过不同的位数的定标(其实就是定小数点的位置),来实现不同精度的小数和取值范围,那么IQ15就是用低15位来表示小数位,用来表示整数的部分就是高(32-15)位了,那么照这个思路,我们要把一个整形Uint6直接赋给IQ15也是很容易的了,只要赋值后,再将IQ值向左移位15位就好了。

 

参考文档

E:\ti\c2000\C2000Ware_3_03_00_00\libraries\math\IQmath\c28\docs  IQmath_Quickstart.pdf

https://bbs.21ic.com/icview-2490744-1-1.html

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大U

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值