文档库 最新最全的文档下载
当前位置:文档库 › C240X系列DSP定点数学函数库的应用

C240X系列DSP定点数学函数库的应用

第26卷第5期2005年10月

河南科技大学学报(自然科学版)

Journal of Henan University of Science and Technology

(Natural Science )Vol.26No.5

Oct.2005

基金项目:河南省重大科技攻关资助项目(991140313)

作者简介:王笑一(1976-),男,河南洛阳人,助教,硕士生;张洛平(1955-),男,河南三门峡人,副教授,主要研究方向为网络化数字

控制技术.

收稿日期:2005-02-06

文章编号:1672-6871(2005)05-0049-03

C240X 系列DSP 定点数学函数库的应用

王笑一1,李军旺2,张洛平1,祁金光3

(1.河南科技大学机电工程学院,河南洛阳471003;2.洛阳制冷机械厂,河南洛阳471000;3.三门峡湖滨果汁有限公司,河南三门峡472000)

摘要:定点DSP 在做浮点运算时效率不高,影响了定点DSP 的应用。TI 公司推出针对C24X 系列DSP 的qmath 数学函数库,用定点算法优化实现了常用的一些数学函数。本文介绍了该数学函数库的使用方法和要注意的问题,并在相同硬件条件下进行了执行定点函数和浮点函数的对比实验,结果表明合理使用定点数学函数可以显著提升C 语言DSP 程序的执行效率,对定点DSP 应用系统的高级语言开发有很大帮助。关键词:数字信号处理;定点;浮点;数学函数库中图分类号:TP368.1

文献标识码:A

0前言

TI 公司C24X 系列的定点DSP 如TMS320LF2407A 等

[1]

,在工业控制领域的应用越来越广。在开发基于DSP 的嵌入式应用系统时,为了提高软件的可读写、可维护性,同时也为了加快开发进度,很多工程技术人员希望使用高级语言如C 语言来进行开发[2]。但是由于定点DSP 本身不能进行浮点运算,再

加上目前C 编译器的优化功能还不尽完善[3]

,用C 语言编写的浮点运算程序在定点DSP 上的执行效率

远远低于人们的预期。为此许多工程技术人员在开发定点DSP 程序时经常将浮点运算转换为定点运算[4],但是由程序员自己手工实现三角函数、对数等数学函数的定点运算是非常烦琐的工作,费时费力,

而且程序的可靠性也难以保证。TI 公司推出的针对C24X 系列定点DSP 的Qmath 数学函数库[5],用定点算法优化实现了一些常用的数学函数,在一定程度上解决了这个问题。合理使用这些函数,可以大幅

度的提高C 语言浮点运算程序的执行效率。

1定点算法的原理

浮点运算转换为定点运算的基础是浮点数的定点表示。浮点数定点表示的关键在于事先确定小数

点在数据中的位置,也叫做数的定标。数的定标最常用的是Q 表示法[4],Q 值表示假想的小数点右边的

二进制数的位数,Q 值的确定与数的取值范围有关,

并且影响到数值表示的精度。在不同的Q 值下,同样位数的二进制数可以表示不同大小和不同精度的小数。例如在Q15下,16位二进制数的表示范围是-1~1,而在Q 0下则为-32768~32767。当确定了一个浮点型变量的可能取值范围后,就可以选择最适合的Q 值,使得该Q 值下用定点数来进行运算时精度最高。在定点数的运算过程中,必须时刻注意运算的中间结果也不能超出当前Q 值所确定的数的表示范围,如果有超出须及时进行调整,否则会得到

不正确的运算结果

[6]

。在DSP 的C 语言程序中使用了浮点数的定点表示后,就可以把浮点数转化为定点数进行运算,从而避开定点DSP 进行浮点运算时效率不高的问题。

2Qmath 库中封装的函数及调用方法

在TI 公司提供的Qmath 数学函数库中用定点算法实现了的数学函数见文献[5]。Qmath 数学函数

