通用数字信号处理方法的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

1 / 48
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功