1 经典算法
DSP中没有现成的除法指令,除法是靠被除数与除数之间的移位相减来实现的。在C54X系列里利用减法指令SUBC和循环指令RPT实现2个16位数的相除。下面以C54X为例来具体实现经典的除法:
C54X提供的SuBC指令仅对无符号数进行操作,所以在移位相减开始之前必须先将被除数和除数取绝对值,仅考虑2个正数的除法。此时除法运算有两种情况:
当|被除数|<|除数|时,将|被除数|存放在累加器的高16位,然后用SUBC完成15次移位相减,相减之后在累加器A的低16位中存放商的绝对值。根据运算前被除数和除数的符号是否相同来决定是否要改变所得结果的符号。
当|被除数|≥|除数|时,将|被除数|存放在累加器的低16位,然后用SUBC完成16次移位相减,相减之后在累加器A的低16位中存放商的绝对值。根据运算前被除数和除数的符号是否相同来决定是否要改变所得结果的符号。
从实现的过程分析,当|被除数|<|除数|时,移位相减开始时|被除数|和|除数|的小数点位置正好相差一位。第一次相减后在累加器A的O位最低位存进的数值正是商的最高位,该位为商的小数点后第一位。在15次移位相减之后,累加器A低16位所得的结果为Q值为15的小数。当|被除数|≥|除数|时,在第l6次相减时,|被除数|位于A的高16位(30~15位)上,小数点位在A的15位后,和|除数|的小数点位正好对齐,则此次相减后在A的0位加上的值正好是商的最低有效整数位,相当于十进制数中的个位。所以在16次移位相减之后,累加器A低16位所得的结果为Q值为0的整数。以此分析,当商的精确值不是整数,或者超出Q值15所表示的范围时,此算法所得结果就达不到16位数据所能表达的精确度。
表1中任取几组数据来说明。
2 高精度算法
由于经典算法在结果上存在精度不高的问题,所以应考虑精度尽可能高的除法算法。
和经典算法一致,本算法也采用移位相减实现除法。但不同的是,在进行移位相减之前算法对除数与被除数进行了一些处理,并且在移位相减时不再分两种情况。下面具体介绍算法的流程。
首先给出被除数y和除数x。由于定点DSP中所有的数据都以整数的形式存在,所以在这里就把y和x看成是整数,不考虑它们本身的Q值。在图1所示的流程图中,A和B是C5416的2个累加器。算法第一步是将x和y相乘,结果存放在B中,以便在最后从B中提取商的符号(商的符号与B的符号相同)。第二步分别对x和y取绝对值以进行无符号数相除。第三步,分别判断x和y在最高有效位之前共有多少个O,分别记为n和m,即在x和y的分别有(16一n)和(16一m)个有效位。然后将x和y分别左移(n一1)位和(m一2)位,即x=x·2n-1,y=y·2m-2。第四步,将前面所得x和y再进行移位相减,把y存放在A的高位,即AH=y,利用SUBC指令进行1 5次移位相减。在所得的结果当中,A的低位即为商的绝对值,B的符号即为商的符号,两者结合得到quot值。由于在移位相减之前分别对除数和被除数有一个左移放大的操作,所以在结果中就必须考虑商的Q值。