精华内容
下载资源
问答
  • DSP定点运算

    千次阅读 2012-06-08 08:57:45
    定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。 一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。 显然,字长越长,所能表示的数的范围越大,精度也越高。...

    1 数的定标

    在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。

    一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。
    显然,字长越长,所能表示的数的范围越大,精度也越高。
    数的定标 :由程序员来确定一个数的小数点处于16位中的哪一位 ,通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数 。
    方法: Q 表示法S 表示法
     
    同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同 ,但对于DSP芯片来说,处理方法是完全相同的。
    对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想提高精度,则数的表示范围就相应地减小。
     
    n浮点数与定点数的转换关系为:
    n浮点数(x)转换为定点数( Xq  ):
    Xq = (int)X * 2 ^Q
    n定点数( Xq)转换为浮点数(x):
    X = (float) Xq * 2 ^-Q
     

    2 定点算法

     
    n以加法为例:设浮点加法运算的表达式为:
                   float x,y,z;
                     z=x+y;
    n将浮点加法转化为定点加法时最重要的一点就是必须保证两个操作数的定标值一样。
    n若两者不一样,则在做加法/减法运算前先进行小数点的调整。
    n调整方法:为保证运算精度,需使Q值小的数调整为与另一个数的Q值一样大。
    n在做加法运算时,必须注意结果可能会超过16位表示。如果加法的结果超出16位的表示范围,则必须保留32位结果,以保证运算的精度。
    设x的Q值为Qx,y的为Qy。z的为Qz,则z = x + y => Zq * 2 ^ -Qz = Xq * 2 ^-Qx + Yq * 2 ^-Qy
    运算得到 Zq = [Xq + Yq * 2 ^(Qx- Qy)] * 2 ^(Qx - Qy)

    定点加法可以描述为:

    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
     
    n当加法或加法的结果超过16位表示范围时,如果程序员事先能够了解到这种情况,并且需要保证运算精度时,则必须保持32位结果。
    n如果程序中是按照16位数进行运算的,则超过16位实际上就出现了溢出。
    n一般的定点DSP芯片都设有溢出保护功能,当溢出保护功能有效时,一旦出现溢出,则累加器ACC的结果为最大的饱和值,从而达到防止溢出引起精度严重恶化的目的。
     

    定点表示的乘法为:

    int x,y,z;
    long temp;
    temp = (long)x;
    z = (temp×y) >> (Qx+Qy-Qz);
     

    定点表示的除法为:

    int x,y,z;
    long temp;
    temp = (long)x;
    z = (temp<<(Qz-Qx+Qy))/y;
     

    Q值确定

    在实际的DSP应用中,程序中参与运算的都是变量,那么如何确定浮点程序中变量的Q值呢?
    从前面的分析可以知道,确定变量的Q值实际上就是确定变量的动态范围,动态范围确定了,则Q值也就确定了。
     
    设变量的绝对值的最大值为max,注意它必须小于或等于32767。取一个整数n,使它满足 2^n-1 < |max| < 2^n
    则有
    Q = 15-n
     
    两种方法:一种是理论分析法,另一种是统计分析法。
    1.理论分析法
    有些变量的动态范围通过理论分析是可以确定的。例如:
    n(1) 三角函数, y = sin( x)或 y = cos( x),由三角函数知识可知,| y|≤1;
    n(2) 汉明窗, y( n) = 0.54-0.46cos [2p n/(N-1)] ,0≤ n≤N-1。因为-1≤cos [2p n/(N-1)]≤1,所以0.08≤ y( n)≤1.0;
    n2.统计分析法
    对于理论上无法确定范围的变量,一般采用统计分析的方法来确定其动态范围。就是用足够多的输入信号样值来确定程序中变量的动态范围,这里输入信号一方面要有一定的数量,另一方面必须尽可能地涉及各种情况。
    n当然,统计分析毕竟不可能涉及所有可能发生的情况,因此,对统计得出的结果在程序设计时可采取一些保护措施,如适当牺牲一些精度,Q值取比统计值稍小些,使用DSP芯片提供的溢出保护功能等。
     
    展开全文
  • DSP广义上指数字信号处理理论(Digital Signal Processing),狭义上指数字 信号处理器(Digital Signal Processor)。数字信号处理理论广泛应用于语音、图象、 遥测数据、电机控制等各个方面。现代个人通信、互联网、...

      DSP广义上指数字信号处理理论(Digital Signal Processing),狭义上指数字
    信号处理器(Digital Signal Processor)。数字信号处理理论广泛应用于语音、图象、
    遥测数据、电机控制等各个方面。现代个人通信、互联网、多媒体应用的飞速发展又推
    动着数字信号处理理论的进一步发展。现代信号处理(ASP)算法越来越复杂,处理的数
    据量越来越庞大。由于体系结构的限制,通用微处理器并不适合作这种高运算量的信号
    处理,由此诞生了一种专门用于信号处理的芯片和系统,这就是数字信号处理器,通常
    简称DSP。作为数字信号处理理论和当代大规模集成电路VLSI技术融合的结晶,数字信号
    处理器(DSP)正日益广泛地应用于通信、消费类电子产品、仪器仪表、航天航空等各个
    领域。在数字化浪潮的推动下,基于DSP的软硬件开发需求越来越大。国际上各大DSP芯
    片制造厂商也不断推出运算速度更快、功耗更低的产品。
    1.  定点DSP和浮点DSP
            国际上生产DSP芯片的厂商很多,典型的有TI、AD、Motorola、DSP Group以及
    AT&T、NEC等等,这些公司都有自己的由低档到高档的DSP产品系列。其中TI--德州仪器
    公司占有主导地位,其产品占了45%的市场份额。 AD--模拟器件公司紧随其后,其产品
    约占11%的市场份额。TI公司的TMS320系列和AD公司的ADSP系列在中国使用的也最为广泛
    。表1列出了常见的两家公司的主要产品。

    表1
       公司      DSP芯片        定点/浮点        时钟频率(MHz)
        TI     TMS320C2xxx       定点                20-40
                TMS320C3x        浮点                33-75
               TMS320C54xx       定点                40-160
               TMS320C55xx       定点               160-200
               TMS320C62xx       定点               150-300
               TMS320C67xx       浮点               100-167
        AD     ADSP-21xx         定点                10-80
               ADSP-21xxx(SHARC) 浮点               33-100
               TigerSHARC        浮点                 250


            从表1可以看出,两家公司都有各自的定点产品和浮点产品。数据以定点格式工
    作的DSP芯片称为定点DSP,数据以浮点格式工作的DSP称为浮点DSP。浮点DSP表示数据的
    精度高,编程也比较容易,从高级语言转化为适合浮点DSP的汇编语言要方便。但是,由
    于DSP大量用于嵌入式系统,很多应用场合如手机、PDA、便携式音频播放器等等,都要求

    价格低廉,功耗尽量低。而浮点DSP由于内部结构较复杂,价格、功耗都不易降下
    来,因此其应用反而不如定点DSP普遍。DSP芯片厂商推出的定点DSP种类也比浮点DSP种
    类多,这在表1中也有体现。
            定点DSP的字宽一般为16位,也有24位和20位的DSP,如摩 托罗拉的DSP563XX系
    列和Zoran公司的 ZR3800X系列。显然数据字长越大单字表示的范围越大,精度越高,但
    TI和AD目前的产品都是16位字长。


    2.  C语言在DSP开发中的应用[1][3]
            为缩短软件开发周期,使用C语言开发DSP产品越来越普遍。使用汇编语言可以
    充分利用DSP片内资源编出精简高效的代码。但是DSP汇编语言编程较繁杂,可读性差。
    而且,一般来说,不同公司的芯片汇编语言是不同的,即使是同一家公司的芯片,由于
    芯片类型不同(如定点和浮点),产品的升级换代,其汇编语言也不相同,这使得汇编
    语言的可移植性也较差。所以用汇编语言开发基于DSP芯片的产品周期长,软件的修改和
    升级都较困难。C语言既有高级语言的易学易懂、功能丰富、表达能力强、可移植性好的
    优势,又具有低级语言的特点(比如能方便地进行位运算、地址操作)。正因为如此,
    各DSP芯片厂商也都提供了相应的C优化编译器,并不断提高其编译效率,鼓励DSP开发者
    选用C语言作为开发DSP应用程序的首选工具。事实上,对于有些多内核、并行化程度非
    常高的DSP处理器,如TI的TMS320C62xx,完全由人手编写汇编代码反而很难有效地分配
    运行资源、发挥处理器并行处理的优势。当然,现在的C编译器效率仍然不是很高,DSP
    片内片外资源也有限,很多地方仍然要作人工优化。
            通常DSP的开发流程如图1所示,详细过程如下:
    (1) 用C语言编写程序,在PC机上仿真测设,确保算法正确。尽管现在DSP厂商推出的
    调试工具越来越方便,用户界面越来越友善,但比起PC编程仍然要麻烦得多。确保算法
    在PC机上仿真通过,以后调试DSP汇编程序时就有一个参考,这样会方便很多。一般采用
    文件的形式来仿真DSP程序的输入输出。
    (2) 按照DSP的C程序编写规则改写C程序,使之适合DSP硬件。将文件读写改为真正的
    I/O操作。加入中断功能。必要时在C程序中嵌入汇编语句。
    (3)使用C编译器编译改写的C程序,生成DSP汇编源代码。C编译器具有优化选项,根据
    需要选择不同的优化等级和优化范围。
    (4)手动进行程序优化,降低程序代码大小,使流程更合理,进一步加快程序的执行速
    度。评估程序能否在实际的DSP处理器上实时运行。如果不行,人工编写指令周期密集的
    那些模块的汇编代码,直到满足实时要求。
    (5)使用汇编器将各模块汇编成目标文件。
    (6)最后将各目标文件链接成可载入DSP中联机运行调试的可执行代码。


    3.  DSP定点算法的C语言仿真[2]
            DSP开发过程的第一步是在PC机上编写C仿真程序,确保算法正确,这样可以大
    大节省以后在DSP上调试的时间。对于浮点算法,使用C语言加以实现是十分方便的,编
    程者只需具备C编程的知识,甚至可以完全不懂DSP。常见的数字信号处理算法也都是以
    浮点形式出现。但是由于定点DSP受数值表示范围的限制,用C语言仿真定点算法或将浮
    点算法定点化则要复杂的多,需要了解一些定点DSP芯片硬件操作的知识,掌握一些规则
    和技巧。下面就从定点DSP数值表达、常用运算来讲述如何用C语言实现DSP定点算法的仿
    真。这里假定处理器是16位的定点DSP,乘法器、累加器为32位。仿真C程序使用TURBO 
    C编译器,那么在C程序中可用的变量只有单精度整型int (16位)和 双精度长整型

    long(32位)两种形式。

    3.1浮点数的定点化
    3.1.1 Q格式--固定小数点的表达方式[1]
        定点DSP芯片中的基本单元是16位(比特)字。当表示纯整数时其范围为-3276
    8到+32767,分别对应的二进制表示为1000 0000 0000 0000和0111 1111 1111 1111。处
    理器中都是采用补码形式,最左面的一位即第15位是最高有效位(MSB),最右面的一位即
    第0位是最低有效位(LSB)。MSB作符号位,如果一个数是正数,MSB为0,若为负数,MSB
    为1。
        当要表示小数时,必须假定一个小数点位于相邻两比特之间。比如,要表示一
    个-1.0到+1.0之间的小数,我们可以假定小数点位于第14位和第15位之间。这种表达方
    式称为Q15格式,因为小数点右边有15位。如果小数点右边有n位就称为Qn格式。纯整数
    是一种特殊的Q0格式的小数。
        将浮点算法转化为定点算法,首先就要把所有的小数经定标转化为整数。比如
    浮点算法中有一个浮点数组为[ 0.25  0.5  1.125   5.75  7.0 ],用二进制表示为[ 
    0.01  0.1  1.001  101.11  111.0 ]。将数组各分量左移三位,得[ 10  100  1001  
    101110  111000 ],十进制表示为[ 2  4  9  46  56 ]。小数点位置在第3位,此数组
    中的各分量都是Q3格式,这就是定标的过程。
        浮点数和定点数的转换公式如下:
        浮点数(x)转换为定点数(xq):xq=(int)x * 2Q
        定点数( xq)转换为浮点数(x):x=(float) xq * 2-Q
        不同的Q格式所表示的数的范围不同,精度也不同。Q越大,数值范围越小,但精
    度越高。例如,Q0的数值范围是-32768到+32768,其精度是1,而Q15的数值范围为-1到
    0.9999695,精度为1/32768=0.00003051。对于定点数而言,数据范围和精度是一对矛盾

    3.1.2 定标浮点数--动态小数点的表达方式
        固定小数点的方式只适用于表达动态范围较小的浮点数变量,对于那些动态变
    化比较大的浮点数变量采取固定小数点的表达方式,往往可能造成溢出或者精度太低。
        浮点数定点化的关键是要保证精度,而与精度有直接关系的是有效数字的位数
    ,与小数点的位置无关。可见,只要保证了浮点数表达的有效位数为16比特定点可以表达
    的最大位数,就等于保证了浮点数定点化的最大精度。因此,可以将一个浮点数用两个
    16比特字来表达。第一个字表示尾数(M), 采用补码形式,其幅度值在16384~32767之
    间, MSB位是符号位。尾数是对浮点数进行归一化后的有效数字,对于16比特定点数来
    说,这是最大的表示精度。第二个字是指数NLS,表示为归一化而对浮点数进行的左移位
    数,NLS可正可负,同样采用补码形式。这种32位单精度的浮点数表示方法一般称为定标
    浮点数( scaler floating point )。定标浮点数的大小等于M*2NLS,大大扩展了定点数
    的精度和范围,特别适合于动态范围比较大或者动态范围不太好预测的变量。如何将一
    个浮点数用定标浮点数来表示,主要是一个归一化的过程,后面3.2.5中有详细介绍。
    3.1.3 块浮点数--块表达方式
        动态小数点位置的表达方式的缺点是需要多一倍的存储空间来表示浮点数。特
    别是对于数组来说,这是很大的开销。而块表达方式正好解决了这一问题,同时又具有
    动态小数点表达方式的优点。
        块表达方式使用n+1个字来表示一个n维数组。数组中幅度最大的一个元素采用
    动态小数点表达方式,即由归一化值表示有效数字,另外用一个NLS变量表示小数点位置
    。数组中其他分量则共享此NLS值。可见,块浮点数( block floating point )的表达方
    式效率是很高的,特别是对于那些比较长的数组变量。
        以上介绍的三种浮点数表达方式各有自己的优缺点,到底采用何种方式视浮点
    数的动态范围和其对算法精度的影响程度而定。固定小数点的表达方式简单,使用的也
    最多。当对算法的精度要求比较高,动态范围又比较大的时候,可以采用定标浮点数。
    如果是数组,且各分量之间相关性较强、大小接近,则可以使用块浮点数。定标浮点数
    和块浮点数的缺点是需要占用额外的存储空间,并且每经过一次变化后就要进行一次归
    一化,势必造成运算量成倍的增加和耗费更多的存储空间。
        在保证精度的同时,还要考虑这些表达方式可能在运算中带来的溢出问题。数
    字信号处理算法中常用到乘加的累积,比如求卷积和FIR滤波,如果采用最大精度表示,
    往往带来累加器溢出造成的麻烦。因此,与卷积和FIR滤波相关的变量,一般不用16bit
    精度表示,而是根据乘加运算的次数使用15bit或者14bit精度表示。

    3.2  基本定点算法
    3.2.1 移位运算
        在定点DSP芯片中经常用到移位操作。C语言提供了移位操作符,左移为<<,右
    移为>>。左移运算符用来将一个数的各二进位左移若干位,操作如下
     a<<=n;将a的二进制数左移n位,右补0。高位左移后溢出,舍弃不起作用。
        在没有溢出的前提下,左移n位相当于该数乘以2n。同理,a>>n表示将a的各二
    进位右移n位。移到右端的低位被舍弃。TURBO C编译器采用算术右移,最左边移入符号
    位,当a为正数,左边移入的是0,若为负数,左边移入的是1。当a为正数,a>>n相当于
    a/2n,若为负数则未必。例如:
          a=7>>2;   结果a=1
          a=7/4;       结果a=1
    但是,
          a=-7>>2 ;  结果a=-2
          a=-7/4;     结果a=-1
            作移位操作时,如果移位次数n是个变量,必须保证n>=0,否则会产生预料不到
    的错误。如果n正负难以预测,可先作正负判断再右移或左移。例如要将a右移n位,可作
    如下处理:
          if ( n>=0)
                a>>=n;
          else
               a<<=-n;
            如果一个数左移后超出了int的表示范围[-32768,32767],可以用一个long类型
    的数据来保存结果。例如32000<<1的正确结果应该是64000,大于32767,移位结果不能
    用int类型来表达。可作如下处理:
          long  a;
          a=(long)32000<<1;  结果a等于64000
    注意下面的语句将产生错误的结果:
          long a;
          a=32000<<1;  结果a等于-1536。
    3.2.2 加减运算
           将浮点加减法转化为定点加减法最重要的一点是必须保证两个操作数的小数点的
    位置要相同。如果不同,在作加减法运算前必须先进行小数点的调整。为保证运算精度
    ,一般是将Q值小的数的Q格式调整为与另一个数的Q值一样大。如果是定标浮点数,则N
    LS大的数必须先向右移位,达到与另一个数相同的NLS值后才能相加。DSP芯片一般在累
    加器中作加减法,累加器至少为32位。在C语言程序中,如果加减的结果可能超出int的
    表示范围,注意要用双精度long类型表示结果。
    例1       求x+y的值z。x、y、z是变量,对应的Q格式分别为Qm、Qn、Qk,Qm<Qn。
    算法描述如下:
               int     x,y;
               long    z;
               …………..
               z=(long)x<<(n-m)
               z+=y;   z为32位长整型数,Q格式为Qn
    例2       求x+y的值z。x、y、z都是定标浮点数,对应的NLS值分别是NLSx、NLSy、NL
    Sz。NLSx>NLSy。
    算法描述如下:
               int     x,NLSx,y,NLSy,z,NLSz;     long   temp;
               ……………………………
               temp=x>>(NLSx-NLSy);
               temp+=y;
            这里,如果x和y符号相同,temp可能需要17bit来表达,那么将它右移1位恢复
    成16bit再赋给z,NLSz等于NLSy-1。反之,如果x和y符号不同,temp的绝对值可能小于
    16384,则要将它左移重新进行归一化,直到绝对值大于或等于16384,而NLSz为NLSy加
    上移位的次数。
    3.2.3 乘法运算
            两个16位整数相乘其结果是32位的数,所以要用双精度数即long类型的长整型
    数来保存乘法结果。
    例1     求xy的值z。x、y、z是变量,x、y对应的Q格式分别为Qm、Qn。算法描述如下:

               int  x,y;   long  z;
               …………..
               z=(long)x*y;
            乘积结果z为双精度Q(m+n)形式。这里注意要先将x强制转换为long类型,否则
    得到的仍然是一个单精度int类型的乘积,很容易因为溢出产生错误的结果,就像下面的
    例子。
    例2
               int x;    long   z;
               x=32000;
               z=x*2;  结果z并不等于64000,而是等于-1536。
            大多情况下,我们要将乘积z保存在一个16位的内存单元中,比如将它置回一个
    Qk格式的单精度变量result中,必须首先将双精度乘积左移16+k-(m+n)位,然后进行舍
    入,将双精度的高位字存 入16bit的整型变量中。舍入操作是考察双精度数低位字的MS
    B是否为1,如果为1,则向高位字进位1。整个过程如下:
               int x,y,result;    long   z;
               ……………………….
               z=(long)x*y;  乘法
               z=z<<16+k-(m+n);  左移16+k-(m+n)位
               result=(z+0x8000)>>16;  舍入后高位字存到result
    3.2.4 除法运算[4]
            DSP芯片不善于作除法运算。一般DSP处理器中没有专门的除法硬件电路,它是
    靠一系列的移位减来完成除法运算,需耗费很多指令周期。因此,在定点DSP算法中应该
    尽量避免作除法。很多时候除法可以用乘法来代替,即乘以除数的倒数。
           在DSP上作除法通常由一段程序来完成,每个DSP厂商都会在应用指南中给出除法
    的例程,包括有符号数相除、无符号数相除以及16位与16位相除、32位与16位相除的例
    程。在C仿真程序中可以用"/"运算符来作除法,没必要编写一个专门的除法函数。
    例    求x/y的值z,x是Qm格式,y是Qn格式。C语言描述如下:
           int x,y,z;
           ………..
           z=x/y;  z的Q格式是Q(m-n)。
    3.2.5归一化与矢量定标
           通常对定标浮点数每做一次变化都要重新进行归一化,归一化是为了使其尾数的
    绝对值在16384~32767之间,从而保证最大的精度。有的DSP处理器提供归一化的指令,
    能在单指令周期内完成累加器中数值的归一化。在C语言中需要编写一小段程序来模拟,
    算法如下:
           x的Q格式为Qn,x为long类型或int类型。现在要将x归一化转换为定标浮点数,
    用两个整型数X和NLSX来表达。
             #define  MAX   32767
             #define  MIN     16384
             int   shift=0;计算移位次数
         long  temp;  临时变量
         ………………………….
         temp=x;
         if  ( temp<0 ) temp=-temp; 取绝对值
         while  ( temp>MAX )
           {
              temp>>=1; 右移一位
              shift--;
           }
          while  ( temp<MIN )
            {
              temp<<=1;  左移一位
              shift++;
            }
          if  ( shift<=0 )  X=x>>-shift;
             else       X=x<<shift;
         NLSX=n+shift;
          定标浮点数的尾数采用16bit的最大精度。前面已经提到,为了防止运算溢出造成
    麻烦,也可以降低一些精度,比如可以采用15bit或14bit来表示。这种修正的定标浮点
    数的归一化过程仍然可以采用上面的算法,只是MIN和MAX值要作变动。假定采用MLS位精
    度,则MIN=2(MLS-2) ,MAX=2(MLS-1) -1。
          块浮点数每做一次变化通常也要重新进行归一化即矢量定标。过程如下:
    1) 找出尾数数组中幅度最大的分量。
    2) 对该分量归一化,求出移位次数shift。
    3) 对所有分量均作同样的移位。
    4) 原来NLS值加上shift得到新的NLS值。
    3.2.6 溢出与饱和模式
           相对浮点DSP处理器,经常出现溢出可能是定点DSP的一大特征。溢出是数字信号
    处理算法定点化过程中要特别注意的一个问题。
           两个16bit的乘积是32bit的数,DSP算法常用的卷积和FIR滤波都要用到乘加运算
    ,经过多次乘加后其结果可能超出32bit能表示的最大范围,这就是溢出的现象。溢出会
    使一个很大的正数变成一个很小的负数,或者将一个很小的负数变成一个很大的正数,
    使结果产生非常大的误差。因此,判断溢出并且采取适当的保护措施很有必要。
       一种有效的办法是采用饱和模式,当运算结果要溢出时就限定在临界值。对于32bit
    数,表示的范围是-231~231-1。-2147483648是下临界,2147483647是上临界。一般的
    DSP处理器都可以工作在饱和模式下,减小溢出造成的不利影响。在C语言中模拟饱和模
    式则要麻烦一些。
    例  求x*y<<2的值z。
         Int  x,y;         long  z;
             Float     temp;
         …………………
         temp=1.0*x*y*4;  1.0起的作用是为了将乘积强制转换为浮点格式。
                                    ;左移2位相当于乘以4。
         if ( temp> 2147483647)    z=2147483647;上溢出
             else
                     if  ( temp<-2147483648 )  z=-2147483648;  下溢出
                     else    z=(long)x*y;
       这里引入float单精度浮点数是为了扩大数值的表示大小。在IBM PC机上,C语言中单
    精度实数的数值范围约为10-38~1038。


    4. 总结
            根据作者实际开发中积累的经验,本文介绍了用C语言如何实现DSP定点算法,
    给出了一些常用运算的例程,并提供了将数字信号处理浮点算法定点化的思想和方法。

                         参考文献
    1 张雄伟.   DSP芯片的原理与开发应用(第二版)。电子工业出版社,2000. 9
    2 谭浩强.   C程序设计。清华大学出版社,1991. 7
    3 Texas Instruments: TMS320C54x Optimizing C compiler user's guide
    4 Texas Instruments: TMS320C54x DSP Reference Set Volume 4: Applications Gui
    de

    作者简介:
    周海军  南京邮电学院通信工程系99级硕士研究生,主要研究方向为信息处理与B-ISDN
            邮编:210003     tel: 025-3474989,138-51991569
            e_mail: zhou_haijun@etang.com
    赵阳    南京邮电学院通信工程系99级硕士研究生

    展开全文
  • dsp定点运算。。。。。。。。。。。。。。。。。。。。。。。。。。。
  • dsp定点运算基本方法

    万次阅读 2017-08-05 12:42:14
    DSP定点算数运算 1 数的定标  在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。显然,字长越长,所能...

    一 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。因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想精度提高,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。
    浮点数与定点数的转换关系可表示为:
            浮点数(x)转换为定点数(xq):xq=(int)x* 2Q
            定点数(xq)转换为浮点数(x):x=(float)xq*2-Q
        例如,浮点数x=0.5,定标Q=15,则定点数xq=L0.5*32768J=16384,式中LJ表示下取整。反之,一个用Q=15表示的定点数16384,其浮点数为163幼*2-15=16384/32768=0.5。浮点数转换为定点数时,为了降低截尾误差,在取整前可以先加上0.5。

    表1.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

    2 高级语言:从浮点到定点
        我们在编写DSP模拟算法时,为了方便,一般都是采用高级语言(如C语言)来编写模拟程序。程序中所用的变量一般既有整型数,又有浮点数。如例1.1程序中的变量i是整型数,而pi是浮点数,hamwindow则是浮点数组。
    例1.1 256点汉明窗计算
    int i;+
    float pi=3.14l59;
    float hamwindow[256];
    for(i=0;i<256;i++) hamwindow=0.54-0.46*cos(2.0*pi*i/255);
        如果我们要将上述程序用某种足点DSP芯片来实现,则需将上述程序改写为DSP芯片的汇编语言程序。为了DSP程序调试的方便及模拟定点DSP实现时的算法性能,在编写DSP汇编程序之前一般需将高级语言浮点算法改写为高级语言定点算法。下面我们讨论基本算术运算的定点实现方法。
    2.1 加法/减法运算的c语言定点摸拟
    设浮点加法运算的表达式为:
    float x,y,z;
    z=x+y;
    将浮点加法/减法转化为定点加法/减法时最重要的一点就是必须保证两个操作数的定标
    temp=x+temp;
    z=temp>>(Qx-Qz),若Qx>=Qz
    z=temp<<(Qz-Qx),若Qx<=Qz
    例1.4结果超过16位的定点加法
    设x=l5000,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),从而达到防止溢出引起精度严重恶化的目的。
    2.2乘法运算的C语言定点模拟
    设浮点乘法运算的表达式为:
    float x,y,z;
    z=xy;
    假设经过统计后x的定标值为Qx,y的定标值为Qy,乘积z的定标值为Qz,则
    z=xy
    zq*2-Qx=xq*yq*2-(Qx+Qy)
    zq=(xqyq)2Qz-(Qx+Qy)
    所以定点表示的乘法为:
    int x,y,z;
    long temp;
    temp=(long)x;
    z=(temp*y)>>(Qx+Qy-Qz);
    例1.5定点乘法。
    设x=18.4,y=36.8,则浮点运算值为=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。
    2.3除法运算的C语言定点摸拟
    设浮点除法运算的表达式为:
    float x,y,z;
    z=x/y;
    假设经过统计后被除数x的定标值为Qx,除数y的定标值为Qy,商z的定标值为Qz,则
    z=x/y
    zq*2-Qz=(xq*2-Qx)/(yq*2-Qy)
    zq=(xq*2(Qz-Qx+Qy))/yq
    所以定点表示的除法为:
    int x,y,z;
    long temp;
    temp=(long)x;
    z=(temp<<(Qz-Qx+Qy))/y;
    例1.6定点除法。
    设x=18.4,y=36.8,浮点运算值为z=x/y=18.4/36.8=0.5;
    根据上节,得Qx=10,Qy=9,Qz=15;所以有
    z=18841,y=18841;
    temp=(long)18841;
    z=(18841L<<(15-10+9)/18841=3O8690944L/18841=16384;
    因为商z的定标值为15,所以定点z=16384,即为浮点z=16384/215=0.5。
    2.4程序变量的Q值确定
        在前面几节介绍的例子中,由于x,y,z的值都是已知的,因此从浮点变为定点时Q值很好确定。在实际的DSP应用中,程序中参与运算的都是变量,那么如何确定浮点程序中变量的Q值呢?从前面的分析可以知道,确定变量的Q值实际上就是确定变量的动态范围,动态范围确定了,则Q值也就确定了。
    设变量的绝对值的最大值为|max|,注意|max|必须小于或等于32767。取一个整数n,使满足
    2n-1<|max|<2n
    则有
    2-Q=2-15*2n=2-(15-n)
    Q=15-n
    例如,某变量的值在-1至+1之间,即|max|<1,因此n=0,Q=15-n=15。
        既然确定了变量的|max|就可以确定其Q值,那么变量的|max|又是如何确定的呢?一般来说,确定变量的|max|有两种方法。一种是理论分析法,另一种是统计分析法。
    1. 理论分析法
        有些变量的动态范围通过理论分析是可以确定的。例如:
    (1)三角函数。y=sin(x)或y=cos(x),由三角函数知识可知,|y|<=1。
    (2)汉明窗。y(n)=0.54一0.46cos[nπn/(N-1)],0<=n<=N-1。因为-1<=cos[2πn/(N-1)]<=1,所以0.08<=y(n)<=1.0。
    (3)FIR卷积。y(n)=∑h(k)x(n-k),设∑|h(k)|=1.0,且x(n)是模拟信号12位量化值,即有|x(n)|<=211,则|y(n)|<=211。
    (4)理论已经证明,在自相关线性预测编码(LPC)的程序设计中,反射系数ki满足下列不等式:|ki|<1.0,i=1,2,...,p,p为LPC的阶数。
    2. 统计分析法
        对于理论上无法确定范围的变量,一般采用统计分析的方法来确定其动态范围。所谓统计分析,就是用足够多的输入信号样值来确定程序中变量的动态范围,这里输入信号一方面要有一定的数量,另一方面必须尽可能地涉及各种情况。例如,在语音信号分析中,统计分析时就必须来集足够多的语音信号样值,并且在所采集的语音样值中,应尽可能地包含各种情况。如音量的大小,声音的种类(男声、女声等)。只有这样,统计出来的结果才能具有典型性。
        当然,统计分析毕竟不可能涉及所有可能发生的情况,因此,对统计得出的结果在程序设计时可采取一些保护措施,如适当牺牲一些精度,Q值取比统计值稍大些,使用DSP芯片提供的溢出保护功能等。
    2.5浮点至定点变换的C程序举例
        本节我们通过一个例子来说明C程序从浮点变换至定点的方法。这是一个对语音信号(0.3~3.4kHz)进行低通滤波的C语言程序,低通滤波的截止频率为800Hz,滤波器采用19点的有限冲击响应FIR滤波。语音信号的采样频率为8kHz,每个语音样值按16位整型数存放在insp.dat文件中。
    例1.7语音信号800Hz 19点FIR低通滤波C语言浮点程序。
    #i nclude <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,O.01218354};
    static int xl[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;
    for(i=0;i<length;i++)
    {
    sum=0.0;
    for(j=0;j<n;j++)sum+=h[j]*x1[i-j+n-1];
    xout=(int)sum;
    for(i=0;i<(n-l);i++)x1[n-i-2]=xin[length-1-i];
    }
    /*主程序*/
    void main()
    FILE *fp1,*fp2;
    int ,indata[length],outdata[length];
    fp1=fopen(insp.dat,"rb");/* 输入语音文件*/
    fp2=fopen(Outsp.dat,"wb");/* 滤波后语音文件*/
    =0;
    while(feof(fp1) ==0)
    {
    ++;
    printf(“=%d\n”,);
    for(i=0;i<length;i++)indata=getw(fp1); /*取一帧语音数据*/
    filter(indata,outdata,19,h);/*调用低通滤波子程序*/
    for(i=0;i<length;i++)putw(outdata,fp2);/*将滤波后的样值写入文件*/
    }
    fcloseall();/*关闭文件*/
    return(0);
    }
    例1.8语音信号800Hz l9点FIR低通滤波C语言定点程序。
    #i nclude <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-111=xin];
    for(i=0;i<1ength;i++)
    sum=0;
    for(j=0;j<n;j++)sum+=(long)h[j]*x1[i-j+n-1];
    xout=sum>>15;
    for(i=0;i<(n-1);i++)x1[n-i-2]=xin[length-i-1];
    }
    主程序与浮点的完全一样。“
    3 DSP定点算术运算
        定点DSP芯片的数值表示基于2的补码表示形式。每个16位数用l个符号位、i个整数位和15-i个小数位来表示。因此:
    00000010.10100000
    表示的值为:
    21+2-1+2-3=2.625
         这个数可用Q8格式(8个小数位)来表示,其表示的数值范围为-128至+l27.996,一个Q8定点数的小数精度为1/256=0.004。
        虽然特殊情况(如动态范围和精度要求)必须使用混合表示法。但是,更通常的是全部以Q15格式表示的小数或以Q0格式表示的整数来工作。这一点对于主要是乘法和累加的信号处理算法特别现实,小数乘以小数得小数,整数乘以整数得整数。当然,乘积累加时可能会出现溢出现象,在这种情况下,程序员应当了解数学里面的物理过程以注意可能的溢出情况。下面我们来讨论乘法、加法和除法的DSP定点运算,汇编程序以TMS320C25为例。
    3.1定点乘法
        两个定点数相乘时可以分为下列三种情况:
    1. 小数乘小数
    例1.9 Q15*Q15=Q30
    0.5*0.5=0.25
    0.100000000000000;Q15
    * 0.100000000000000;Q15
    --------------------------------------------
    00.010000000000000000000000000000=0.25;Q30
        两个Q15的小数相乘后得到一个Q30的小数,即有两个符号位。一般情况下相乘后得到的满精度数不必全部保留,而只需保留16位单精度数。由于相乘后得到的高16位不满15位的小数据度,为了达到15位精度,可将乘积左移一位,下面是上述乘法的TMS320C25程序:
    LT OP1;OP1=4000H(0.5/Q15)
    MPY OP2;oP2=4000H(0.5/Ql5)
    PAC
    SACH ANS,1;ANS=2000H(0.25/Q15)
    2. 整数乘整数
    例1.10 Q0*Q0=Q0
    17*(-5)=-85
    0000000000010001=l7
    *1111111111111011=-5
    -------------------------------------------
    11111111111111111111111110101011=-85
    3. 混合表示法
        许多情况下,运算过程中为了既满足数值的动态范围又保证一定的精度,就必须采用Q0与Q15之间的表示法。比如,数值1.2345,显然Q15无法表示,而若用Q0表示,则最接近的数是1,精度无法保证。因此,数1.2345最佳的表示法是Q14。
    例1.11 1.5*0.75= 1.125
    01.10000000000000=1.5;Q14
    *00.11000000000000=0.75;Q14
    ---------------------------------------
    0001.0010000000000000000000000000=1.125 Q28
        Q14的最大值不大于2,因此,两个Q14数相乘得到的乘积不大于4。
    一般地,若一个数的整数位为i位,小数位为j位,另一个数的整数位为m位,小数位为n位,则这两个数的乘积为(i+m)位整数位和(j+n)位小数位。这个乘积的最高16位可能的精度为(i+m)整数位和(15- i- m)小数位。
        但是,若事先了解数的动态范围,就可以增加数的精度。例如,程序员了解到上述乘积不会大于1.8,就可以用Q14数表示乘积,而不是理论上的最佳情况Q13。例3.11的TMS320C25程序如下:
    LT OP1;OP1 = 6000H(1.5/Ql4)
    MPY OP2;OP2 = 3000H(0.75/Q14)
    PAC
    SACH ANS,1;ANS=2400H(1.125/Q13)
        上述方法,为了精度均对乘的结果舍位,结果所产生的误差相当于减去一个LSB(最低位)。采用下面简单的舍人方法,可使误差减少二分之一。
    LT OP1
    MPY OP2
    PAC
    ADD ONE,14(上舍入)
    SACH ANS,1
        上述程序说明,不管ANS为正或负,所产生的误差是l/2 LSB,其中存储单元ONE的值为1。
    3.2定点加法
        乘的过程中,程序员可不考虑溢出而只需调整运算中的小数点。而加法则是一个更加复杂的过程。首先,加法运算必须用相同的Q点表示,其次,程序员或者允许其结果有足够的高位以适应位的增长,或者必须准备解决溢出问题。如果操作数仅为16位长,其结果可用双精度数表示。下面举例说明16位数相加的两种途径。
    1.保留32位结果
    LAC OP1;(Q15)
    ADD OP2;(Ql5)
    SACH ANSHI ;(高16位结果)
    SACL ANSLO :(低16位结果)
    2.调整小数点保留16位结果
    LAC OP1,15;(Q14数用ACCH表示)
    ADD OP2,15;(Q14数用ACCH表示)
    SACH ANS;(Q14)
        加法运算最可能出现的问题是运算结果溢出。TMS320提供了检查溢出的专用指令BV,此外,使用溢出保护功能可使累加结果溢出时累加器饱和为最大的整数或负数。当然,即使如此,运算精度还是大大降低。因此,最好的方法是完全理解基本的物理过程并注意选择数的表达方式。
    3.3定点除法
        在通用DSP芯片中,一般不提供单周期的除法指令,为此必须采用除法子程序来实现。二进制除法是乘法的逆运算。乘法包括一系列的移位和加法,而除法可分解为一系列的减法和移位。下面我们来说明除法的实现过程。
        设累加器为8位,且除法运算为10除以3。除的过程包括与被除法有关的除数逐步移位,在每一步进行减法运算,如果能减则将位插入商中。
    (1)除数的最低有效位对齐被除数的最高有效位。
    0000l0l0
    - 00011000
    --------------------------------------
    11110010
    (2)由于减法结果为负,放弃减法结果,将被除数左移一位,再减。
    00010100
    - 00011000
    ----------------------------------------
    11111000
    (3)结果仍为负,放弃减法结果,被除数左移一位,再减。
    00101000
    -   00011000
    ------------------------------------------
    00010000
    (4)结果为正,将减法结果左移一位后加1,作最后一次减。
    00100001
    -   00011000
    ----------------------------------------
    00001001
    (5)结果为正,将结果左移一位加1 得最后结果。高4位代表余数,低4位表示商。
    00010011
    即,商为0011= 3.余数为0001= 1。
        TMS320没有专门的除法指令,但使用条件减指令SUBC可以完成有效灵活的除法功能。使用这一指令的唯一限制是两个操作数必须为正。程序员必须事先了解其可能的运算数的特性,如其商是否可以用小数表示及商的精度是否可被计算出来。这里每一种考虑可影响如何使用SUBC指令的问题。下面我们给出两种不同情况下的TMS320C25除法程序。
    (1)分子小于分母
    DIV_A:
    LT NUMERA
    MPY DENOM
    PAC
    SACH TEMSGN;取商的符号
    LAC DENOM
    ABS
    SACL DENOM;使分母为正
    ZALH NUMERA; 分子为正
    ABS
    RPTK 14
    SUBC DENOM;除循环15次
    SACL QUOT
    LAC TEMSGN
    BGEZ A1;若符号为正,则完成
    ZAC
    SUB QUOT
    SACL QUOT;若为负,则商为负
    A1: RET
        这个程序中,分子在NUMERA中,分母在DENOM中,商存在QUOT中,TEMSGN为暂存单元。
    (2)规定商的精度
    DIV_B:
    LT NUMERA
    MPY DENOM
    PAC
    SACH TEMSGN;取商的符号
    LAC DENOM
    ABS
    SACL DENOM; 使分母为正
    LACK 15
    ADD FRAC
    SACL FRAC;计算循环计数器
    LAC NUMERA
    ABS ; 使分子为正
    RPT FRAC
    SUBC DENOM; 除循环16+FRAC次
    SACL QUOT
    LAC TEMSGN
    BGEZ B1;若符号为正,则完成
    ZAC
    SUB QUOT
    SACL QUOT;若为负,则商为负
    B1: RET
        与DIV_A相同,这个程序中,分子在NUMERA中,分母在DENOM中,商存在QUOT中,TEMSGN为暂存单元。FRAC中规定商的精度,如商的精度为Q13,则调用程序前FRAC单元中的值应为13。
    4 非线性运算的定点快速实现
        在数值运算中,除基本的加减乘除运算外,还有其它许多非线性运算,如,对数运算,开方运算,指数运算,三角函数运算等,实现这些非线性运算的方法一般有:(1)调用DSP编译系统的库函数;(2)查表法;(3)混合法。下面我们分别介绍这三种方法。
    1.调用DSP编译系统的库函数
        TMS320C2X/C5X的C编译器提供了比较丰富的运行支持库函数。在这些库函数中,包含了诸如对数、开方、三角函数、指数等常用的非线性函数。在C程序中(也可在汇编程序中)只要采用与库函数相同的变量定义,就可以直接调用。例如,在库函数中,定义了以10为底的常用对数log10():
    #i nclude<math.h>
    double,log10(double x);
    在C程序中按如下方式调用:
    float x,y;
    X=10.0;
    y=log10(x);
        从上例可以看出,库函数中的常用对数log10()要求的输入值为浮点数,返回值也为浮点数,运算的精度完全可以保证。直接调用库函数非常方便,但由于运算量大,很难在实时DSP中得到应用。
    2.查表法
        在实时DSP应用中实现非线性运算,一般都采取适当降低运算精度来提高程序的运算速度。查表法是快速实现非线性运算最常用的方法。采用这种方法必须根据自变量的范围和精度要求制作一张表格。显然输人的范围越大,精度要求越高,则所需的表格就越大,即存储量也越大。查表法求值所需的计算就是根据输入值确定表的地址,根据地址就可得到相应的值,因而运算量较小。查表法比较适合于非线性函数是周期函数或已知非线性函数输入值范围这两种情况、例1.12和例1. 13分别说明这两种情况。
    例1.12 已知正弦函数y=cos(x),制作一个512点表格,并说明查表方法。由于正弦函数是周期函数,函数值在-1至+1之间,用查表法比较合适。由于Q15的表示范围为1-至32767/32768之间,原则上讲-1至+1的范围必须用Q14表示。但一般从方便和总体精度考虑,类似情况仍用Q15表示,此时+1用32767来表示。
    (1)产生5l2点值的C语言程序如下所示。
    #define N 512
    #define pi 3.14l59
    int sin_tab[5l2];
    void main()
    {
    int i;
    for(i=0;i<N;i++)sin_tab=(int)(32767*sin(2*pi*i/N));
    (2)查表
        查表实际上就是根据输人值确定表的地址。设输入x在0~2π之间,则x对应于512点表的地址为:index=(int)(512*x/2π),则y=sin(x)=sin_tab[index]如果x用Q12定点数表示,将512/2π用Q8表示为20861,则计算正弦表的地址的公式为。
    index=(x*20861L)>>20;
    例1.12用查表法求以2为底的对数,已知自变量值范围为0.5-1,要求将自变量范围均匀划分为10等分。试制作这个表格并说明查表方法。
    (1)作表:
        y=log2(x),由于x在0.5到1之间,因此y在-1到0之间,x和y均可用Q15表示。由于对x均匀划分为10段,因此,10段对应于输入x的范围如表3.2所示。若每一段的对数值都取第一点的对数值,则表中第一段的对数值为y0(Q15)=(int)(log(O.5)*32768),第二段的对数值为y1(Q15)=(int)(log2(0.55)*32768),依次类推,如表3.2所示。
    (2)查表:
        查表时,先根据输人值计算表的地址,计算方法为:
    index=((x-16384)*20)>>15;
    式中, index就是查表用的地址。例如,已知输人x=26869,则index=6,因此,y= -10549。

    表1.2 logtab0 10点对数表
    地址    输入值    对数值(Q15)
    0    0.50-0.55    -32768
    1    0.55-0.60    -28262
    2    0.60-0.65    -24149
    3    0.65-0.70    -20365
    4    0.70-0.75    -16862
    5    0.75-0.80    -13600
    6    0.80-0.85    -10549
    7    0.85-0.90    -7683
    8    0.90-0.95    -4981
    9    0.95-1.00    -2425

    3.混合法
    (1)提高查表法的精度
        上述方法查表所得结果的精度随表的大小而变化,表越大,则精度越高,但存储量也越大。当系统的存储量有限而精度要求也较高时,查表法就不太适合。那么能否在适当增加运算量的情况下提高非线性运算的精度呢?下面介绍一种查表结合少量运算来计算非线性函数的混合法,这种方法适用于在输入变量的范围内函数呈单调变化的情形。混合法是在查表的基础上来用计算的方法以提高当输入值处于表格两点之间时的精度。提高精度的一个简便方法是采用折线近似法,如图1.1所示。
    图1.1提高精度的折线近似法”
        仍以求以2为底的对数为例(例1.12)。设输入值为x,则精确的对数值为y,在表格值的两点之间作一直线,用y'作为y的近似值,则有:
          y'=y0+△y
    其中y0由查表求得。现在只需在查表求得y0的基础上增加△y既可。△y的计算方法如下:                   △y=(△x/△x0)△y=△x(△y0/△x0)
        其中△y0/△x0对每一段来说是一个恒定值,可作一个表格直接查得。此外计算此时需用到每段横坐标的起始值,这个值也可作一个表格。这佯共有三个大小均为10的表格,分别为存储每段起点对数值的表logtab0、存储每段△y0/△x0值的表logtab1和存储每段输入起始值x0的表logtab2,表logtab1和表logtab2可用下列两个数组表示。
    int logtab1[10]={22529,20567,18920,17517,16308,
    15255,14330,13511,12780,12124};/*△y0/△x0:Q13*/
    int logtab2[10]={16384,18022,19660,21299,22938,
    24576,26214,27853,29491,31130};/*x0:Q15*/
    综上所述,采用混合法计算对数值的方法可归纳为:
    (1)根据输人值,计算查表地址:index=((x-16384)*20)>>15;
    (2)查表得y0=logtab0[index];
    (3)计算△x=x-logtab2[index];
    (4)计算△y=(△x*logtab1[index])>>13;
    (5)计算得结果y=y0+△y。
    例1.13已知x=0.54,求log2(x)。
    0.54的精确对数值为y=log2(0.54)=-0.889。
        混合法求对数值的过程为:
    (1)定标Q15,定标值x=0.54*32768=17694;
    (2)表地址index=((x-16384)*20)>>15=0;
    (3)查表得y0=logtab0[0]=-32768;
    (4)计算△x=x-logtab2[0]=17694-16384=1310;
    (5)计算△y=(△xlogtab1[0]>>13=(13l0*22529L)>>13=3602
    (6)计算结果y=y0+△y=-32768+3602=-29166。
        结果y为Q15定标,析算成浮点数为-29166/32768=-0.89,可见精度较高。
    (2)扩大自变量范围
        如上所述,查表法比较适用于周期函数或自变量的动态范围不是太大的情形。对于像对数这样的非线性函数,输入值和函数值的变化范围都很大。如果输入值的变化范围很大,则作表就比较困难。那么能否比较好地解决这个问题,即不便表格太大,又能得到比较高的精度呢?下面我们来讨论一种切实可行的方法。
    设x是一个大于0.5的数,则x可以表示为下列形式:
    x=m*2e
    式中,0.5<=m<=1.0,e为整数。则求x的对数可以表示为:
        log2(x)=log2(m*2e)=log2(m)+log2(2e)=e+log2(m)
    也就是说,求x的对数实际上只要求m的对数就可以了,而由于m的数值在0.5和1.0之间,用上面介绍的方法是完全可以实现的。例如:
        log2(10000)=log2(0.61035*214)=log2(0.61035)+14 =13.2877
    可见,如果一个数可以用比较简便的方法表示为上面的形式,则求任意大小数的对数也比较方便的。TMS320C2X/C5X指令集提供了一条用于对ACC中的数进行规格化的指令NORM,该指令的作用就是使累加器中的数左移,直至数的最高位被移至累加器的第30位。例如,对数值10000进行规格化的TMS320C25程序为。
    LAC #10000
    SACL TEMP
    ZALH TEMP
    LAR AR1,#0FH
    RPT 14
    NORM * -
        上述程序执行后,AR1=#0eH,ACCH=2000(10进制)。对一个16位整数x进行上述程序处理实际上就是作这样一个等效变换:
        x=[(x*2e)/32768]*215-Q
    其中,寄存器AR1包含的值为15-Q累加器ACC高16位包含的值为x.2Q,其数值在16384至32768之间。
    例1.14实现以2为底的对数的C定点模拟程序。
    int logtab0[10]={-32768,-28262,-24149,-20365,-16862,
    -13600),-1O549,-7683,-4981,-2425};/*Q15*/
    int logtab1[10]={122529,20567,18920,175l7,16308,
    15255,14330,13511,12780,12124};/*Q13*/
    int logtab2[10]={16384,l8022,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进行规格化*/
    point1=(15-point-4)*512;/*输入为Q4,输出为Q9*/
    index=((Am-16384)*20L)>>15;/*求查表地址*/
    dx=Am-logtab2[index];
    dy=((long)dx*logtab1[index])>>13;
    y=(dy+longtab0[index])>>6;/*Q9*/
    y=point1+y;
    return(y);
    }
        上述程序中,输入值Am采用Q4表示,输出采用Q9表示,如果输入输出的Q值与上面程序中的不同,则应作相应的修改。
        以上讨论了DSP芯片进行定点运算所涉及的一些基本问题,这些问题包括:数的定标,DSP程序的定点模拟,DSP芯片的足点运算以及定点实现非线性函数的快速实现方法等。充分理解这些问题对于用定点芯片实现DSP算法具有非常重要的作用。

     

    http://www.eetrend.com/forum/100031024

    http://www.docin.com/p-212284176.html

    展开全文
  • 第8章 DSP定点数和浮点数(重要) 本期教程主要跟大家讲解一下定点数和浮点数的基础知识,了解这些基础知识对于后面学习ARM官方的DSP库大有裨益。特别是初学的一定要理解这些基础知识。 目录 第8章 DSP定点数和...

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547

    第8章   DSP定点数和浮点数(重要)

    本期教程主要跟大家讲解一下定点数和浮点数的基础知识,了解这些基础知识对于后面学习ARM官方的DSP库大有裨益。特别是初学的一定要理解这些基础知识。

    目录

    第8章   DSP定点数和浮点数(重要)

    8.1   初学者重要提示

    8.2   定点数和浮点数概念

    8.2.1  定点数

    8.2.2  浮点数

    8.3   IEEE浮点数

    8.3.1  规范化浮点数

    8.3.2  非规范化浮点数

    8.3.3  有符号的零

    8.3.4  无穷

    8.3.5  NaN

    8.4   定点数运算

    8.4.1  数的定标(Q格式)

    8.4.2  定点数的算术运算

    8.5   总结


     

    8.1   初学者重要提示

    1.   如果之前没有接触过这方便的知识点,首次学习会有点不太理解,随着后面章节的深入就慢慢理解了。

    8.2   定点数和浮点数概念

    如果小数点的位置事先已有约定,不再改变,此类数称为“定点数”。相比之下,如果小数点的位置可变,则称为“浮点数”(定点数的本质是小数,整数只是其表现形式)。 

    8.2.1  定点数

    常用的定点数有两种表示形式:如果小数点位置约定在最低数值位的后面,则该数只能是定点整数;如果小数点位置约定在最高数值位的前面,则该数只能是定点小数。

    8.2.2  浮点数

    在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度,小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的 NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。 

    定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如 123.45 用十进制科学计数法可以表达为 1.2345 × 102,其中 1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。

     

    8.3   IEEE浮点数

    说明:Cortex-M7中的FPU(浮点单元)就是用的这个IEEE 754标准,初学的要认真学习。

    IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number),一些特殊数值(无穷Inf)与非数值(NaN),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。

    IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80比特实现)。只有32位模式有强制要求,其他都是选择性的。大部分编程语言都有提供IEEE浮点数格式与算术,但有些将其列为非必需的。例如,IEEE 754问世之前就有的C语言,现在有包括IEEE算术,但不算作强制要求(C语言的float通常是指IEEE单精确度,而double是指双精确度)。

    该标准的全称为IEEE二进制浮点数算术标准(ANSI/IEEE Std 754-1985),又称IEC 60559:1989,微处理器系统的二进制浮点数算术(本来的编号是IEC 559:1989)。后来还有“与基数无关的浮点数”的“IEEE 854-1987标准”,有规定基数为2跟10的状况。现在最新标准是“IEEE 854-2008标准”。

    在六、七十年代,各家计算机公司的各个型号的计算机,有着千差万别的浮点数表示,却没有一个业界通用的标准。这给数据交换、计算机协同工作造成了极大不便。IEEE的浮点数专业小组于七十年代末期开始酝酿浮点数的标准。在1980年,英特尔公司就推出了单片的8087浮点数协处理器,其浮点数表示法及定义的运算具有足够的合理性、先进性,被IEEE采用作为浮点数的标准,于1985年发布。而在此前,这一标准的内容已在八十年代初期被各计算机公司广泛采用,成了事实上的业界工业标准。

    在 IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,指数和尾数。这样,通过尾数和可以调节的指数(所以称为"浮点")就可以表达给定的数值了。具体的格式参见下面的图例: 

    •   在上面的图例中,第一个域为符号域。其中 0 表示数值为正数,而 1 则表示负数。
    •   第二个域为指数域。其中单精度数为 8 位,双精度数为 11 位。以单精度数为例,8 位的指数为可以表达 0 到 255 之间的 255 个指数值。但是,指数可以为正数,也可以为负数。

    为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为 127,而双精度数的偏差值为 1023。比如,单精度的实际指数值 0 在指数域中将保存为 127;而保存在指数域中的 64 则表示实际的指数值 -63。 偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成 -127 到 128 之间(包含两端)。我们后面还将看到,实际的指数值 -127(保存为 全 0)以及 +128(保存为全 1)保留用作特殊值的处理。这样,实际可以表达的有效指数范围就在 -127 和 127 之间。在本文中,最小指数和最大指数分别用 emin 和 emax 来表达。

    •   图例中的第三个域为尾数域,其中单精度数为 23 位长,双精度数为 52 位长。除了我们将要讲到的某些特殊值外,IEEE 标准要求浮点数必须是规范的。这意味着尾数的小数点左侧必须为 1,因此我们在保存尾数的时候,可以省略小数点前面这个 1,从而腾出一个二进制位来保存更多的尾数。这样我们实际上用 23 位长的尾数域表达了 24 位的尾数。比如:

    对于单精度数而言,二进制的 1001.101(对应于十进制的 9.625)可以表达为 1.001101 × 23,所以实际保存在尾数域中的值为 0011 0100 0000 000 0000 0000,即去掉小数点左侧的 1,并用 0 在右侧补齐。 

    值得注意的是,对于单精度数,由于我们只有 24 位的指数(其中一位隐藏),所以可以表达的最大指数为 224 - 1 = 16,777,215。特别的,16,777,216 是偶数,所以我们可以通过将它除以 2 并相应地调整指数来保存这个数,这样 16,777,216 同样可以被精确的保存。相反,数值 16,777,217 则无法被精确的保存。由此,我们可以看到单精度的浮点数可以表达的十进制数值中,真正有效的数字不高于 8 位。事实上,对相对误差的数值分析结果显示有效的精度大约为 7.22 位。参考下面的示例:

     

    根据标准要求,无法精确保存的值必须向最接近的可保存的值进行舍入。这有点像我们熟悉的十进制的四舍五入,即不足一半则舍,一半以上(包括一半)则进。不过对于二进制浮点数而言,还多一条规矩,就是当需要舍入的值刚好是一半时,不是简单地进,而是在前后两个等距接近的可保存的值中,取其中最后一位有效数字为零者。从上面的示例中可以看出,奇数都被舍入为偶数,且有舍有进。我们可以将这种舍入误差理解为"半位"的误差。所以,为了避免 7.22 对很多人造成的困惑,有些文章经常以 7.5 位来说明单精度浮点数的精度问题。 

    提示: 这里采用的浮点数舍入规则有时被称为舍入到偶数(Round to Even)。相比简单地逢一半则进的舍入规则,舍入到偶数有助于从某些角度减小计算中产生的舍入误差累积问题。因此为 IEEE 标准所采用。 

    8.3.1  规范化浮点数

    通过前面的介绍,大家应该已经了解的浮点数的基本知识,这些知识对于一个不接触浮点数应用的人应该足够了。简单总结如下:

    标准的浮点数都符都符合如下的公式:

    其中bias是固定的数值,这个在前面的已经讲解过。参数的具体范围如下

     

    8.3.2  非规范化浮点数

    我们来考察浮点数的一个特殊情况。选择两个绝对值极小的浮点数,以单精度的二进制浮点数为例,比如 1.001 × 2-125和 1.0001 ×2-125 这两个数(分别对应于十进制的 2.6448623 × 10-38和 2.4979255 ×10-38)。显然,他们都是普通的浮点数(指数为 -125,大于允许的最小值 -126;尾数更没问题),按照 IEEE 754 可以分别保存为 00000001000100000000000000000000(0x1100000)和 00000001000010000000000000000000(0x1080000)。 

    现在我们看看这两个浮点数的差值。不难得出,该差值为 0.0001 × 2-125,表达为规范浮点数则为 1.0 × 2-129。问题在于其指数大于允许的最小指数值,所以无法保存为规范浮点数。最终,只能近似为零(Flush to Zero)。这中特殊情况意味着下面本来十分可靠的代码也可能出现问题: 

    if (x != y)
    
    { 
    
    z = 1 / (x -y); 
    
    } 

    正如我们精心选择的两个浮点数展现的问题一样,即使 x 不等于 y,x 和 y 的差值仍然可能绝对值过小,而近似为零,导致除以 0 的情况发生。

    为了解决此类问题,IEEE 标准中引入了非规范(Denormalized)浮点数。规定当浮点数的指数为允许的最小指数值,即 emin 时,尾数不必是规范化的。比如上面例子中的差值可以表达为非规范的浮点数 0.001 × 2-126,其中指数 -126 等于 emin。注意,这里规定的是"不必",这也就意味着"可以"。当浮点数实际的指数为 emin,且指数域也为 emin 时,该浮点数仍是规范的,也就是说,保存时隐含着一个隐藏的尾数位。为了保存非规范浮点数,IEEE 标准采用了类似处理特殊值零时所采用的办法,即用特殊的指数域值 emin - 1 加以标记,当然,此时的尾数域不能为零。这样,例子中的差值可以保存为 00000000000100000000000000000000(0x100000),没有隐含的尾数位。

    有了非规范浮点数,去掉了隐含的尾数位的制约,可以保存绝对值更小的浮点数。而且,也由于不再受到隐含尾数域的制约,上述关于极小差值的问题也不存在了,因为所有可以保存的浮点数之间的差值同样可以保存。

    8.3.3  有符号的零

    因为 IEEE 标准的浮点数格式中,小数点左侧的 1 是隐藏的,而零显然需要尾数必须是零。所以,零也就无法直接用这种格式表达而只能特殊处理。 

    实际上,零保存为尾数域为全为 0,指数域为 emin - 1 = -127,也就是说指数域也全为 0。考虑到符号域的作用,所以存在着两个零,即 +0 和 -0。不同于正负无穷之间是有序的,IEEE 标准规定正负零是相等的。

    零有正负之分,的确非常容易让人困惑。这一点是基于数值分析的多种考虑,经利弊权衡后形成的结果。有符号的零可以避免运算中,特别是涉及无穷的运算中,符号信息的丢失。举例而言,如果零无符号,则等式 1/(1/x) = x 当x = ±∞ 时不再成立。原因是如果零无符号,1 和正负无穷的比值为同一个零,然后 1 与 0 的比值为正无穷,符号没有了。解决这个问题,除非无穷也没有符号。但是无穷的符号表达了上溢发生在数轴的哪一侧,这个信息显然是不能不要的。零有符号也造成了其它问题,比如当 x=y 时,等式1/x = 1/y 在 x 和 y 分别为 +0 和 -0 时,两端分别为正无穷和负无穷而不再成立。当然,解决这个问题的另一个思路是和无穷一样,规定零也是有序的。但是,如果零是有序的,则即使 if (x==0) 这样简单的判断也由于 x 可能是 ±0 而变得不确定了。两害取其轻者,零还是无序的好。

    8.3.4  无穷

    和 NaN 一样,特殊值无穷(Infinity)的指数部分同样为 emax + 1 = 128,不过无穷的尾数域必须为零。无穷用于表达计算中产生的上溢(Overflow)问题。比如两个极大的数相乘时,尽管两个操作数本身可以用保存为浮点数,但其结果可能大到无法保存为浮点数,而必须进行舍入。根据 IEEE 标准,此时不是将结果舍入为可以保存的最大的浮点数(因为这个数可能离实际的结果相差太远而毫无意义),而是将其舍入为无穷。对于负数结果也是如此,只不过此时舍入为负无穷,也就是说符号域为 1 的无穷。有了 NaN 的经验我们不难理解,特殊值无穷使得计算中发生的上溢错误不必以终止运算为结果。

    无穷和除 NaN 以外的其它浮点数一样是有序的,从小到大依次为负无穷,负的有穷非零值,正负零(随后介绍),正的有穷非零值以及正无穷。除 NaN 以外的任何非零值除以零,结果都将是无穷,而符号则由作为除数的零的符号决定。

    当零除以零时得到的结果不是无穷而是 NaN 。原因不难理解,当除数和被除数都逼近于零时,其商可能为任何值,所以 IEEE 标准决定此时用 NaN 作为商比较合适。 

    8.3.5  NaN

    NaN 用于处理计算中出现的错误情况,比如 0.0 除以 0.0 或者求负数的平方根。由上面的表中可以看出,对于单精度浮点数,NaN 表示为指数为 emax + 1 = 128(指数域全为 1),且尾数域不等于零的浮点数。IEEE 标准没有要求具体的尾数域,所以 NaN 实际上不是一个,而是一族。不同的实现可以自由选择尾数域的值来表达 NaN。

    8.4   定点数运算

    8.4.1  数的定标(Q格式)

    在许多情况下,数学运算过程中的数不一定都是整数,而且定点DSP和不带FPU的处理器是无能为力的。那么是不是说定点DSP和不带FPU的处理器就不能处理各种小数呢?当然不是。这其中的关键就是由程序员来确定一个数的小数点处于数据中的哪一位。这就是数的定标(由于很多时候,我们都是直接用C来实现浮点运算,具体的底层转化我们并没有去关心,所以也就很少有人知道数的定标)。

    通过设定小数点在数据中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标有Q表示法和S表示法两种。下表列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围。

     

    从上表可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如,

             16进制数2000H=8192,用Q0表示

             16进制数2000H=0.25,用Q15表示

    还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。例如,Q0 的数值范围是-32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051。因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想精度提高,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。

    浮点数与定点数的转换关系可表示为:

     

    例如,浮点数x=0.5,定标Q=15,则定点数xq=L0.5*32768J=16384,式中LJ表示下取整。反之,一个用Q=15表示的定点数16384,其浮点数为16384 *2^-15=16384/32768=0.5。浮点数转换为定点数时,为了降低截尾误差,在取整前可以先加上0.5。

    8.4.2  定点数的算术运算

    关于定点数的算术运算会在讲解ARM官方的DSP教程时专门给大家讲解。

    8.5   总结

    本期教程就跟大家讲这么多,这部分知识对于初学DSP的非常重要,建议认真学习下,有兴趣的可以在网上多查些资料进行了解。

     

    展开全文
  • 第8章 DSP定点数和浮点数(重要) 本期教程主要跟大家讲解一下定点数和浮点数的基础知识,了解这些基础知识对于后面学习ARM官方的DSP库大有裨益。特别是初学的一定要理解这些基础知识。 目录 第8章 DSP定点数和...
  • 第8章 DSP定点数和浮点数(重要) 本期教程主要跟大家讲解一下定点数和浮点数的基础知识,了解这些基础知识对于后面学习ARM官方的DSP库大有裨益。特别是初学的一定要理解这些基础知识。 8.1 定点数和浮点数概念 ...
  • DSP上浮点数据定点化处理 Q格式(Q15)

    千次阅读 2018-06-28 18:55:30
    许多DSP都是定点DSP,处理定点数据会相当快,但是处理浮点数据就会非常慢。可以利用Q格式进行浮点数据到定点的转化,节约CPU时间。实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。所以要选择一个...
  • 许多DSP都是定点DSP,处理定点数据会相当快,但是处理浮点数据就会非常慢。可以利用Q格式进行浮点数据到定点的转化,节约CPU时间。实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。所以要选择一个...
  • 本文关注定点dsp与浮点dsp的对比,感谢我所引用的资料的作者。 定点dsp与浮点dsp的比较(1) DSP数字信号处理器是一种特别适合于进行数字信号处理的微处理器,主要用于实时快速地实现各种数字信号处理算法定点运算...
  • DSP中的定点运算

    千次阅读 2018-05-06 21:58:20
    DSP中的定点算数运算1 数的定标 在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。显然,字长越长,所能表示的数...
  • Matlab定点化

    万次阅读 2018-03-08 16:39:13
    当要对于算法的硬件实现,使用Matlab进行定点化仿真非常重要,网上Matlab定点化仿真的资料比较少,下面是我总结的资料。Matlab定点化三种方法:1.使用round、floor等函数在每次运算后直接进行截断各种截断方法:ceil...
  • 7.1 定点数和浮点数概念  如果小数点的位置事先已有约定,不再改变,此类数称为“定点数”。相比之下,如果小数点的位置可变,则称为“浮点数”(定点数的本质是小数,整数只是其表现形式)。 ...
  • 定点DSP与浮点DSP的比较

    千次阅读 2019-03-27 22:25:04
    首先要理解什么是定点运算,浮点运算 你要知道DSP芯片是如何处理小数的 这就涉及的是小数的定标问题。数值的精度与数值的范围就成了一对矛盾了。...而在定点DSP上是不能直接进行小数运算的,需要先给...
  • 定点化

    千次阅读 2018-05-18 10:18:09
    谈到这个话题,有必要先介绍下“浮点数”和“定点数”这两个名词的概念。1.25 + (-2.75) = ? (1)上面这个算式我们心算就能轻松得出结果,同样的算式,交给单片机来完成,它要大致分解为下面三个计算步骤:1)加载...
  • BMU的输入数据是36位的BMUi,经过处理后输出36位的数据BMUo作为本文设计的BMU是36位的,主要功能包括逻辑/算术移位、取指、归一等,以下是对控制信号及相关功能较为详细的描述。逻辑/算术左移 相应的控制信号是in ...
  • DSP芯片的定点运算

    千次阅读 2014-08-09 09:58:29
    定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。显然,字长越长,所能表示的数的范围越大,精度也越高。如无特别...
  • DSP学习笔记(二)——DSP中浮点数与定点数格式与处理 1 DSP中的数据表述 DSP中数据通常是有定点数与浮点数表示,其中可以对字长进行相关定义,可以选取字长为16位、24位、32位不同字长使用。而格式与字长决定了...
  • DSP基础--定点小数运算

    千次阅读 2018-05-08 11:52:54
    http://www.eefocus.com/XuWenbo/blog/08-03/146753_a2c67.html 在DSP世界中,由于DSP芯片的限制,经常使用定点小数运算。所谓定点小数,实际上就是用整数来进行小数运算。下面先介绍定点小数的一些理论知识,然后以...
  • DSP芯片的定点运算 本文排版不恰当,请到新浪爱问下载本文的pdf版,《【豪猪哥】DSP芯片的定点运算1.0》 第3章 DSP芯片的定点运算 3.1数 的定 标 在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用...
  • FPGA浮点数定点化

    2018-08-10 13:27:47
    中增加了硬核浮点DSP模块,这样更加适合硬件加速和做一些比较精确的计算。  浮点数和定点数的区别:定点数的小数点是固定的,而浮点数的小数点的位置不确定,举个例子,定点数 1.1*1.1 = 1.2(定点一位小数),...
  • 定点化 由于成本,功耗等音素,一些DSP和MCU上并没有硬浮点支持,采用软浮点较为耗时,更有甚至不支持浮点计算。 在这些处理器上要实现相关算法,浮点的计算转换到定点域里计算必不可少。 Q格式的数据是名义上的定点...
  •  第二部分 dsp定点运算基本方法 整理来自:时间的诗 第一部分 DSP基础--定点小数运算 来自:http://www.eepw.com.cn/article/17893.htm 在DSP世界中,由于DSP芯片的限制,经常使用定点小数运算。...
  • 语音识别研究的根本目的是研究出一种具有听觉功能的机器,能直接接受人...近年来,高性能数字信号处理芯片DSP(Digital Signal Process)技术的迅速发展,为语音识别的实时实现提供了可能,其中,AD公司的数字信号处理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,408
精华内容 563
关键字:

dsp定点化计算