|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1 数的定标
在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。
一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。
显然,字长越长,所能表示的数的范围越大,精度也越高。
数的定标 :由程序员来确定一个数的小数点处于16位中的哪一位 ,通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数 。
方法:Q表示法和S表示法
同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同 ,但对于DSP芯片来说,处理方法是完全相同的。
对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想提高精度,则数的表示范围就相应地减小。
n浮点数与定点数的转换关系为:
n浮点数(x)转换为定点数( Xq ):
Xq = (int)X * 2 ^Q
n定点数( Xq)转换为浮点数(x):
X = (float) Xq * 2 ^-Q
2 定点算法
n以加法为例:设浮点加法运算的表达式为:
float x,y,z;
z=x+y;
n将浮点加法转化为定点加法时最重要的一点就是必须保证两个操作数的定标值一样。
n若两者不一样,则在做加法/减法运算前先进行小数点的调整。
n调整方法:为保证运算精度,需使Q值小的数调整为与另一个数的Q值一样大。
n在做加法运算时,必须注意结果可能会超过16位表示。如果加法的结果超出16位的表示范围,则必须保留32位结果,以保证运算的精度。
设x的Q值为Qx,y的为Qy。z的为Qz,则z = x + y => Zq * 2 ^ -Qz = Xq * 2 ^-Qx + Yq * 2 ^-Qy
运算得到 Zq = [Xq + Yq * 2 ^(Qx- Qy)] * 2 ^(Qx - Qy)
定点加法可以描述为:
int x,y,z;long temp; /*临时变量*/
temp=y<<(Qx-Qy);temp=x+temp;
z=(int)(temp>>(Qx-Qz)), 若Qx≥Qzz=(int)(temp<<(Qz-Qx)), 若Qx≤Qz
n当加法或加法的结果超过16位表示范围时,如果程序员事先能够了解到这种情况,并且需要保证运算精度时,则必须保持32位结果。n如果程序中是按照16位数进行运算的,则超过16位实际上就出现了溢出。
n一般的定点DSP芯片都设有溢出保护功能,当溢出保护功能有效时,一旦出现溢出,则累加器ACC的结果为最大的饱和值,从而达到防止溢出引起精度严重恶化的目的。
定点表示的乘法为:
int x,y,z;long temp;temp = (long)x;z = (temp×y) >> (Qx+Qy-Qz);
定点表示的除法为:
int x,y,z;
long temp;
temp = (long)x;
z = (temp<<(Qz-Qx+Qy))/y;
Q值确定
在实际的DSP应用中,程序中参与运算的都是变量,那么如何确定浮点程序中变量的Q值呢?
从前面的分析可以知道,确定变量的Q值实际上就是确定变量的动态范围,动态范围确定了,则Q值也就确定了。
设变量的绝对值的最大值为max,注意它必须小于或等于32767。取一个整数n,使它满足 2^n-1 < |max| < 2^n则有
Q = 15-n
两种方法:一种是理论分析法,另一种是统计分析法。1.理论分析法
有些变量的动态范围通过理论分析是可以确定的。例如:n(1) 三角函数,y = sin(x)或y = cos(x),由三角函数知识可知,|y|≤1;
n(2) 汉明窗,y(n) = 0.54-0.46cos [2pn/(N-1)] ,0≤n≤N-1。因为-1≤cos [2pn/(N-1)]≤1,所以0.08≤y(n)≤1.0;
n2.统计分析法对于理论上无法确定范围的变量,一般采用统计分析的方法来确定其动态范围。就是用足够多的输入信号样值来确定程序中变量的动态范围,这里输入信号一方面要有一定的数量,另一方面必须尽可能地涉及各种情况。
n当然,统计分析毕竟不可能涉及所有可能发生的情况,因此,对统计得出的结果在程序设计时可采取一些保护措施,如适当牺牲一些精度,Q值取比统计值稍小些,使用DSP芯片提供的溢出保护功能等。 |
|