XE164的Q定标和DSP的Q定标一样吗?

在应用DSP时其实硬件一般都问题鈈大,主要的是软件是算法!下面的关于DSP运算的精华但愿有些价值!

一 DSP定点算数运算

在定点DSP芯片中,采用定点数进行数值运算其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于DSP芯片所给定的字长一般为16位或24位。显然字长越长,所能表示的数嘚范围越大精度也越高。如无特别说明本书均以16位字长为例。

DSP芯片的数以2的补码形式表示每个16位数用一个符号位来表示数的正负,0表示数值为正l则表示数值为负。其余15位表示数值的大小因此,

对DSP芯片而言参与数值运算的数就是16位的整型数。但在许多情况下数學运算过程中的数不一定都是整数。那么DSP芯片是如何处理小数的呢?应该说DSP芯片本身无能为力。那么是不是说DSP芯片就不能处理各种小數呢当然不是。这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位这就是数的定标。

通过设定小数点在16位数中的不哃位置就可以表示不同大小和不同精度的小数了。数的定标有Q表示法和S表示法两种表1.1列出了一个16位数的16种Q表示、S表示及它们所能表示嘚十进制数值范围。

从表1.1可以看出同样一个16位数,若小数点设定的位置不同它所表示的数也就不同。例如

16进制数,用Q0表示

16进制数鼡Q15表示

但对于DSP芯片来说,处理方法是完全相同的

从表1.1还可以看出,不同的Q所表示的数不仅范围不同而且精度也不相同。Q越大数值范圍越小,但精度越高;相反Q越小,数值范围越大但精度就越低。例如Q0 的数值范围是一32768到+32767,其精度为1而Q15的数值范围为-1到0.9999695,精度为1/03051洇此,对定点数而言数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围必须以牺牲精度为代价;而想精度提高,則数的表示范围就相应地减小在实际的定点算法中,为了达到最佳的性能必须充分考虑到这一点。

浮点数与定点数的转换关系可表示為:

例如浮点数x=0.5,定标Q=15则定点数xq=L0.5*3,式中LJ表示下取整反之,一个用Q=15表示的定点数16384其浮点数为163幼*2-15==0.5。浮点数转换为定点数时为了降低截尾误差,在取整前可以先加上0.5

2 高级语言:从浮点到定点

我们在编写DSP模拟算法时,为了方便一般都是采用高级语言(如C语言)来编写模拟程序。程序中所用的变量一般既有整型数又有浮点数。如例1.1程序中的变量i是整型数而pi是浮点数,hamwindow则是浮点数组

如果我们要将上述程序用某种足点DSP芯片来实现,则需将上述程序改写为DSP芯片的汇编语言程序为了DSP程序调试的方便及模拟定点DSP实现时的算法性能,在编写DSP汇编程序之前一般需将高级语言浮点算法改写为高级语言定点算法下面我们讨论基本算术运算的定点实现方法。

2.1 加法/减法运算的C语言定点摸擬

设浮点加法运算的表达式为:

将浮点加法/减法转化为定点加法/减法时最重要的一点就是必须保证两个操作数的定标

例1.4结果超过16位的定点加法

因为z的Q值为0所以定点值z=35000就是浮点值,这里z是一个长整型数当加法或加法的结果超过16位表示范围时,如果程序员事先能够了解到这種情况并且需要保持运算精度时,则必须保持32位结果如果程序中是按照16位数进行运算的,则超过16位实际上就是出现了溢出如果不采取适当的措施,则数据溢出会导致运算精度的严重恶化一般的定点DSP芯片都没有溢出保护功能,当溢出保护功能有效时一旦出现溢出,則累加器ACC的结果为最大的饱和值(上溢为7FFFH下溢为8001H),从而达到防止溢出引起精度严重恶化的目的

2.2乘法运算的C语言定点模拟

设浮点乘法运算嘚表达式为:

假设经过统计后x的定标值为Qx,y的定标值为Qy乘积z的定标值为Qz,则

所以定点表示的乘法为:

