您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 通用数字信号处理方法的DSP实现
1第五章通用数字信号处理方法的DSP实现DSP常见的几种信号处理算法:DSP定点基本算术运算定点DSP浮点运算级数展开FIR滤波器的实现FFT的实现自适应滤波(LMS)的实现2§5.1-1实现16定点加法C54X中提供了多条用于加法的指令,如ADD,ADDC,ADDM和ADDS。其中ADDS用于无符号数的加法运算,ADDC用于带进位的加法运算(如32位扩展精度加法),而ADDM专用于立即数的加法。ldtemp1,a;将变量temp1装入寄存器Aaddtemp2,a;将变量temp2与寄存器A相加,结;果放入A中stla,add_result;将结果(低16位)存入变量;add_result中。§5.1-2实现16定点减法C54X中提供了多条用于减法的指令,如SUB,SUBB,SUBC和SUBS。其中SUBS用于无符号数的减法运算,SUBB用于带进位的减法运算(如32位扩展精度的减法),而SUBC为移位减,DSP中的除法就是用该指令来实现的。stm#temp1,ar3;将变量temp1的地址装入ar3寄存器stm#temp3,ar2;将变量temp3的地址装入ar3寄存器sub*ar2+,*ar3,b;将变量temp3左移16位同时变量;temp1也左移16位,然后相减,结果;放入寄存器B(高16位)中,同时ar2加1。sthb,sub_result;将相减的结果(高16位)存入变量;sub_result。3§5.1-3实现16定点整数乘法在C54X中提供了大量的乘法运算指令,其结果都是32位,放在A或B寄存器中。乘数在C54X的乘法指令很灵活,可以是T寄存器、立即数、存贮单元和A或B寄存器的高16位。在C54X中,一般对数据的处理都当做有符号数,如果是无符号数乘时,请使用MPYU指令。16定点整数乘法例子在C54X中,小数的乘法与整数乘法基本一致,只是由于两个有符号的小数相乘,其结果的小数点的位置在次高的后面,所以必须左移一位,才能得到正确的结果。C54X中提供了一个状态位FRCT,将其设置为1时,系统自动将乘积结果左移移位。rsbxFRCT;清FRCT标志,准备整数乘ldtemp1,T;将变量temp1装入T寄存器mpytemp2,a;完成temp2*temp1,结果放;入A寄存器(32位)416定点整数乘法例子0ccdH(十进制的0.1)x0599aH(十进制的0.7),两数相乘后B寄存器的内容为08f5f0a4H(十进制的0.07000549323857)。可以使用RND或使用MPYR指令对低16位做四舍五入的处理。SsbxFRCT;FRCT=1,准备小数乘法ldtemp1,16,a;将变量temp1装入寄存器A的高16位mpyatemp2;完成temp2乘寄存器A的高16位,结;果在B中,同时将temp2装入T寄存器sthb,mpy_f;将乘积结果的高16位存入变量mpy_f§5.1-4实现16定点整数除法在C54X中没有提供专门的除法指令,一般有两种方法来完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。另一种方法是使用SUBC指令,重复16次减法完成除法运算。temp1/temp2为例,说明如何使用SUBC指令实现整数除法:5ldtemp1,T;将被除数装入T寄存器mpytemp2,A;除数与被除数相乘,结果放入A寄存器ldtemp2,B;将除数temp2装入B寄存器的低16位absB;求绝对值stlB,temp2;将B寄存器的低16位存回temp2ldtemp1,B;将被除数temp1装入B寄存器的低16位absB;求绝对值rpt#15;重复SUBC指令16次subctemp2,b;使用SUBC指令完成除法运算bcddiv_end,agt;延时跳转,先执行下面两条指令,;然后判断A,若A0,则跳转到标号;div_end,结束除法运算stlB,quot_i;将商(B寄存器的低16位)存入变量quot_isthB,remain_i;将余数(B寄存器的高16位)存入变量remain_ixorB;若两数相乘的结果为负,则商也应为负。Subquot_i,B;将商反号stlB,quot_i;存回变量quot_i中div_end:§5.1-5实现16定点小数除法在C54X中实现16位的小数除法与前面的整数除法基本一致,也是使用循环的SUBC指令来完成。但有两点需要注意:第一,小数除法的结果一定是小数(小于1),所以被除数一定小于除数。这与整数除法正好相反。所以在执行SUBC指令前,应将被除数装入A或B寄存器的高16位,而不是低16位。其结果的格式与整数除法一样,A或B寄存器的高16位为余数,低16位为商。第二,与小数乘法一样,应考虑符号位对结果小数点的影响。所以应对商右移一位。6§5-2C54X的浮点数的算术运算浮点数的表示方法在定点运算中,小数点是在一个特定的固定位置。在定点运算系统中,虽然在硬件上实现简单,但是表示的操作数的动态范围要受到限制。使用浮点数,可以避免这个困难。一个浮点数由尾数m、基数b和指数e三部分组成。即:eb*m7IEEE标准里的浮点数表示方法这个格式用带符号的表示方法来表示尾数,指数含有127的偏移。在一个32-bit表示的浮点数中,第一位是符号位,记为S。接下来的8-bit表示指数,采用127的偏移格式(实际是e-127)。然后的23-bit表示尾数的绝对值,考虑到昀高一位是符号位,它也应归于尾数的范围,所以尾数一共有24-bit。IEEE标准里的浮点数表示方法比如说:十进制数-29.625可以用二进制表示为-11101.101B,用科学计数法表示为-1.1101101*24,其指数为127+4=131,化为二进制表示为10000011B,故此数的浮点格式表示为11000001111011010000000000000000,转换成16进制表示为0xC1ED0000。).1(*2*)1(2550127fees−−为时当8浮点数运算的基本步骤分离符号、指数、尾数。根据需要对齐指数,按运算法则进行定点数运算。归一化指数按浮点数格式重新组合。下面以浮点数加为例,详细介绍一.浮点数加法运算的步骤要在C54X上实现浮点运算,操作数必须变换成定点数,实际上就是一个数据格式的转换问题。执行完下面代码后,操作数1就从原来在op1_hsw和op1_lsw(共32bit)中的浮点数格式转换为三部分:指数和符号位(存储于op1se中)、尾数低位(存储于op1lm中)以及尾数高位(存储于op1hm中),这时所有的数值就都转换为定点数的格式了。9dldop1_hsw,a;将OP1装入累加器A中。sftaa,8sftaa,-8;通过先左移后右移使AG=0。bcop1_zero,AEQ;如果OP1是零,转入特殊处理。stha,-7,op1se;将符号和指数存储到OP1SE中。stla,op1lm;存储尾数的低位。and#07Fh,16,a;将浮点数格式中的符号和指数去掉;得到尾数的高位。add#080h,16,a;给尾数加上小数点前的“1”。stha,op1hm;存储尾数的高位。浮点数加法运算由于实行的是带符号位的运算,所以要把尾数变成带符号的形式,即如果是正数就不改变其存储格式,而如果是负数,就要用补码来表示尾数,这部分的代码如下:10bitfop1se,#100h;取出op1符号位的值于TC位中bctestop2,NTC;如果TC=0则跳转到testop2处ld#0,a;dsubop1hm,a;0–op1的尾数,得到尾数的补码表示dsta,op1hm;将尾数存入op1hm和op1lm中testop2:bitfop2se,#100h;取出op1符号位的值于TC位中bccompexp,NTC;如果TC=0则跳转到compexp处ld#0,a;dsubop2hm,a;0–op1的尾数,得到尾数的补码表示dsta,op2hm;将尾数存入op1hm和op1lm中浮点数加法运算通过上述过程,把浮点数分解为尾数和指数两个部分,对于浮点数的加法而言,计算过程是左移指数较小的操作数的尾数,使得两个操作数的指数一致,相差几位移几位,再把尾数相加,归一化后输出。先比较两个操作数指数的大小,以决定到底是尾数直接相加还是移位以后再相加,该段过程可以用以下的代码来实现:11compexp:ldop1se,a;将操作数1的符号和指数位装入accA中and#00ffh,a;去掉符号位的影响ldop2se,b;将操作数2的符号和指数位装入accB中and#00ffh,a;去掉符号位的影响suba,b;op2的指数-op1的指数结果赋给accBbcop1_gt_op2,BLT;跳到进行op1op2的操作处bcop2_gt_op1,BGT;跳到进行op2op1的操作处a_eq_b:;执行A=B的操作dldop1hm,a;将操作数1的尾数(32bit)放到accA中daddop2hm,a;将操作数2的尾数与操作数1的尾数进行;32bit的双精度加法op1_gt_op2:absb;去掉符号位的影响sub#24,b;判断op1_se是否比op2_se大24bcreturn_op1,BGEQ;如果op1_se远远大于op2_se则;转入相应的返回op1的操作add#23,b;恢复指数的差值stlb,rltsign;存储指数差值以准备作为RPC使用dldop2hm,a;将OP2的尾数(32bit)装入accA中rptrltsign;规范OP2以适应OP1sftaa,-1bdnormalize;延迟方式执行跳转到normalize处ldop1se,b;将指数值装入accB以准备规一化处理daddop1hm,a;将OP1和OP2的尾数相加12浮点数加法运算完成对操作数之间的计算后就需要对结果数进行归一化操作。所谓归一化操作就是把数据格式转换为第一位为符号位,紧接着的一位是非零的数的格式,即是:S1xxxxxxxxxxxxxx的形式。可以用如下的代码来实现:normalize:stha,rltsign;将带符号的尾数高位存入rltsign单元中absa;去掉符号位的影响sftla,6;进行归一化的预处理,将acc中的值;左移6位expa;对accA中的值进行规一化操作normastt,rltexp;存储规一化时左移的数值到rltexp中add#1,b;考虑到进位位所以要给指数加上“1”subrltexp,b;完成指数的归一化工作13浮点数加法运算在这段代码中accA中的值是由两个24bit的操作数定点相加而得到的,其MSB可能在bit24-bit0中的任何一位,所以首先左移6位让bit24移至bit30,接下来通过exp和norm指令联合使用之后accA中的数据变成归一化形式。比如:这两条指令执行之前accA中的值为0x01800000,执行以后A中的值为0x60000000。浮点数加法运算操作数左移的位数被存于寄存器T中,如上述操作后寄存器T中的值为0x0006,所以昀后的指数的计算还要减去寄存器T中的值才是昀后结果的指数值。归一化完后要再把归一化后的定点数转变为浮点数,这是前面的转变浮点数为定点数的逆过程,参照前述步骤可以用如下程序实现:14normalized:stlb,rltexp;将结果指数存在rltexp中bcunderflow,BLEQ;如果B〈0进行下溢处理sub#0ffh,b;进行上溢处理判断bcoverflow,BGEQ;如果B〉0进行上溢处理sftla,-7;将尾数右移7位以方便以后合成为32bit;的浮点数格式stla,rltlm;存储低位的尾数and#07f00h,8,a;将昀开始中小数点前的“1”省略stha,rlthm;存储高位的尾数;-----------ConversionofFloatingPointFormattoPack--------ldrltsign,9,a;将rltsi
本文标题:通用数字信号处理方法的DSP实现
链接地址:https://www.777doc.com/doc-5498803 .html