o 引言
美国德州仪器(ti)公司的数字信号处理器(dsp)以其处理速度快,功能强大,易于使用,且有开发软件支撑等优点而广泛应用于通信、电子、自动控制等领域。一个完整的dsp系统应当由硬件和软件两部分组成。在硬件(主要是dsp芯片)相同时,系统的性能将主要取决于软件部分的效率。而在相同的硬件平台上,不同程序员编写的软件效率相差很大,软件效率已成为影响dsp系统性能的一个重要因素。要充分发挥d-sp芯片的性能,就必须编写高效率的程序。一般在dsp进行运算时,有些操作会频繁出现(如卷积、fft、fir滤波等),完成这些操作的程序的效率直接影响整个软件部分的效率。为此,ti公司提供了一系列库函数(ti dsp library,以下简称dsp lib)来完成这些操作。这些库函数既可减少程序员的工作量,又可提高程序效率,因此,在程序开发中,合理地使用这些库函数,将大大提高系统性能。
1 ti dsp library简介
1.1 ti dsp library的特点
dsp lib的核心实际上是一系列经过手工优化的汇编程序代码,这些代码封装在后缀名为.lib的文件中,可用于完成各种运算。它们对外是不可见的。这些程序(库函数,routines)可被c程序调用。由于经过了手工优化,它们的效率都非常高。由于不同系列dsp芯片的指令集不同,因此,不同系列dsp芯片的dsp lib也是不同的,如tms320c5000的dsp lib就不能用于tms320c6000。但是,各个系列dsp lib的基本组成是相同的,一个完整的dsp lib通常由lib文件夹、include文件夹和其它辅助文件组成。其中lib文件夹用于存放*.lib文件,其内部封装着手工优化的汇编程序代码,是一个dsp lib的核心部分。有的dsp lib还有*.src文件,这些*.src文件主要是用c语言和汇编语言编写的程序源代码。使用归档器可从中提取出这些源代码;而include文件夹用于存放各个库函数的头文件,通常这些文件分为c程序头文件和汇编程序头文件两部分。
1.2 ti dsp library的下载和安装
由于dsp lib种类繁多,且属可选模块,通常的dsp开发环境(ccs,code composer studio)并没有配备dsp lib。因此,使用一个dsp lib之前,必须进行dsp lib的下载和安装。
所谓下载,就是在ti公司网站www.ti.com上免费下载各种dsp lib;而所谓安装,就是在dsp lib下载完毕后,双击安装文件,以将它安装在计算机中选定的位置(默认位置为c:\ti)。安装之后,即可在程序开发中使用dsp lib的库函数。
1.3 ti dsp library的使用
按处理数据类型的不同,ti dsp分为定点(fixed-point)dsp和浮点(floating-point)dsp。由于浮点dsp既有定点指令集,又有浮点指令集,因此,本文选取浮点dsp系列tms320c67x的dsp lib,并且选取了tms320c67x dsp library和tms320c67x fastrts library两个dsp lib,前者主要针对数字信号处理的常用操作,后者则针对一般数学运算的通用操作。
2 tms320c67x dsp library的应用
当dsp进行数据处理时,卷积、fft、fir滤波等操作频繁出现,故在程序开发中,使用dsp lib来完成这些操作将大大提高整个程序的效率并简化编程。tms320c67x dsp library就是这样的一个dsp lib,它的lib文件夹内含库文件dsp67x.lib和源文件dsp67x.sr、dsp67x_c.sr-c、dsp67x_sa.src。tms320c67x dsp library主要用于tms320c67x系列dsp芯片的程序开发,使用它可完成fft运算。
2.1 tms320c67x dsp library的使用
使用tms320c67x dsp library的第一步是将其核心文件“dsp67x.lib”加入到当前工程中,相关编译链接参数为“-ldsp67x.lib”;接着,将存储头文件的include目录所在路径添加到工程搜索路径中,其相关编译链接参数为“-i pathname”,具体操作可参考ti公司的有关文献。选取该dsp lib中的库函数“dspf_sp_cfftr2_dit()”可完成fft运算,它使用的是基2的时间抽取算法,具体形式如下:
同时,该库函数还有一个对应的头文件“dspf_sp_cfftr2_dit.h”,使用时可将其包含到调用该库函数的程序中。此时,该库函数就可以像一般子程序一样被其他程序调用,具体使用代码如下:
为了便于比较,可使用归档器指令“ar6x”从该dsp lib的源文件“dsp67x_c.src”中提取出库函数的源代码,以得到文件“sp_cfftr2_ dit.c”。所有归档器指令的命令文件都存储在ccs的安装目录下,这里,“ar6x”的使用格式为:
ar6x-x dsp67x_c.src sp_cfftr2_dit.c
从“sp_cfftr2_dit.c”中可得到库函数“dspf_sp_cfftr2_dit()”的c语言源代码,相应的c程序为“void sp_cfftr2_dit(float*x,float*w,short n)”,该程序可以像一般子程序一样被主程序调用。源函数和库函数的形式完全相同。实际上,库函数就是对源函数的程序代码进行手工优化的结果。
2.2 性能分析
分别使用库函数和源函数可完成fft运算。并可用ccs自带的剖析工具“profiler”来分析两个函数由于编程方式的不同所带来的运行时间上的差异。改变输入数组的长度,可得到如表1所列的一组数据。由表1可以看出,库函数的效率远远高于源函数,其效率的提高量随着输入数据长度的变化而变化,最高的效率可提高40倍(40.98-1=39.98),最低仍在25倍左右,而且该dsp lib的其他库函数也有相近的测试结果。虽然用该dsp lib的库函数后,程序效率可以提高一个数量级,对于时间限制较为严格的系统,特别是实时系统,这仍然是非常有用的。
库函数和源函数相比,其效率有了很大提高,但这种提高是有代价的。它主要表现为通用性降低。其原因是为了最大限度的提高效率,在对代码进行手工优化的过程中,引入了一些强假设,同时,使用了大量的操作合并、并行处理等简化手段,这必然导致库函数的通用性降低。例如,库函数“dspf_sp_cfftr2_dit()”使用时就会受到以下条件的限制:
(1)输入数组的长度必须是2的幂级数,且不得小于32;
(2)输入数组x和旋转因子数组w必须按双字对齐方式存储,即数组起始地址的末3位必须是零;
(3)数据的存储格式必须是小端模式(little endian);
(4)执行期间可接收中断,但不予响应,这可能导致一些实时事件得不到及时响应。
如果使用“dspf_sp_cfftr2_dit()”时不考虑到这些限制,就有可能导致程序运行异常。因此,库函数的效率虽然高,但不能盲目的滥用,在程序开发时,必须根据实际情况在通用性和效率之间进行折衷,以合理的使用库函数。
3 tms320c67x fast rts library的应用
在dsp进行数据处理时,除了一些典型的操作外,还存在大量常规的操作,如除法操作、对数运算、三角函数等,这些操作也是很费时的,提高这些操作的代码效率,也能显著提高整个软件的效率。tms320c67x fastrts library就是这样的一个dsp lib,它通常由lib文件夹、include文件夹和doc文件夹组成。其中lib文件夹内含库文件fastrts67x.lib(little endian)、fastrts67xe.lib(big endian)和源文件fastrts67x.src;include文件夹内含头文件fastrts67x.h和recip.h;而doc文件夹内含帮助文件。
3.1 tms320c67x fastrts library的使用
tms320c67x fastrts library(以下简称fastrts library)主要用于处理一些常规的操作。由于在通常情况下,ccs已经有一个rtslib-rary来完成这些操作(例如,“rts6700.lib”就是一个适用于tms320c67x的rts library文件),因此,如果要使用fastrts library,就必须在编译链接过程中先于“rts6700.lib”来编译链接“fastrts67x.lib(或fastrts67xe.lib)”,相应的编译链接命令选项为:
-l fastrts67x.lib - rts6700.lib或 -l fastrts67xe.lib - rts6700.lib
fastrts library同样需要注意头文件的使用,它有两个头文件: “fastrts67x.h”和“recip.h”。如果使用fastrts library中的特殊函数(三角函数,对数函数等),则必须包含“fastrts67x.h”;而如果使用求倒数操作,则必须包含“recip.h”。fastrts library的使用方式如下:
3.2 性能分析
分别使用fastrts library和rts library可完成一些常用操作,使用剖析工具可得到各个操作所需的时钟周期个数,具体如表2所列(所有的操作均处理单精度浮点数)。对比表2中的数据可以发现,和rts library相比,fastrts library大大提高了程序的效率。
4 dsp lib的编写
事实上,程序员并非只能被动的使用dsp lib。只要遵循相应的规则,程序员也可以自己编写一个dsp lib。编写一个最简单的dsp lib的步骤如下:
(1)新建一个工程newlibrary,将其属性设为“library(.lib)”,图l所示是新工程设置示意图;
(2)编写高效率代码文件mylibl.asm、mylib2.asm、mylib3.asm,……
(3)将mylibl.asm、mylib2.asm、mylib3.asm,……等文件添加到工程new library中;
(4)编译链接工程new library;
完成上面4步后,工程中就会出现库文件newlibrary.lib,这样,一个dsp lib就制作成功了。为了使dsp lib具有保密性,通常情况下,只需保留工程中的newlibrary.lib文件,而将其他文件,特别是源代码文件*.asm删除或保密存放。这样,用户就只能使用库文件,而无法从中得到源代码的信息。
5 结束语
本文以tms320c67x dsp library和tms320c67x fastrts library为例,详细介绍了如何在程序开发中使用ti dsp library,并分析了使用ti dsp library所带来的程序效率的提高。最后,还给出了编写ti dsp library的一个应用实例。
户外(农用)变压器防盗装置
诺基亚贝尔WaveFabric光网络解决方案助力国家电网发展
大联大品佳集团推出基于Audiowise技术的TWS耳机方案
X9628与PIC16C72的接口电路图
独石电容的应用及优缺点
TMS320C67x DSP Library在程序开发中的应
一文看懂音响电路图及工作原理
【科普】一分钟全面了解“云存储”
连艾睿都要跳下去的元器件电商,你应该这么玩!
新基建大时代之下,充电桩迎来千亿市场机遇
探究数字滤波器matlab辅助设计
PLC在炭素振动成型机中的应用
微软开发上线新PDF文档搜索工具功能
Intel下一代Xeon遭曝光 热设计功耗最高达210W
UART 16倍频采样的VHDL实现
智能监测手表的应用能够让我们的生活变得更加健康
马云一番“新制造”的宏论,堪称是一个“外行人对制造业的高见
分享知识:三相异步电机极数和转速的计算方法
单缓冲与双缓冲有哪些不同之处呢
今日看点丨马斯克:预计1到2 个月内尝试SpaceX“星舰”的再次发射;比亚迪称“云巴”非常适合香港,考虑在