库为每个函数都提供了C 语言和汇编语言两种形式的调用接口。在CCS 的C ═════════════════════════════════════════════════════════════

语言开发环境中使用这

些函数之前,先要将Qmath.h 包含进CCS 的工程文件(.PJT 文件),并在Project 菜单下将Qmath.lib 加入工程。

下面以QSINLT 函数为例说明在调用这些函数的时候需要遵守的一些约定。QSINLT 函数的功能是利用查表和线性插值的方法计算输入参数的正弦值。该函数在头文件中的声明为signed short int qsinlt (signed short int x )。正弦函数的输入是在[-π,π]上的一个弧度值。而QSINLT 函数要求输入参数必须表示为Q15格式的定点数,表示的浮点数范围是[-1,1]。这就需要首先把[-π,π

]上的弧度值规格化为[-π,π]上的带符号定点数,然后用Q15格式的定点数进行表示。规格化实质上是一对一的映射关系,也就是说用Q15格式的“+1”即0x7FFF 表示+π弧度或者180o;“-1”即0x8000表示-πrad 或者-180o(如图1所示)。正弦函数的输出是在[-π,π]范围内,选用Q15格式刚好可以表示这个范围,不需要再做变换处理。

QSINLT 函数的计算过程可以分为两步,第一步是进行直接查表,即找到输入参数x 所处的区间[x i ,x i +1],如图2所示。第二步是在找到x 所处的区间后,

使用如下公式进行线性插值,求得对应的函数值:y =y i +

x -x i

x i +1-x i

×(y i +1-y i )

QSINLT 函数计算时使用的是一个等间隔的正弦函数表,

在[-π,π

]的范围内提供了256个入口点的函数值,其好处是表格横坐标(自变量)的信息可以包含在表格的地址中,而在表格中只需要保存纵坐标(因变量)的信息,这样一方面可以减少表格占用的存储容量,另一方面可以方便查表操作。输入的Q15格式的16位二进制数首先依照其高8位信息的256种组合找到在整个线性表中的入口地址,然后使用其余的低8位信息进行插值运算。

实现QSINLT 函数所需的代码长度及数据存储器、堆栈的使用情况见文献[5]。

以计算sin (π4)=0.707为例,

调用QSINLT 函数前首先将π4

规格化为Q15格式的输入,即2000H 。然后调用QSINLT 函数。而函数输出值0.707也以Q15的格式给出,即5A82H 。该计算的C 语言示例程序如下:

#include /*Header file for fixed point math routine */

