引 言
DSP结构可以分为定点和浮点型两种。其中,定点型DSP可以实现整数、小数和特定的指数运算,它具有运算速度快、占用资源少、成本低等特点;灵活地使用定点型DSP进行浮点运算能够提高运算的效率。目前对定点DSP结构支持下的浮点需求也在不断增长,主要原因是:实现算法的代码往往是采用C/C++编写,如果其中有标准型的浮点数据处理,又必须采用定点DSP器件,那么就需要将浮点算法转换成定点格式进行运算。同时,定点DSP结构下的浮点运算有很强的可行性,因为C语言和汇编语言分别具有可移植性强和运算效率高的特点,因此在定点DSP中结合C语言和汇编语言的混合编程技术将大大提高编程的灵活度,以及运算速度。
大多数DSP的开发工具只是在C语言的基础上支持标准的浮点运算,而定点DSP硬件一般都是面向定点的运算,不支持标准的浮点运算,缺乏硬件的支持极大地限制了浮点的应用,因而标准的浮点运算在实际定点DSP应用中并不多见。C5509是一款16位定点DSP。在本文中,对C5509输入FTSK信号,用C语言和汇编语言混合编程的方式对输入浮点型的FTSK信号进行相关运算,并输出浮点运算结果。这种方法的特点是:在C语言中方便地进行数据格式转化,在汇编语言中进行乘法和加法运算,既达到很高的运算精度,又极大地提高了运算效率。
1 定点DSP C语言开发环境中的浮点数据格式
在定点DSP中,整型数是用16位二进制格式来存储的,但是DSP的C语言和汇编语言中定义的单精度浮点型数据都是标准C语言浮点表示格式。这种格式在C55X中,符合IEEE754标准。它定义了单精度32位和双精度64位的格式。32位IEEE754单精度标准中,第一位是符号位,其后8位用来存放指数,最后23位用来存放小数尾数,如下:
在IEEE754单精度浮点标准中,明确包含了符号位,第32位用作符号位。尾数进行了归一化,以产生一个1.f格式的数,f是小数部分,占用分配的23位。因为规格化的数最左一位总是1,所以不需要存储该位,在该格式中它是隐式的。这样一个n位的尾数实际上存放了一个n+l位数。为使尾数规格化,指数被适当增减,来跟踪规格化所需的左右移位数以及小数点。
最常用的是用8位指数表示0~255,即O<e<255:
其中:s是符号位,0为正数,1为负数;e是指数位,无符号8位;f是尾数的小数部分,23位。
例如:IEEE754格式下浮点正数00110001001111l000000001000000000的十进制表示为:
2 相关运算的实现
2.1 数据提取方式
在本软件设计中,FTSK输入数据的频率包含800Hz,1200Hz、1600Hz、2020Hz,通过相关运算提取800Hz信号。具体参数是:FTSK输入数据的采样率为8000Hz。相关运算输入数据:每次运算对输入数据先提取l600个点,并分离出这些数据的最后40个点;然后对下一个输入数据提取1600个点,并把刚才取的40个点加在这1600个点后面组成l640长度的数组,作为相关运算的输入。这样做的原因是,最大限度地消除每次提取的l600个点相邻部分的影响,提高相关输出的精准度。相关运算的输入数据都为浮点型,而通过MATLAB仿真计算出来的系数也都为小于l的浮点数。通过在C语言中调用汇编语言,在定点C5509中实现此浮点运算,并输出用800Hz相关运算提取出的波形。
2.2 C5509中实现浮点运算方法
此相关运算的输人是浮点型数据,相关系数是小于1的单精度浮点型数。对于定点DSP,由于不能直接进行浮点数的乘法运算,因此必须对输入数据进行类型转换。首先,相关运算的输入数据是FTSK浮点数据。在C语言中,单精度浮点数据是以IEEE754标准存储的32位数据,而C5509中C语言调用汇编语言,是通过寄存器AR0从C语言传递给汇编语言的是数据指针,这个指针是指向16位数据的,所以相关的输入32位浮点数要先转化为16位整型数据。本文这样实现:C程序中先把浮点数据乘以10后(提高运算精度),强制类型转化为整型数据,然后把此16位数据的指针赋给调用汇编的入口参数,即通过寄存器AR0传递到汇编程序中。然后,在汇编程序中,相关的系数是小于l的小数;在DSP中,汇编语言直接定义的格式是将其转换为16位二进制2的补码表示形式(例如0.8用8×32 768/lO来表示)。从汇编程序入口进入的、经过强制类型转换的整型数据也是以16位二进制形式存储的,通过与16位的小数相乘得到的是32位数,存储在累加器A中。其中,前16位是运算结果的整数部分,后16位是小数部分。由于从汇编语言程序返回C程序的参数是16位的,故取运算结果的高16位(此前已经把输入数据乘以lO,最大限度地提高了运算精度,这里直接取高16位)。把这16位数据返回C程序,得到整型数据,再强制类型转化为单精度浮点型数据,再除以10,即得到了最后相关运算的结果。经实际运算检验,通过这种方法在C5509里进行浮点运算,最终结果实现了很高的精度,而且通过调用汇编语言,极大地提高了运算的效率。
2.3 仿真
实际在用户板上用TI公司提供的CCS Emulator调试程序,实现了硬件仿真;而对此DSP算法来说,也可用TI公司提供的软件仿真器(Simulator)实现软件仿真。
TI公司提供的软件CCS中有一项强大的探测点功能。它是一个开发算法的工具,将计算机数据文件传送到目标板或计算机的缓冲区中提供DSP软件应用,而且可以通过CCS提供的图形窗口观察输入/输出数据波形。
本次算法设计中利用CCS的断点和探测点进行数据的输入,利用图形窗口观察输入/输出的波形。
2.4 实际运算的结果分析
从输入波形可以看到,有4种不同的频率,可以算出最低频率是800 Hz,经过800 Hz相关运算得出的输入波形与输出波形对比如图1所示。
在图l中,可以看到输入波形中频率最低的波形。2个波峰时间差(即周期)是0.0054-0.00416=0.00124s,取倒数是806.45,所以此波形是800Hz部分;再看输出波形,4个尖峰正好分别对应输入4个800 Hz频率分量。如果在后面再加上低通滤波器。就可以滤出更平滑的曲线,如图2所示。
2.5 测试程序运行时间
CCS中提供了~种评价器(profiler)。它通过收集在指定代码区间程序执行的统计性能,确定程序中各段所花费的处理器时间,从而识别并消除性能发挥的瓶颈,缩短程序的执行时间,使程序更有效;利用评价器分析可以确定执行某个特殊的函数花费了多少个时钟周期,以及对它调用的频繁度等。
本设计中相关浮点运算通过C语言编程和C、汇编语言混合编程两种方式的对比,用CCS提供的评价器可以测出,调用汇编语言的方式比纯C语言编程方式,速度提高了51.2%。
结语
在定点DSP中进行浮点运算,要经过复杂的数据格式转化,因此用定点DSP取代浮点DSP,在降低设备成本的情况下,必定会提高研发的成本。
如果直接把IEEE754标准的32位单精度浮点数据转化为16位整型数,要经过相当复杂的过程,在满足一定精度的前提下,可以使用本文的转化方式。使用C语言和汇编语言混合编程的方法,达到了大大提高运算效率的目的,不失为很灵活的编程方法。