DSP定点运算-Q格式
- 格式:docx
- 大小:15.86 KB
- 文档页数:2
DSP的定点运算DSP的定点运算技术2007-06-29 09:45:14阅读82评论0字号:大中小许DSP芯片只支持整数运算,如果现在这些芯片上进行小数运算的话,定点小数运算应该是最佳选择了,此外即使芯片支持浮点数,定点小数运算也是最佳的速度选择。
在DSP世界中,由于DSP芯片的限制,经常使用定点小数运算。
所谓定点小数,实际上就是用整数来进行小数运算。
下面先介绍定点小数的一些理论知识,然后以C语言为例,介绍一下定点小数运算的方法。
在TI C5000 DSP系列中使用16比特为最小的储存单位,所以我们就用16比特的整数来进行定点小数运算。
先从整数开始,16比特的储存单位最多可以表示0x0000到0xffff,65536种状态,如果它表示C语言中的无符号整数的话,就是从0到65535。
如果需要表示负数的话,那么最高位就是符号位,而剩下的15位可以表示32768种状态。
这里可以看出,对于计算机或者DSP芯片来说,符号并没有什么特殊的储存方式,其实是和数字一起储存的。
为了使得无论是无符号数还是符号数,都可以使用同样的加法减法规则,符号数中的负数用正数的补码表示。
我们都知道-1+1=0,而0x0001表示1,那么-1用什么来表示才能使得-1+1=0呢?答案很简单:0xffff。
现在就可以打开Windows的计算器,用16进制计算一下0xffff+0x0001,结果是0x10000。
那么0x10000和0x0000等价么,我们刚才说过用16比特来表达整数,最高位的1是第17位,这一位是溢出位,在运算寄存器中没有储存这一位,所以结果是低16位,也就是0x0000。
现在我们知道负数的表达方式了。
举个例子:-100。
首先我们需要知道100的16进制,用计算器转换一下,可以知道是0x0064,那么-100就是0x10000-0x0064,用计算器算一下得0xff9c。
还有一种简单的转换符号的方法,就是取反加一:把数x写成二进制格式,每位0变1,1变0,最后把结果加1就是-x了。
第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。
因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想提高精度,则数的表示范围就相应地减小。
一DSP定点算数运算1 数的定标在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。
一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。
显然,字长越长,所能表示的数的范围越大,精度也越高。
如无特别说明,本书均以16位字长为例。
DSP芯片的数以2的补码形式表示。
每个16位数用一个符号位来表示数的正负,0表示数值为正,l则表示数值为负。
其余15位表示数值的大小。
因此,二进制数0010000000000011b=8195 二进制数1111111111111100b= -4 对DSP芯片而言,参与数值运算的数就是16位的整型数。
但在许多情况下,数学运算过程中的数不一定都是整数。
那么,DSP芯片是如何处理小数的呢?应该说,DSP芯片本身无能为力。
那么是不是说DSP芯片就不能处理各种小数呢?当然不是。
这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。
这就是数的定标。
通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。
数的定标有Q表示法和S表示法两种。
表1.1列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围。
从表1.1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。
例如,16进制数2000H=8192,用Q0表示16进制数2000H=0.25,用Q15表示但对于DSP芯片来说,处理方法是完全相同的。
从表1.1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。
Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。
例如,Q0 的数值范围是一32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051。
因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想精度提高,则数的表示范围就相应地减小。
DSP_Q 格式
1、Q 格式
就是将一个小数放大若干倍后,用整数来表示小数。
用这个放大的整数来进行中间过程的计算,最后把计算得出的结果又移位缩小为 原本的小数。
具体的Q 值是指小数点位于内存存储单元的第几位的右侧,把存储 单元分成整数和小数两部分。
2、Q 格式的定标
在定点DSP 处理器中,其数据结构一般用整型来表示,用定点的方式进行各种运 算,整型变量在内存中所占的自己数根据平台的不同而不同,一般情况下整型变 量占4个字节的存储单元。
如果我们要在定点DSP 中处理浮点数,那么我们就需要 通过Q 格式把浮点数表示成整型进行运算。
浮点数在内存单元中时分部存储,分 成符号位、数字、指数三个部分。
通过整型来表示浮点数进行存储,就是在内存 单元中利用小数点的位置将内存单元划分为两个部分,来分别表示整数和小数部 分。
这就是嵌入式浮点处理中所谓的数的定标。
3、Q 格式的运算
1> 定点加减法:须转换成相同的Q 格式才能加减
2> 定点乘法:不同Q 格式的数据相乘,相当于Q 值相加
3> 定点除法:不同Q 格式的数据相除,相当于Q 值相减
4> 定点左移:左移相当于Q 值增加
5> 定点右移:右移相当于Q 减少
4、Q 值的确定
设变量的绝对值的最大值为|max|,注意|max|必须小于或等于32767。
取一个整 数n ,使满足
12max 2n n -<<则有
2-Q=2-15*2n=2-(15-n)
Q=15-n
例如,某变量的值在-1至+1之间,即|max|<1,因此n=0,Q=15-n=15。
一DSP定点算数运算1 数的定标在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。
一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。
显然,字长越长,所能表示的数的范围越大,精度也越高。
如无特别说明,本书均以16位字长为例。
DSP芯片的数以2的补码形式表示。
每个16位数用一个符号位来表示数的正负,0表示数值为正,l则表示数值为负。
其余15位表示数值的大小。
因此,二进制数0010000000000011b=8195二进制数1111111111111100b= -4对DSP芯片而言,参与数值运算的数就是16位的整型数。
但在许多情况下,数学运算过程中的数不一定都是整数。
那么,DSP芯片是如何处理小数的呢?应该说,DSP芯片本身无能为力。
那么是不是说DSP芯片就不能处理各种小数呢?当然不是。
这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。
这就是数的定标。
通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。
数的定标有Q表示法和S表示法两种。
表1.1列出了一个16位数的16种Q 表示、S表示及它们所能表示的十进制数值范围。
从表1.1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。
例如,16进制数2000H=8192,用Q0表示16进制数2000H=0.25,用Q15表示但对于DSP芯片来说,处理方法是完全相同的。
从表1.1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。
Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。
例如,Q0 的数值范围是-32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051。
因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想精度提高,则数的表示范围就相应地减小。
Q格式:通俗的讲就是将一个小数放大若干倍后,用整又有16位Q格式和32位Q格式,其中16位Q格式的库为<Qmath.h>,32位Q格式的库为<IQmath.h>。
那个字母可以理解为增强型Increase,即32DSP是16位DSP的增强型,然后32位的就用IQ表示。
为什么要用到Q格式?因为CPU是定点微处理器时不能直接处理小数,C语言中的自动调用运行时的函数来的差别,用户的编程工作量最少,但是编译出来的代码很庞大,在嵌入式应用中很多情况下,float型几Q格式定标法:通过假定小数点位于二进制位中某位的右侧,从而确定小数的精度。
Q0:小数点在第0位0~14位都是小数位。
※Q格式:小数点位于第 n 位元之右侧,称为Qn 格式。
例如;16位元二进位数:0100 0010 1000 0001à在Q0格式下其表示的是:2^14+2^9+2^7+2^0=17025(d);à在Q8格式下其表示的是:2^6+2^1+2^-1+2^-8 16=0.25978~(d)整数定标本质上并不复杂,简单地说,就是通过假定小数点位于哪一位。
从而确定小数精度。
实际应用以要选择一个适当的定标格式才能更好的处理运算。
DSP定点运算处理器运算浮点数时,对浮点数转换为度限制,下表详细记录了Q格式的取值和精度。
,用整数来表示小数。
其中Q是定点格式,浮点数进行定点数运算处理时一般有Q格式和S格式,位Q格式的库为<Qmath.h>,32位Q格式的库为<IQmath.h>。
那个字母I表示32位的DSP的标号,16位的DSP前面没有字母是16位DSP的增强型,然后32位的就用IQ表示。
微处理器时不能直接处理小数,C语言中的自动调用运行时的函数来处理浮点数(float型),C语言中抹平了定点处理是编译出来的代码很庞大,在嵌入式应用中很多情况下,float型几乎不能去想,所以才会要用到Q格式定标法。
DSP芯片的定点运算---Q格式(转)
2008-09-03 15:47
DSP芯片的定点运算
1.数据的溢出:
1>溢出分类:
上溢(overflow):
下溢(underflow)
2>溢出的结果:
Max
Min
上溢在圆圈上按数据逆时针移动;下溢在圆圈上顺时钟移动。
例:signed int :32767+1=-32768;-32768-1=32767
unsigned char:255+1=0;0-1=255
3>为了避免溢出的发生,一般在DSP中可以设置溢出保护功能。
当发生溢出时,自动将结果设置为最大值或最小值。
2.定点处理器对浮点数的处理:
1>定义变量为浮点型(float,double),用C语言抹平定点处理器和浮点处理器
的区别,但是程序的代码庞大,运算速度也慢。
2>放大若干倍表示小数。
比如要表示精度为0.01的变量,放大100倍去运算,
运算完成后再转化。
但是这个做法比较僵硬,如要将上面的变量重新定义成
0.001精度,又需要放大1000倍,且要重新编写整个程序,考虑溢出等问题。
3>定标法:Q格式:通过假定小数点位于哪一位的右侧,从而确定小数的精度。
Q0:小数点在第0位的后面,即我们一般采用的方法
Q15 小数点在第15位的后面,0~14位都是小数位。
转化公式:Q=(int)(F×pow(2,q))
F=(float)(Q×pow(2,-q))
3.Q格式的运算
1>定点加减法:须转换成相同的Q格式才能加减
2>定点乘法:不同Q格式的数据相乘,相当于Q值相加
3>定点除法:不同Q格式的数据相除,相当于Q值相减
4>定点左移:左移相当于Q值增加
5>定点右移:右移相当于Q减少
4.Q格式的应用格式
实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。
所以要选择
一个适当的定标格式才能更好的处理运算。
一般用如下两种方法:
1>使用时使用适中的定标,既可以表示一定的整数复位也可以表示小数复位,如
对于2812的32位系统,使用Q15格式,可表示-65536.0~65535.999969482
区间内的数据。
2>全部采用小数,这样因为小数之间相乘永远是小数,永远不会溢出。
取一个极
限最大值(最好使用2的n次幂),转换成x/Max的小数(如果Max是取的2的n次幂,就可以使用移位代替除法)。
5.Ti的qmath.lib库说明:
见TI的文档C28x IQMath Library (SPRC087a).zip的详细说明。
TI公司给出了一个Q格式的数学库qmath.lib
注意Q格式函数使用的时序和空间要求,尽量避重就轻。