因为z的定标值为5故定点z=21666,即为浮點的z=.08

2.3除法运算的C语言定点摸拟

设浮点除法运算的表达式为:

假设经过统计后被除数x的定标值为Qx,除数y的定标值为Qy商z的定标值为Qz,则

所鉯定点表示的除法为:

因为商z的定标值为15所以定点z=16384,即为浮点z=.5

2.4程序变量的Q值确定

在前面几节介绍的例子中,由于xy,z的值都是已知的因此从浮点变为定点时Q值很好确定。在实际的DSP应用中程序中参与运算的都是变量,那么如何确定浮点程序中变量的Q值呢从前面的分析可以知道,确定变量的Q值实际上就是确定变量的动态范围动态范围确定了,则Q值也就确定了

设变量的绝对值的最大值为|max|,注意|max|必须尛于或等于32767取一个整数n,使满足

既然确定了变量的|max|就可以确定其Q值那么变量的|max|又是如何确定的呢?一般来说确定变量的|max|有两种方法。一种是理论分析法另一种是统计分析法。

有些变量的动态范围通过理论分析是可以确定的例如:

(4)理论已经证明,在自相关线性预测編码(LPC)的程序设计中反射系数ki满足下列不等式:|ki|<1.0,i=12,...p,p为LPC的阶数

对于理论上无法确定范围的变量,一般采用统计分析的方法来确定其动态范围所谓统计分析,就是用足够多的输入信号样值来确定程序中变量的动态范围这里输入信号一方面要有一定的数量,另一方媔必须尽可能地涉及各种情况例如,在语音信号分析中统计分析时就必须来集足够多的语音信号样值,并且在所采集的语音样值中應尽可能地包含各种情况。如音量的大小声音的种类(男声、女声等)。只有这样统计出来的结果才能具有典型性。

当然统计分析毕竟鈈可能涉及所有可能发生的情况,因此对统计得出的结果在程序设计时可采取一些保护措施,如适当牺牲一些精度Q值取比统计值稍大些,使用DSP芯片提供的溢出保护功能等

2.5浮点至定点变换的C程序举例

本节我们通过一个例子来说明C程序从浮点变换至定点的方法。这是一个對语音信号(0.3~3.4kHz)进行低通滤波的C语言程序低通滤波的截止频率为800Hz,滤波器采用19点的有限冲击响应FIR滤波语音信号的采样频率为8kHz,每个语音样徝按16位整型数存放在insp.dat文件中

/*低通滤波浮点子程序*/

/*低通滤波定点子程序*/

主程序与浮点的完全一样。“

定点DSP芯片的数值表示基于2的补码表示形式每个16位数用l个符号位、i个整数位和15-i个小数位来表示。因此:

这个数可用Q8格式(8个小数位)来表示其表示的数值范围为-128至+l27.996,一个Q8定点數的小数精度为1/256=0.004

虽然特殊情况(如动态范围和精度要求)必须使用混合表示法。但是更通常的是全部以Q15格式表示的小数或以Q0格式表示的整數来工作。这一点对于主要是乘法和累加的信号处理算法特别现实小数乘以小数得小数,整数乘以整数得整数当然,乘积累加时可能會出现溢出现象在这种情况下,程序员应当了解数学里面的物理过程以注意可能的溢出情况下面我们来讨论乘法、加法和除法的DSP定点運算,汇编程序以TMS320C25为例

两个定点数相乘时可以分为下列三种情况:

两个Q15的小数相乘后得到一个Q30的小数,即有两个符号位一般情况下相塖后得到的满精度数不必全部保留,而只需保留16位单精度数由于相乘后得到的高16位不满15位的小数据度,为了达到15位精度可将乘积左移┅位,下面是上述乘法的TMS320C25程序:

全文阅读已结束如果下载本文需要使用

该用户还上传了这些文档

我们看到加减法和一般的整数运算相同而乘除法的时候,为了使得结果的小数点位不移动对数值进行了移动。
用c语言来写定点小数的乘法就是:

我要回帖

 

随机推荐