没有合适的资源?快使用搜索试试~ 我知道了~
DSP浮点运算转定点处理
5星 · 超过95%的资源 需积分: 48 94 下载量 151 浏览量
2008-09-17
10:58:49
上传
评论 6
收藏 1.07MB DOC 举报
温馨提示
试读
17页
DSP浮点运算转定点处理 DSP浮点运算转定点处理DSP浮点运算转定点处理
资源推荐
资源详情
资源评论
第
3
章
DSP
芯片的定点运算
3.1
数
的
定
标
在定点
DSP
芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。一
个整型数的最大表示范围取决于
DSP
芯片所给定的字长,一般为
16
位或
24
位。显然,字长
越长,所能表示的数的范围越大,精度也越高。如无特别说明,本书均以
16
位字长为例。
DSP
芯片的数以
2
的补码形式表示。每个
16
位数用一个符号位来表示数的正负,
0
表示
数值为正,
1
则表示数值为负。其余
15
位表示数值的大小。因此
二进制数
0010000000000011b
=
8195
二进制数
1111111111111100b
=
-
4
对
DSP
芯片而言,参与数值运算的数就是
16
位的整型数。但在许多情况下,数学运算
过程中的数不一定都是整数。那么,
DSP
芯片是如何处理小数的呢?应该说,
DSP
芯片本
身无能为力。那么是不是说
DSP
芯片就不能处理各种小数呢?当然不是。这其中的关键就
是由程序员来确定一个数的小数点处于
16
位中的哪一位。这就是数的定标。
通过设定小数点在
16
位数中的不同位置,就可以表示不同大小和不同精度的小数了 。
数的定标有
Q
表示法和
S
表示法两种。表
3.1
列出了一个
16
位数的
16
种
Q
表示、
S
表示及它们
所能表示的十进制数值范围。
从表
3.1
可以看出,同样一个
16
位数,若小数点设定的位置不同,它所表示的数也就
不同。例如:
16
进制数
2000H
=
8192
,用
Q0
表示
16
进制数
2000H
=
0.25
,用
Q15
表示
但对于
DSP
芯片来说,处理方法是完全相同的。
从表
3.1
还可以看出,不同的
Q
所表示的数不仅范围不同,而且精度也不相同。
Q
越大,
数值范围越小,但精度越高;相反,
Q
越小,数值范围越大,但精度就越低。例如,
Q0
的
数值范围是
-
32768
到
+32767
,其精度为
1
,而
Q15
的数值范围为
-
1
到
0.9999695
,精度为
1/32768 = 0.00003051
。因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要
想能够表示比较大的数值范围,必须以牺牲精度为代价;而想提高精度,则数的表示范围
就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。
浮点数与定点数的转换关系可表示为:
浮点数
(x)
转换为定点数
(
x
q
)
:
定点数
( )
转换为浮点数
(x)
:
例如,浮点数
x=0.5
,定标
Q
=
15
,则定点数 = ,式中
表示下取整。反之,一个用
Q
=
15
表示的定点数
16384
,其浮点数为
16384×2
-
15
=
16384/32768=0.5
。
·
37
·
表
3.1 Q
表示、
S
表示及数值范围
Q
表示
S
表示 十进制数表示范围
Q15 S0.15
-
1
≤
X
≤
0.9999695
Q14 S1.14
-
2
≤
X
≤
1.9999390
Q13 S2.13
-
4
≤
X
≤
3.9998779
Q12 S3.12
-
8
≤
X
≤
7.9997559
Q11 S4.11
-
16
≤
X
≤
15.9995117
Q10 S5.10
-
32
≤
X
≤
31.9990234
Q9 S6.9
-
64
≤
X
≤
63.9980469
Q8 S7.8
-
128
≤
X
≤
127.9960938
Q7 S8.7
-
256
≤
X
≤
255.9921875
Q6 S9.6
-
512
≤
X
≤
511.9804375
Q5 S10.5
-
1024
≤
X
≤
1023.96875
Q4 S11.4
-
2048
≤
X
≤
2047.9375
Q3 S12.3
-
4096
≤
X
≤
4095.875
Q2 S13.2
-
8192
≤
X
≤
8191.75
Q1 S14.1
-
16384
≤
X
≤
16383.5
Q0 S15.0
-
32768
≤
X
≤
32767
3.2
高级语言:从浮点到定点
在编写
DSP
模拟算法时,为了方便,一般都是采用高级语言
(
如
C
语言
)
来编写模拟程
序。程序中所用的变量一般既有整型数,又有浮点数。如例
3.1
程序中的变量
i
是整型数,
而
pi
是浮点数,
hamwindow
则是浮点数组。
例
3.1 256
点汉明窗计算
inti;
float pi=3.14159;
float hamwindow[256];
for(i=0;i<256;i++) hamwindow[i]=0.54
-
0.46*cos(2.0*pi*i/255);
如果要将上述程序用某种定点
DSP
芯片来实现,则需将上述程序改写为
DSP
芯片的汇
编语言程序。为了
DSP
程序调试的方便及模拟定点
DSP
实现时的算法性能,在编写
DSP
汇
编程序之前一般需将高级语言浮点算法改写为高级语言定点算法。下面讨论基本算术运算
的定点实现方法。
3.2.1
加法
/
减法运算的
C
语言定点模拟
设浮点加法运算的表达式为:
float x,y,z;
·
38
·
z=x+y;
将浮点加法
/
减法转化为定点加法
/
减法时最重要的一点就是必须保证两个操作数的定
标值一样。若两者不一样,则在做加法
/
减法运算前先进行小数点的调整。为保证运算精
度,需使
Q
值小的数调整为与另一个数的
Q
值一样大。此外,在做加法
/
减法运算时,必须
注意结果可能会超过
16
位表示。如果加法
/
减法的结果超出
16
位的表示范围,则必须保留
32
位结果,以保证运算的精度。
1
.结果不超过
16
位表示范围
设
x
的
Q
值为
Qx
,
y
的
Q
值为
Qy
,且
Qx>Qy
,加法
/
减法结果
z
的定标值为
Qz
,则
z
=
x+y
=
=
所以定点加法可以描述为:
int x,y,z;
long temp; /*
临时变量
*/
temp
=
y<<(Qx
-
Qy);
temp
=
x
+
temp;
z
=
(int)(temp>>(Qx
-
Qz)),
若
Qx
≥
Qz
z
=
(int)(temp<<(Qz
-
Qx)),
若
QxQ
≤
z
例
3.2
定点加法
设
x
=
0.5
,
y
=
3.1
,则浮点运算结果为
z
=
x+y
=
0.5+3.1
=
3.6;
Qx
=
15
,
Qy
=
13
,
Qz
=
13
,则定点加法为:
x
=
16384
;
y
=
25395;
temp
=
25395<<2
=
101580;
temp
=
x+temp
=
16384+101580
=
117964;
z
=
(int)(117964L>>2)
=
29491;
因为
z
的
Q
值为
13
,所以定点值
z
=
29491
即为浮点值
z
=
29491/8192
=
3.6
。
例
3.3
定点减法
设
x
=
3.0
,
y
=
3.1
,则浮点运算结果为
z
=
x
-
y
=
3.0
-
3.1
=
-
0.1;
Qx
=
13
,
Qy
=
13
,
Qz
=
15
,则定点减法为:
x
=
24576
;
y
=
25295
;
temp
=
25395;
temp
=
x
-
temp
=
24576
-
25395
=
-
819;
因为
Qx<Qz
,故
z
=
(int)(
-
819<<2)
=
-
3276
。由于
z
的
Q
值为
15
,所以定点值
z
=
-
3276
即为浮
点值
z
=
-
3276/32768
-
0.1
。
2
.结果超过
16
位表示范围
·
39
·
设
x
的
Q
值为
Qx
,
y
的
Q
值为
Qy
,且
Qx>Qy
,加法结果
z
的定标值为
Qz,
则定点加法为:
int x
,
y
;
long temp
,
z
;
temp
=
y<<(Qx
-
Qy)
;
temp
=
x
+
temp;
z
=
temp>>(Qx
-
Qz)
,若
Qx
≥
Qz
z
=
temp<<(Qz
-
Qx)
,若
Qx
≤
Qz
例
3.4
结果超过
16
位的定点加法
设
x
=
15000
,
y
=
20000
,则浮点运算值为
z
=
x
+
y
=
35000
,显然
z>32767
,因此
Qx
=
1
,
Qy
=
0
,
Qz
=
0
,则定点加法为:
x
=
30000
;
y
=
20000
;
temp
=
20000<<1
=
40000;
temp
=
temp+x
=
40000+30000
=
70000;
z
=
70000L>>1
=
35000;
因为
z
的
Q
值为
0
,所以定点值
z=35000
就是浮点值,这里
z
是一个长整型数。
当加法或加法的结果超过
16
位表示范围时,如果程序员事先能够了解到这种情况,
并且需要保证运算精度时,则必须保持
32
位结果。如果程序中是按照
16
位数进行运算的,
则超过
16
位实际上就是出现了溢出。如果不采取适当的措施,则数据溢出会导致运算精度
的严重恶化。一般的定点
DSP
芯片都设有溢出保护功能,当溢出保护功能有效时,一旦出
现溢出,则累加器
ACC
的结果为最大的饱和值
(
上溢为
7FFFH
,下溢为
8001H)
,从而达到
防止溢出引起精度严重恶化的目的。
3.2.2
乘法运算的
C
语言定点模拟
设浮点乘法运算的表达式为:
float x,y,z;
z = xy;
假设经过统计后
x
的定标值为
Qx
,
y
的定标值为
Qy
,乘积
z
的定标值为
Qz
,则
z = xy
=
=
所以定点表示的乘法为:
int x,y,z;
long temp;
temp = (long)x;
z = (temp×y) >> (Qx+Qy
-
Qz);
例
3.5
定点乘法
设
x = 18.4
,
y = 36.8
,则浮点运算值为
z =18.4×36.8 = 677.12;
根据上节,得
Qx = 10
,
Qy = 9
,
Qz = 5
,所以
·
40
·
剩余16页未读,继续阅读
shiqudefeng0428
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页