DSP
学习?/p>
定标
许多
DSP
芯片只支持整数运算,
如果现在这些芯片上进行小数运算的话,
?/p>
点小?/p>
运算应该是最佳选择了,
此外即使芯片支持浮点数,
定点小数运算也是最
佳的速度选择?/p>
?/p>
DSP
世界中,由于
DSP
芯片的限?/p>
,
经常使用定点小数运算。所谓定?/p>
小数?/p>
实际上就是用整数来进行小数运算?/p>
下面先介绍定点小数的一些理论知识,
然后?/p>
C
语言
为例,介绍一下定点小数运算的方法。在
TI
C5000
DSP
系列中使
?/p>
16
比特为最小的储存单位?/p>
所以我们就?/p>
16
比特的整数来进行定点小数运算?/p>
?/p>
从整数开始,
16
比特的储存单位最多可以表?/p>
0x0000
?/p>
0xffff
?/p>
65536
种状态,如果它表?/p>
C
语言中的无符号整数的话,就是?/p>
0
?/p>
65535
。如果需
要表示负数的话,那么最高位就是符号位,而剩下的
15
位可以表?/p>
32768
种状
态。这里可以看出,对于计算机或?/p>
DSP
芯片来说,符?/p>
并没有什么特殊的?/p>
存方式,
其实是和数字一起储存的?/p>
为了使得无论是无符号数还是符号数?/p>
都可
以使用同样的加法减法规则,符号数中的负数用正数的补码表示?/p>
我们都知?/p>
-1
+
1
=0
,?/p>
0x0001
表示
1
,那?/p>
-1
用什么来表示才能使得
-1
+ 1 =0
呢?答案很简单:
0xffff
。现在就可以打开
Windows
的计算器,用
16
?/p>
制计算一?/p>
0xffff+0x0001
?/p>
结果?/p>
0x10000
?/p>
那么
0x10000
?/p>
0x0000
等价麽,
我们刚才说过?/p>
16
比特来表达整数,最高位?/p>
1
是第
17
位,这一位是溢出位,
在运算寄存器中没有储存这一位,所以结果是?/p>
16
位,也就?/p>
0x0000
。现在我
们知道负数的表达方式了?/p>
举个例子?/p>
-100
?/p>
首先我们需要知?/p>
100
?/p>
16
进制?/p>
用计算器转换一下,可以知道?/p>
0x0064
,那?/p>
-100
就是
0x10000 - 0x0064
,用
计算器算一下得
0xff9c
?/p>
还有一种简单的转换符号的方法,就是取反加一
:把?/p>
x
写成二进制格式,
每位
0
?/p>
1
?/p>
1
?/p>
0
,最后把结果?/p>
1
就是
-x
了?/p>
好,
复习了整数的相关知识之后,我们进入定点小数运算环节。所谓定?/p>
小数?/p>
就是小数点的位置是固定的?/p>
我们是要用整数来表示定点小数?/p>
由于小数
点的位置是固?/p>
的,所以就没有必要储存它(如果储存了小数点的位置,那就
是浮点数了)
?/p>
既然没有储存小数点的位置?/p>
那么计算机当然就不知道小数点?/p>
位置,所以这个小数点的位置是我们写程序的人自己需要牢记的?/p>
先以
10
进制为例。如果我们能够计?/p>
12+34=46
的话,当然也就能够计?/p>
1.2+3.4
或?/p>
0.12+0.34
了。所以定点小数的加减法和整数的相同,并且和小
数点的位置无关。乘法就不同了?/p>
12*34=408
,?/p>
1.2*3.4=4.08
。这?/p>
1.2
?/p>
小数点在?/p>
1
位之前,?/p>
4.08
的小数点在第
2
位之前,小数点发生了移动。所
以在做乘法的
时候,需要对小数点的位置进行调整?!可是既然我们是做定点
小数运算,那就说小数点的位置不能动!!怎么解决这个矛盾呢,那就是舍弃最