第三章 DSP定点运算
- 格式:ppt
- 大小:213.50 KB
- 文档页数:38
通信与广播电视拜年第期〔〔一一一一一」二一一主程序印 , , , 印二, ” ’ , ’ , 勺一输入语音文件滤波后语音文件 , 斤户 , 取一帧语音数据 , , , 调用低通滤波子程序【〕 , 解将滤波后的样值写人文件关闭文件三定点、定点算术运算的补码表示形式侧刃。
芯片的数值表示是基于一每个位数用个符号位一、个整一数位和巧 , , 个小数位来表示格式。
因此数表示的值为, ’ , 二这个数可用一个个小数位来表示。
它表示的数值范围为 , 一一定点数的小数精度为如动态范围和精度要求 , 虽然特殊情况必须使用混合表示法。
, 但是。
, 更通常的是全 , 部以巧格式表示的小数或以格式表示的整数来工作 , 这一点对于主要是乘法和累加的信号处理算法特别现实能会出现溢出现象 , 小数乘以小数得小数整数乘以整数得整数当然乘积累加时可在这种情况下程序员应当了解数学里面的物理过程以注意可能的溢出情况。
定点乘法个定点数相乘时可以分为下列种情况洲抖年第期通信与广播电视小数乘小数例刃刃刃刃冷以刃犯拟叉刃侧又幻】刃犯 , 个巧的小数相乘后得到 , , 个 , 的小数即有。
个符号位。
一般情况下相乘后得到的满精度数不必全部保留而只需保留位单精度数由于相乘后得到的高位不满巧位的小数精度二为了达到巧位精度可将乘积左移位整数乘整数例叉一一心〕一二一混合表示法许多情况下与例 , 运算过程中为了既满足数值的动态范围又保证一定的精度。
, 就必须采用表示 , 巧之间的表示法 , 比如。
, 数值 , , 显然巧无法表示 , 而若用。
则最接近的数是精度无法保证又因此数最佳的表示法是创《刃刃刃洲二拟洲洲洲犯叹心阅口心刃侧刃 , 心的最大值不大于一般的 , 因此 , 个 , 数相乘得到的乘积不大于小数位为位 , 。
若一个数的整数位为位十另一个数的整数位为位 , 小数位为位 , 则这两个数的乘积为整数位和 , 位整数位和巧一一位小数位。
这个乘积的最高位可能的精度为小数位但是不会大于 , 若事先了解数的动态范围 , 就可以增加数的精度 , 。
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芯片的定点运算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芯片的定点运算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格式有符号数的表示法,机器数(出现在电脑的二进位数值)有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):使用假数以及指数两部分来表示数值。
面向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。
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-。
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中浮点转定点运算--浮点与定点概述⼀:浮点与定点概述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格式(转)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中浮点转定点运算--举例及编程中的⼼得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];}主程序与浮点的完全⼀样。