void main (void ){

signed short int x ,y ;

x =0x2000;/*0.25π

in normalized Q15format */y =qsinlt (x );/*0.707in Q15format =0.707*215=23170(5A82h )*/

QSINLT 函数使用查表和线性插值的算法进行计算,这种算法本身存在原理误差。图3所示为使用QSINLT 函数计算结果和IEEE 标准的单精度

浮点数结果之间的误差[5]

。从图中可见最大误差为4,也即QSINLT 计算可以达到约为14bit 的精度。

Qmath 库中的定点数学函数在实现时均采用了泰勒级数或者查表作线

性插值的算法,同样都存在原理误差,虽然这些误差很小(相对误差最大不超过0.3%,一般在0.05%以下),通常情况下可以忽略不计,但在进行一些精密计算时却必须考虑,并且要防止误差的累积。

?

05?河南科技大学学报(自然科学版)2005年

3定点数学函数执行时间的测试

为说明使用Qmath 库中提供的定点数学函数后,定点DSP 的C 语言程序执行效率提高的程度,本文

进行了表1列出的定点数学函数和相应浮点数学函数在运行时间上的对比测试。实验在

TMS320LF2407A 的Demo 板上进行,2407的外部时钟为12MHz ,经PLL 倍频后运行在24MIPS 状态。软件环境是CCS V2.21。使用合众达公司的DSP510PP 并口仿真器。测试结果见表1。测试程序均为与前述

例程相似的简单程序。实验得到的数据在示波器上也进行了验证。表1

函数执行的机器周期数/执行时间项目浮点函数

定点函数

机器周期数时间/μs 机器周期数时间/μs 倍数QSIN

15886661.952822.030.1QSINLT --43418.1

-QCOS 18821784.264026.729.4QCOSLT --46619.4

-QATAN 15639651.690437.717.3QSQRT 244101017.186336.028.3QLOG1017515729.872730.324.1QLOGN 16628692.872730.322.8QINV1123051.354522.7 2.3QINV2

123051.348020.0

2.6

因为在实际的DSP 应用程序中,经常直接使用定点运算的结果进行逻辑判断和数学运算,并不一定要把函数结果再转换回浮点数格式,所以表中给出的函数运行时间是直接调用浮点和定点两种函数的净执行时间,并不包括调用定点运算函数之前的准备工作时间和定点结果向浮点转化的时间。

表中用作对比的浮点函数是指在头文件math.h 中说明的浮点运算函数。

由于QSINLT 、QCOSLT 函数没有对应的

浮点函数,所以表中对应位置留空。QINV1和QINV2也没有对应的求倒数的浮点函数,但是在CCS 的C 语言环境中如果作浮点数的除法,在编译运行时内部实际是通过调用浮点运算函数来完成的,故用求一次浮点除法1/100.0的时间作为参照。

另外,程序在DSP 片外的SRAM 中的执行速度比把程序烧写进片内FLASH 时慢很多[7]

,一般来说下载到片内的程序执行速度比在片外时要高10倍左右。表中给出函数执行时间均为程序下载到片外SRAM 中时的数据,

与最终程序下载到片内FLASH 运行时的会有较大的差别[8]

。从表1可以看出,定点数学函数的执行时间约是相对应的浮点函数的几分之一到几十分之一。使用定点数学函数对定点DSP

程序执行效率提升的效果是非常明显的。

4结束语

采用高级语言进行嵌入式应用系统软件开发的优势是显而易见的,但在目前的开发环境下定点

DSP 的C 语言程序确实存在效率不高的问题。解决这个问题可以采用C 语言和汇编语言混合编程的方法,但这就必须要学习DSP 的汇编语言编程。折衷的办法就是采用浮点运算转定点运算等一些技巧性的方法,这样可以在一定程度上提高C 程序的执行效率,但这个问题的最终解决还有待于开发工具的不断完善。参考文献:

[1]袁

澜,刘文胜,姬宣德.基于DSP 的永磁无刷直流电动机控制系统设计[J ].河南科技大学学报(自然科学版),2003,24(1):51-52.

[2]高瑞昌,孙昌国.DSP 在测速中的应用[J ].自动化技术与应用,2004,23(3):71-73.

[3]阳明晔,张志勇.基于TMS320C6000系列DSP 的C 代码优化方法研究[J ].微处理机,2004,24(2):59-61,64.[4]刘和平,王维俊,江

渝,等.TMS320LF240x DSP C 语言开发应用[M ].北京:北京航空航天大学出版社,2003.

[5]Texas Instruments Inc ,Fixed Point Math Library [DB /OL ].http ://https://www.wendangku.net/doc/0515724102.html, /does /toolswl /folders /print /sprc068.html ,2002

-03-06.

[6]张雄伟,陈亮,徐光辉.DSP 芯片的原理与开发应用[M ].北京:电子工业出版社,2003.

[7]谭思云,徐桃云,向

敏.TMS320LF2407芯片的串行引导加载方案[J ].单片机与嵌入式系统应用,2004,6:74-75.

[8]宋

莹,季晓勇.TMS320C6202外部扩展存储器接口设计[J ].微计算机应用,2004,25(4):480-483.

?

15?第5期王笑一等:C240X 系列DSP 定点数学函数库的应用

相关文档