第三章 DSP定点运算
DSP芯片编程中数的定点运算(精)
通信与广播电视拜年第期〔〔一一一一一」二一一主程序印 , , , 印二, ” ’ , ’ , 勺一输入语音文件滤波后语音文件 , 斤户 , 取一帧语音数据 , , , 调用低通滤波子程序【〕 , 解将滤波后的样值写人文件关闭文件三定点、定点算术运算的补码表示形式侧刃。
芯片的数值表示是基于一每个位数用个符号位一、个整一数位和巧 , , 个小数位来表示格式。
因此数表示的值为, ’ , 二这个数可用一个个小数位来表示。
它表示的数值范围为 , 一一定点数的小数精度为如动态范围和精度要求 , 虽然特殊情况必须使用混合表示法。
, 但是。
, 更通常的是全 , 部以巧格式表示的小数或以格式表示的整数来工作 , 这一点对于主要是乘法和累加的信号处理算法特别现实能会出现溢出现象 , 小数乘以小数得小数整数乘以整数得整数当然乘积累加时可在这种情况下程序员应当了解数学里面的物理过程以注意可能的溢出情况。
定点乘法个定点数相乘时可以分为下列种情况洲抖年第期通信与广播电视小数乘小数例刃刃刃刃冷以刃犯拟叉刃侧又幻】刃犯 , 个巧的小数相乘后得到 , , 个 , 的小数即有。
个符号位。
一般情况下相乘后得到的满精度数不必全部保留而只需保留位单精度数由于相乘后得到的高位不满巧位的小数精度二为了达到巧位精度可将乘积左移位整数乘整数例叉一一心〕一二一混合表示法许多情况下与例 , 运算过程中为了既满足数值的动态范围又保证一定的精度。
, 就必须采用表示 , 巧之间的表示法 , 比如。
, 数值 , , 显然巧无法表示 , 而若用。
则最接近的数是精度无法保证又因此数最佳的表示法是创《刃刃刃洲二拟洲洲洲犯叹心阅口心刃侧刃 , 心的最大值不大于一般的 , 因此 , 个 , 数相乘得到的乘积不大于小数位为位 , 。
若一个数的整数位为位十另一个数的整数位为位 , 小数位为位 , 则这两个数的乘积为整数位和 , 位整数位和巧一一位小数位。
这个乘积的最高位可能的精度为小数位但是不会大于 , 若事先了解数的动态范围 , 就可以增加数的精度 , 。
DSP的定点运算
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了。
DSP芯片的定点运算
浮点数 x=0.5,定标 Q=15, 则定点数=0.5*32768=16384
SuQian College
Q表示、S表示及数值范围
QHale Waihona Puke 示 Q15 Q14. . . . . .
Q1 Q0
S表示 S0.15 S1.14
. . . . . .
S14.1 S15.0
十进制数表示范围 -1≤X≤0.9999695 -2≤X≤1.9999390
. . . . . .
-16384≤X≤16383.5 -32768≤X≤32767
1 定点的基本概念
SuQian College
1、数的定标
在定点DSP芯片中,采用定点数进行数值运算, 其操作数一般采用整型数来表示
DSP芯片的数以2的补码形式表示 数的定标:Q表示法和S表示法 对定点数而言,数值范围与精度是一对矛盾, 一个变量要想能够表示比较大的数值范围,必须 以牺牲精度为代价。
SuQian College
Q表示法16进制数2000H
Q0表示为8192
SuQian College
0010000000000000
符
号 位 Q15表示为0.25
小数点的位置
0010000000000000
小数点的位置
浮点数与定点数的转换关系
浮点数转换为定点数
xq int x 2Q
定点数转换为浮点数
DSP定标方法
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。
因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想提高精度,则数的表示范围就相应地减小。
3.DSP的数值运算基础介绍
课程名称:DSP芯片及应用
Agenda: 3.1 引言 3.2 定点的基本概念 3.3 定点运算实现的基本原理 3.4 DSP定点算术运算实现的基本原理 3.5 非线性运算定点实现方法 3.6 浮点数的表示格式 3.7 基本的浮点运算 3.8 非线性浮点运算的快速实现 3.9 小结 3.10 习题与思考题
31引言32定点的基本概念33定点运算实现的基本原理34dsp定点算术运算实现的基本原理35非线性运算定点实现方法36浮点数的表示格式37基本的浮点运算38非线性浮点运算的快速实现39小结310习题与思考题muchunyang126com3934dsp定点算术运算实现的基本原理341定点乘法两个定点数相乘二进制乘法可分解为一系列的移位和加法
【例】浮点数x=0.6,定标Q=15,求对应的定点数xq?
【例】定点数19660,定标Q=15,求对应的浮点数x?
xq = (int ) x × 2Q = ⎢⎢⎣0.6× 215 ⎥⎥⎦ = ⎢⎣ 0.6×32768⎥⎦ = 19660 注: ⎢ ⎣ ⎥⎦ 表示下取整。
x = ( float ) xq × 2−Q = 19660× 2−15 = 19660 / 32768 = 0.599975585
dsp定点运算与定标
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。
因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想提高精度,则数的表示范围就相应地减小。
Q格式_dsp定点和浮点数学运算规则
Q格式有符号数的表示法,机器数(出现在电脑的二进位数值)有3个特点,无符号或符号转换成数值来表示,没有+10101这样的资料,而是以010101来表示,只表示单纯的整数或小数,小数点的位置预设在一定的位置而较少变动,它的长度受到电脑硬体的限制,而不能无限增长。
Q格式,就是将一个小数放大若干倍后,用整数来表示小数。
Q格式前提无符号数:当参与运算的数值没有负数且运算的结果也没有负数时,则所有字元都可以表示数值,这种没有符号的数,称为无符号数(如记忆体储存位址),有符号数:数值中有某位数值代表符号,通常最高位作为符号位,0代表正,1代表负。
真值:有符号数所代表的数值,例如:110所代表的值是-2 而非6,有符号数只要去除符号位就可以获得该数的大小,在运算时,它的符号位可参与运算。
但在加减运算时,必须将它分离出来,才能进行运算。
有时,还要确定哪个有符号数的真值比较大,才能确定结果的符号。
为了达到这些功能,电路的设计就相当复杂。
所以很多电脑系统不直接使用有符号数,而使用有符号数的1’s补数或2’s补数表示法作为编码系统正弦脉波宽度调变(SPWM)之控制方法经Q 格式乘法器转换成振幅与频率可变V/F 控制,当成其单相感应马达的输入信号,藉由控制责任周期的大小,以达到变电压相对改变频率的效果。
DSP1.实现数位系统的第一步在自然世界中,所有的物理量包括时间、电压、质量、位移等等,都是类比的、连续的。
可是在数位系统中,讯号是在不连续的时间点取样,物理量或讯号的大小也不再是连续,而是被量化(Quantized)。
在数位系统中,只能用有限字元长度的数字去表示数量的大小,而不能以无限精确的数值(实数)去表示。
为了实现数位系统;使用了定数数与浮点数的表示法。
a)定点数(Fixed Point Number):指一个数字的表示,其小数点是在固定的位置(位元)。
b)浮点数(Floating Point Number):使用假数以及指数两部分来表示数值。
第3章 DSP芯片的定点运算
面向TI公司C6000系列DSP的电源系统设计电子科技大学电子工程学院顾良解梅近年来,随着芯片制造技术的不断提高,数字信号处理器(DSP)的性能得到了极大的改善,DSP在航空、航天、雷达、通信,家用电器等领域获得了越来越广泛的应用。
在诸多制造DSP器件的公司中,TI 公司享有很高的声誉并占有较大的市场份额。
本文将根据在从事科研工作中的实际经验给出一种适合于TI公司C6000系列DSP的电源供给系统的设计方案。
在整个DSP系统设计当中,?电源系统的设计应该放在最后完成。
因为只有当整个系统的其他部分已经确定,?且器件型号均已选好之后,才能获得所需的功率、电流、电压大小等具体信息,从而决定电源系统所应选取的器件,并采用合适的方案来实现。
德州仪器公司TMS320C6000系列DSP器件所需电源的特点,?C6000DSP需要外部提供两种电源:?CPU核电源以及周边I/O接口电源。
?周边I/O的电压一般是3.3V,由于许多外部器件均采用3.3V电压,故而DSP可与这样的外部器件直接接口,不需再附加其他电平转换器件。
?CPU核心电压随器件的不同而不同(比如C62X的电压有2.5V,1.8V,1.5V等;?C64X有1.4V,1.2V;?C67X有1.9V,1.8V等),?但都小于I/O电压,这样可以大大降低芯片的功耗。
根据C6000DSP器件所需电源的特点,就可以进行相应的电源系统的设计了。
供电电路的设计如果系统外部能够提供上述两种电压,?供电电路就不再需要设计。
由于大部分数字系统工作于5V或3.3V,外部一次提供一个5V、3.3V或其他数值的电压是比较常见的情况。
此时,就需要将外部输入电压转化为所需的电压,可采用电压调节器来完成此任务。
电压调节器可以采用TI公司提供的TPS56XX、TPS56100、TPS5602等芯片,?本文的系统就采用了TPS5602。
这款芯片有以下主要特点:(1)宽广的输入电压范围:4.5V~25V。
第3讲 定点运算及浮点运算汇总
结果超过16位的定点加法
例子: 设x=15000,y=20000,则浮点运算结果为z
=x+y=15000+20000=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;
除法运算的C语言定点模拟
z = x/y
zq 2Qz=
xq 2Qx yq 2Qy
zq
xq
2(Qz Qx Qy ) yq
float x,y,z; z = x/y;
int x,y,z;
long temp;
temp = (long)x;
z = (temp<<(Qz-Qx+Qy))/y;
定点除法
0010000000000000
小数点的位置
浮点数与定点数的转换关系
浮点数转换为定点数
xq int x 2Q
定点数转换为浮点数
x floatxq 2Q
浮点数 x=0.5,定标 Q=15, 则定点数=0.5*32768=16384
Q表示 Q15 Q14
. . . . . .
Q1 Q0
DSP芯片的数以2的补码形式表示 数的定标:“小数点” 的位置 Q表示法和S表示法 对定点数而言,数值范围与精度是一对矛盾,一 个变量要想能够表示比较大的数值范围,必须以 牺牲精度为代价。
Q表示法16进制数2000H
Q0表示为8192
0010000000000000
符
号 位 Q15表示为0.25
DSP 定点乘法运算
除法
加法 定点运算
乘法
减法
定点乘法的现实及原理
设浮点乘法运算的表达式为: float x,y,z; z = xy; 假设经过统计后x的定标值为Qx,y的定标值为Qy,乘积z的定标值为 Qz,则
故定点乘法表示为: int x , y , z ; long temp; temp=(long)x z=(temp×y)>>(Qx+Qy-Qz)
Q越大,数值范围越小,但精度 越高;相反,Q越小,数值范围 越大,但精度就越低。
浮点数X与定点数Xq的转换
xq (int)x 2Q
x (float)xq 2Q
例子:
浮点数X=0.5,定标 Q=15, 则定点数 Xq=[0.5×32768]=16384,[] 中表示下取整。反之,一个用 Q=15 表示的定点数16384, 其浮点数为16384×2^(-15) =16384/32768=0.5
数的标定及Q值确定
数的标定即由程序员来确定1个数的小数点处于16位数的哪一位。 S表示法
数标定的方法 Q表示法
Q值得确定(Q0-Q15)
从表3.1可以看出,同样一个16位数, 若小数点设定的位置不同,它所表示 的数也就不同。 例如: 16进制数2000H=8192,用Q0表 示 1示6进制注范意围数:不20不同0同,0H的而=且Q0所精.2表度5示,也的不用数相Q不同15仅.8,则浮点运算值 为 z =18.4×36.8 = 677.12; 根据上节,得Qx = 10,Qy = 9,Qz = 5,所以 x = 18841;y = 18841; temp = 18841L; z = (18841L*18841)>>(10+9-5) = 354983281L>>14 = 21666; 因为z的定标值为5,故定点 z = 21666 即为浮点的 z = 21666/32 = 677.08
DSP-定点和浮点数格式
0.0625 0.125 0.25
0.5 1
3)动态范围
动态范围:数据表示格式中可以表示的最大值与最小值之比
N位定点数的动态范围:
DR
=
fix
(2N
1
1
1) / 2n
/
2n
2N 1 1
用分贝表示为:
DRfix=20 log10 2N1 1 6.02(N 1) dB
00001000b - 00000110b 商数:00001101 余数:00000010b
⑥ ⑦
00000100b - 00000110b 余数(丢弃):11111110b 商数:00011010 余数:00000100b
00001000b - 00000110b 商数: 00110101 余数:00000010b
① 小数乘小数(n、m≠0,m≤ n)
例:两个相乘数分别为Q7和Q6格式,8位字长
两个定点小数作乘法运算,结果左移一位,保存高位得到 运算结果,结果为Qm(m≤ n)格式
0.1000000b(0.5 Q7 )
01.100000b(1.5 Q6 )
000.1100000000000b(0.75 Q13)
对于负数(最高位MSB为1),要先把它转化为无符号二进制数,再进 行计算,最后加上负号
位
7 MSB
6
5
4
3
2
1
0 LSB
二进制补码 0
1
0
1
0
0
1
1
Q0
符号 26
252423源自222120
Q4
符号 22
21
20
DSP--定点编程技术概要
1 技术总结1.1 浮点和定点的转换在定点中,最大的正数为32767,对应浮点为1,最小的负数为-32768,对应浮点为-1。
转换过程为将正浮点数乘以32767得到相应的定点输出,如0.5转换为定点过程为0.5×32767=0x3fff ;3转换为定点过程为3×32767=0x17ffd 。
负浮点数乘以32767,再减去1。
定点乘法:在定点中,小数乘法和整数乘法是不同的。
如整数乘法16383×16383在定点中可以表示为0x3fff ×0x3fff ,小数乘法0.5×0.5=0.25在定点中表示为2×0x3fff ×0x3fff =0x1fff0002,取高16位为有效数据0x1fff =8191,8191/32767=0.25。
1.2 Q15,Q16,Q30和Q31在定点编程中,我们经常会遇到对定点数据的位数进行舍取,即在正确的位置确定数据小数点的问题,下面我们讨论两个例子:第一个例子是0.5×0.5=0.25,我们前面说到定点乘法要将结果乘以2,这是因为该小数乘法可以等效为定点乘法:03030303080010.50.507070707030001080012010002 0300012070002x fff x fff x fff x fff xfff x fff x fff x fff x fff x fff xfff x fff x fff x fffe ⨯⨯=⨯==⨯⨯==⨯我们以分母确定整个小数的有效位数,0x3fff0001的有效位为30位,小数为Q30。
如果将小数的分子分母同时乘以2,则分母31位有效,相应分子有效位也为31位,小数为Q31。
第二个例子是整数小数乘法:0.5×3=1.5。
仍然进行等效变形:03303320170.53070720x fff x fff x ffax fff x fff xfffe ⨯⨯⨯⨯===⨯017033322017066640.530.400720x ffax x ffa x xfffe x fff xfffe ⨯+⨯+=+=⨯当整数乘以小数的时候,结果有可能大于1,小数点后的有效位取Q16或者Q32,所以1.5表示为定点为0x17ffa ,指数(16)2-。
DSP原理及应用第三章
15~8 7 6~0
操作码
I=0
dmad
堆栈指针SP
16位堆栈指针SP
SP+dmad
16位数据 存储器地址 16位SP+dmad 高 9位
dmad
低 7位
15
DP地址的范围是从0~511(29-1),将存储器分成 512页。 7 位 dmad 范围是从 0~127 ,每页有 128 个可以访 问的单元。 以DP为基准的直接寻址是由DP 值确定是 512 页中 的哪一页,由dmad确定是该页中的哪一个单元。 SP 可以指向存储器中的任意一个地址。 dmad 可 以指向当前页中具体的单元,从而允许访问存储器 任意基地址中的连续的128个单元
循环寻址的有效地址计算
循环缓冲区的参数主要包括:长度寄存器 (BK)、有效基地址(EFB)、尾地址(EOB)。 N>32, 则N=6。 例如:缓冲区长度 R=32 , 若 2 BK:定义了循环缓冲区的大小R。大小为R的循环缓冲 缓冲区开始的地址: xxxx xxxx xx00 0000 B 器其地址要始于最低 N位为零的地址。并且 R要满足下 缓冲区长度 N>R 装入循环缓冲长度寄存器BK中。 面的条件: 2R=32 EFB:循环缓冲器的有效基地址(EFB)就是用户选定 的辅助寄存器(ARx)的低N位置 0后所得到的值。 EOB:是通过用BK的低N位代替ARx的低N位得到。
LD
*(BUFFER),A
9
绝对寻址总结
16位地址表示形式: ① 地址符号,如:TABLE; ② 16位数值,如:89AB、1234。 特点:指令中包含一个固定的16位地址,能寻 址所有数据、程序和I/O存储空间,但 运行速度慢,需要较大的存储空间。 用途:用于对速度要求较低的场合。
dsp芯片的定点运算(精)
LAR AR1,#0FH RPT 14 NORM *-上述程序执行后,AR1=#0eH,ACCH=2000(10进制。
对一个16位整数 x 进行上述程序处理实际上就是做这样一个等效变换: x ⋅ 2Q 15−Q x= ⋅2 32768 其中,寄存器 AR1 包含的值为 15-Q ,累加器 ACC 高 16 位包含的值为 x ⋅ 2 Q ,其数值在 16384~32768之间。
例3.15 实现以2为底的对数的C定点模拟程序 int logtab0[10]={-32768,-28262,-24149,-20365,-16862, -13600,-10549,-7683,-4981,-2425}; /*Q15*/ int logtab1[10]={22529,20567,18920,17517,16308, 15255,14330,13511,12780,12124}; /*Q13*/ int logtab2[10]={16384,18022,19660,21299,22938, 24576,26214,27853,29491,31130};/*Q15*/ int log2_fast(int Am { int point,point1; int index,x0,dx,dy,y; point=0;while(Am<16384 {point++;Am=Am<<1;} /*对Am进行规格化*/ /*输入为Q4,输出为Q9*/ point1=(15-point-4*512; /*求查表地址*/ index=((Am-16384*20L>>15; dx =Am-logtab2[index]; dy=((longdx*logtab1[index]>>13; /*Q9*/ y=(dy+logtab0[index]>>6; y=point1+y; return (y; } 上述程序中,输入值Am采用Q4表示,输出采用Q9表示,如果输入输出的Q值与上面程序中的不同,则应做相应的修改。
DSP中浮点转定点运算--浮点与定点概述
DSP中浮点转定点运算--浮点与定点概述⼀:浮点与定点概述1.1相关定义说明 定点数:通俗的说,⼩数点固定的数。
以⼈民币为例,我们⽇常经常说到的如123.45¥,789.34¥等等,默认的情况下,⼩数点后⾯有两位⼩数,即⾓,分。
如果⼩数点在最⾼有效位的前⾯,则这样的数称为纯⼩数的定点数,如0.12345,0.78934等。
如果⼩数点在最低有效位的后⾯,则这样的数称为纯整数的定点数,如12345,78934等。
浮点数:⼀般说来,⼩数点不固定的数。
⽐较容易的理解⽅式是,考虑以下我们⽇常见到的科学记数法,拿我们上⾯的数字举例,如123.45,可以写成以下⼏种形式:12.345x1011.2345 x1020.12345 x103……为了表⽰⼀个数,⼩数点的位置可以变化,即⼩数点不固定。
1.2定点数与浮点数的对⽐为了简单的把问题描述清楚,这⾥都是⼗进制数字举例,详细的分析,⼤家可以在后⾯的⽂章中看到。
(1)表⽰的精度与范围不同例如,我们⽤4个⼗进制数来表达⼀个数字。
对于定点数(这⾥以定点整数为例),我们表⽰区间[0000,9999]中的任何⼀个数字,但是如果我们要想表⽰类似1234.3的数值就⽆能为⼒了,因为此时的表⽰精度为1/100=1;如果采⽤浮点数来表⽰(以归整的科学记数法,即⼩数点前有⼀位有效位,为例),则可以表⽰[0.000,9.999]之间的任何⼀个数字,表⽰的精度为1/103=0.001,精度⽐上⼀种⽅式提⾼了很多,但是表⽰的范围却⼩了很多。
也就是说,⼀般的,定点数表⽰的精度较低,但表⽰的数值范围较⼤;⽽浮点数恰恰相反。
(2)计算机中运算的效率不同⼀般说来,定点数的运算在计算机中实现起来⽐较简单,效率较⾼;⽽浮点数的运算在计算机中实现起来⽐较复杂,效率相对较低。
(3)硬件依赖性⼀般说来,只要有硬件提供运算部件,就会提供定点数运算的⽀持(不知道说的确切否,没有听说过不⽀持定点数运算的硬件),但不⼀定⽀持浮点数运算,如有的很多嵌⼊式开发板就不提供浮点运算的⽀持。
DSP定点运算-Q格式
DSP芯片的定点运算---Q格式(转)2008-09-03 15:47DSP芯片的定点运算1.数据的溢出:1>溢出分类:上溢(overflow):下溢(underflow)2>溢出的结果:MaxMin上溢在圆圈上按数据逆时针移动;下溢在圆圈上顺时钟移动。
例:signed int :32767+1=-32768;-32768-1=32767unsigned char:255+1=0;0-1=2553>为了避免溢出的发生,一般在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区间内的数据。
DSP中浮点转定点运算--举例及编程中的心得
DSP中浮点转定点运算--举例及编程中的⼼得5.举例及编程中的⼼得5.1举例 “第3章 DSP芯⽚的定点运算.doc”这篇⽂章中给了⼀个很简单有能说明问题的例⼦,不想动⼤脑了,直接引⽤过来如下。
这是⼀个对语⾳信号(0.3kHz~3.4kHz)进⾏低通滤波的C语⾔程序,低通滤波的截⽌频率为800Hz,滤波器采⽤19点的有限冲击响应FIR滤波。
语⾳信号的采样频率为8kHz,每个语⾳样值按16位整型数存放在insp.dat⽂件中。
例3.7 语⾳信号800Hz 19点FIR低通滤波C语⾔浮点程序复制代码代码如下:#include <stdio.h>const int length = 180 /*语⾳帧长为180点=22.5ms@8kHz采样*/void filter(int xin[ ],int xout[ ],int n,float h[ ]); /*滤波⼦程序说明*//*19点滤波器系数*/static float h[19]={0.01218354,-0.009012882,-0.02881839,-0.04743239,-0.04584568,-0.008692503,0.06446265,0.1544655,0.2289794,0.257883,0.2289794,0.1544655,0.06446265,-0.008692503,-0.04584568,-0.04743239,-0.02881839,-0.009012882,0.01218354};static int x1[length+20];/*低通滤波浮点⼦程序*/void filter(int xin[ ],int xout[ ],int n,float h[ ]){int i,j;float sum;for(i=0;i<length;i++) x1[n+i-1]=xin[i];for (i=0;i<length;i++){sum=0.0;for(j=0;j<n;j++) sum+=h[j]*x1[i-j+n-1];xout[i]=(int)sum;}for(i=0;i<(n-1);i++) x1[n-i-2]=xin[length-1-i];}/*主程序*/void main( ){FILE *fp1,*fp2;int frame,indata[length],outdata[length];fp1=fopen(insp.dat,"rb"); /*输⼊语⾳⽂件*/fp2=fopen(outsp.dat,"wb"); /*滤波后语⾳⽂件*/frame=0;while(feof(fp1)==0){frame++;printf("frame=%d/n",frame);for(i=0;i<length;i++) indata[i]=getw(fp1); /*取⼀帧语⾳数据*/filter(indata,outdata,19,h); /*调⽤低通滤波⼦程序*/for(i=0;i<length;i++) putw(outdata[i],fp2); /*将滤波后的样值写⼊⽂件*/}fcloseall( ); /*关闭⽂件*/return(0);}例3.8 语⾳信号800Hz 19点FIR低通滤波C语⾔定点程序复制代码代码如下:#include <stdio.h>const int length=180;void filter(int xin[ ],int xout[ ],int n,int h[ ]);static int h[19]={399,-296,-945,-1555,-1503,-285,2112,5061,7503,8450,7503,5061,2112,-285,-1503,-1555,-945,-296,399}; /*Q15*/static int x1[length+20];/*低通滤波定点⼦程序*/void filter(int xin[ ],int xout[ ],int n,int h[ ]){int i,j;long sum;for(i=0;i<length;i++) x1[n+i-1]=xin[i];for (i=0;i<length;i++){sum=0;for(j=0;j<n;j++) sum+=(long)h[j]*x1[i-j+n-1];xout[i]=sum>>15;}for(i=0;i<(n-1);i++) x1[n-i-2]=xin[length-i-1];}主程序与浮点的完全⼀样。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数的定标 高级语言 DSP定点算术运算 非线性运算的定点快速实现 小 结
3.1.1 数的定标
在定点DSP芯片中,采用定点数进行数 值运算,其操作数一般采用整型数来表 示。 一个整型数的最大表示范围取决于DSP 芯片所给定的字长,一般为16位或24位。 显然,字长越长,所能表示的数的范围 越大,精度也越高。
虽然有时需要使用混合表示法,但是,更通常 的是全部以Q15格式表示的小数或以Q0格式表 示的整数来工作。 这一点对于主要是乘法和累加的信号处理算法 特别现实,小数乘以小数得小数,整数乘以整 数得整数。 乘积累加时可能会出现溢出现象,在这种情况 下,程序员应当了解数学里面的物理过程以注 意可能的溢出情况。 返回
3.4.2 查表法
在实时DSP应用中实现非线性运算,一般都采取适当 降低运算精度来提高程序的运算速度。查表法是快速 实现非线性运算最常用的方法。 查表法:根据自变量的范围和精度要求事先制作一张 表格,根据输入值确定表的地址,根据地址就可得到 相应的值。 显然输入的范围越大,精度要求越高,则所需的表格 就越大,即存储量也越大。 查表法求值所需的计算就是根据输入值确定表的地址, 因而运算量较小。 查表法比较适合于非线性函数是周期函数或已知非线 性函数输入值范围这两种情况 。
3.3 DSP定点算术运算
定点DSP芯片的数值表示是基于2的补码表示形 式。 每个16位数用1个符号位、i个整数位和15-i个小 数位来表示。 例如数00000010.10100000表示的值为 21 + 2 −1 + 2 −3 =2.625, 这个数可用Q8格式(8个小数位)来表示,它表 示的数值范围为-128~+127.996,一个Q8定点 数的小数精度为1/256=0.004。
(1) 三角函数,y = sin(x)或y = cos(x),由三角 函数知识可知,|y|≤1; (2) 汉明窗,y(n) = 0.54-0.46cos [2πn/(N-1)] , 0≤n≤N-1。因为-1≤cos [2πn/(N-1)]≤1,所以 0.08≤y(n)≤1.0;
2.统计分析法 对于理论上无法确定范围的变量,一般采用统 计分析的方法来确定其动态范围。就是用足够 多的输入信号样值来确定程序中变量的动态范 围,这里输入信号一方面要有一定的数量,另 一方面必须尽可能地涉及各种情况。 当然,统计分析毕竟不可能涉及所有可能发生 的情况,因此,对统计得出的结果在程序设计 时可采取一些保护措施,如适当牺牲一些精度, Q值取比统计值稍小些,使用DSP芯片提供的 溢出保护功能等。
Q z − ( Q x +Q y )
定点表示的乘法
所以定点表示的乘法为: int x,y,z; long temp; temp = (long)x; z = (temp×y) >> (Qx+Qy-Qz);
定点乘法举例
设x = 18.4,y = 36.8,则浮点运算值为z =18.4×36.8 = 677.12; Qx = 10,Qy = 9,Qz = 5, 所以 x = 18841;y = 18841; temp = 18841L; z = (18841L*18841)>>(10+9-5) = 354983281L>>14 = 21666; 因为z的定标值为5,故定点 z = 21666即为浮 点的 z = 21666/32 = 677.08。
( Qx −Q y )
] ⋅ 2 − Qx
zq = [ xq + yq ⋅ 2
( Qx −Q y )
] ⋅ 2 (Qz −Qx )
所以定点加法可以描述为:
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)), 若Qx≤Qz
( Q z −Q x + Q y )
yq
定点表示的除法
所以定点表示的除法为: in (temp<<(Qz-Qx+Qy))/y;
定点除法举例
设x = 18.4,y = 36.8,浮点运算值为z = x/y = 18.4/36.8 = 0.5; Qx = 10,Qy = 9,Qz = 15; 所以有 x = 18841, y = 18841; temp = (long)18841; z = (18841L<<(15-10+9))/18841 = 308690944L/18841 = 16384; 因为商z的定标值为15,所以定点z = 16384即 为浮点 z = 16384/215= 0.5。
3.2.4 程序变量的Q值确定
在前面几节介绍的例子中,由于x、y、z 的值都是已知的,因此从浮点变为定点 时Q值很好确定。在实际的DSP应用中, 程序中参与运算的都是变量,那么如何 确定浮点程序中变量的Q值呢? 从前面的分析可以知道,确定变量的Q值 实际上就是确定变量的动态范围,动态 范围确定了,则Q值也就确定了。
设变量的绝对值的最大值为 max ,注意 它必须小于或等于32767。取一个整数n, 2 n −1 < max < 2 n 使它满足 则有 2 −Q = 2 −15 × 2 n = 2 − (15−n ) Q = 15-n
确定变量的
max
两种方法:一种是理论分析法,另一种是统 计分析法。 1 1.理论分析法 有些变量的动态范围通过理论分析是可以确 定的。例如:
浮点数与定点数的转换关系为: 浮点数(x)转换为定点数( x q ):
x q = (int)x ∗ 2
Q
定点数( x q )转换为浮点数(x):
x = (float) x q ∗ 2
−Q
浮点数与定点数的转换
例如,浮点数 x=0.5,定标 Q=15,则 定点数 xq = 0.5 × 32768 = 16384 , 式中 表示下取整。 反之,一个用 Q=15 表示的定点数 16384,其浮点数为: 16384×2-15=16384/32768=0.5
3.2.3 除法运算的C语言定点模拟
设浮点除法运算的表达式为: float x,y,z; z = x/y;
假设经过统计后被除数x的定标值为Qx, 除数y的定标值为Qy,商z的定标值为Qz, 则 z = x/y ⇒
zq ⋅ 2
zq =
− Qz
=
x q ⋅ 2 −Qx yq ⋅ 2
−Q y
⇒
xq ⋅ 2
返回
3.2 高级语言
在编写DSP模拟算法时,为了方便,一般都是 采用高级语言(如C语言)来编写模拟程序。程序 中所用的变量一般既有整型数,又有浮点数。 例:
int i; float pi=3.14159; float hamwindow[256]; for(i=0;i<256;i++) hamwindow[i]=0.540.46*cos(2.0*pi*i/255);
3.4 非线性运算的定点快速实现
在数值运算中,除基本的加减乘除运算 外,还有其他许多非线性运算,如对数 运算、开方运算、指数运算、三角函数 运算等,实现这些非线性运算的方法一 般有: (1)调用DSP编译系统的库函数; (2)查表法; (3)混合法。
3.4.1 调用DSP编译系统的库函数
TMS320C5X 的C编译器提供了比较丰富的运行支持库函 数。在C程序中(也可在汇编程序中)只要采用与库函数相 同的变量定义,就可以直接调用。 如在库函数中,定义了以10为底的常用对数log10( ): #include <math.h> include double log10(double x); 在C程序中按如下方式调用: float x,y; x = 10.0; y = log10(x);
3.2.2 乘法运算的C语言定点模拟
设浮点乘法运算的表达式为: float x,y,z; z = xy;
假设经过统计后x的定标值为Qx,y的定 标值为Qy,乘积z的定标值为Qz,则 z = xy ⇒
zq ⋅ 2
− Qz
= xq ⋅ yq ⋅ 2
− ( Q x +Q y )
⇒
z q = ( x q y q )2
定点算法
如果要将上述程序用定点DSP芯片来实现, 则需将程序改写为DSP芯片的汇编语言程 序。 为了DSP程序调试的方便及模拟定点DSP 实现时的算法性能,在编写DSP汇编程序 之前一般需将高级语言浮点算法改写为 高级语言定点算法。
3.2.1 基本算术运算的定点实现方法
以加法为例:设浮点加法运算的表达式为: float x,y,z; z=x+y; 将浮点加法转化为定点加法时最重要的一点就是必须 保证两个操作数的定标值一样。 若两者不一样,则在做加法/减法运算前先进行小数点 的调整。 调整方法:为保证运算精度,需使Q值小的数调整为 与另一个数的Q值一样大。 在做加法运算时,必须注意结果可能会超过16位表示。 如果加法的结果超出16位的表示范围,则必须保留32 位结果,以保证运算的精度。
3.1.1 数的定标
DSP芯片的数以2的补码形式表示。 每个16位数用一个符号位来表示数的正 负,0表示数值为正,1则表示数值为负。 其余15位表示数值的大小。 例如: 二进制数0010000000000011b=8195 二进制数1111111111111100b=-4
3.1.1 数的定标
数的定标 :由程序员来确定一个数的小 数点处于16位中的哪一位 ,通过设定小 数点在16位数中的不同位置,就可以表 示不同大小和不同精度的小数 。 方法:Q表示法和S表示法 表示法 表示法
定点加法举例
设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。