微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 定点DSP C55X实现浮点相关运算

定点DSP C55X实现浮点相关运算

时间:04-16 来源:嵌入式技术网 点击:

引 言

  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

  其中: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程序,得到整型数据,再强制类型转化为单

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top