DSP定点算术运算

2019-07-21 17:32发布

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为例。

1定点乘法

     两个定点数相乘时可以分为下列三种情况:
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程序:

  1. <font color="black">LT  OP1
  2. MPY OP2
  3. PAC
  4. ADD  ONE,14(上舍入)
  5. SACH  ANS,1</font>
复制代码
    上述程序说明,不管ANS为正或负,所产生的误差是l/2  LSB,其中存储单元ONE的值为1。

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定点除法

     在通用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。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。