收藏 分销(赏)

5汇编语言编程举例课件.ppt

上传人:a199****6536 文档编号:13298825 上传时间:2026-02-24 格式:PPT 页数:94 大小:3.32MB 下载积分:18 金币
下载 相关 举报
5汇编语言编程举例课件.ppt_第1页
第1页 / 共94页
5汇编语言编程举例课件.ppt_第2页
第2页 / 共94页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,1,DSP技术及应用,D,igital,S,ignal,P,rocessor,数字信号处理器,第五章 汇编语言编程举例,第一节汇编语言编程的基本方法,第二节,用,DSP,实现,FIR,和,IIR,滤波器,第三节,DSP,的浮点运算方法,第一节 汇编语言编程的基本方法,1,堆栈的使用,1.,压入数据时,堆栈从高地址向低地址增长。,2.,压栈时指针先减,,SP-1,,再压入数据;,3.,出栈时,先弹出数据后,再,SP+1,。,4.,如要用堆栈,必须先设置,后使用。,要,点,传送速度比加载和存储指令要快;,传送数据不需要通过累加器;,可以寻址程序存储器;,与,RPT,指令相结合(重复时,这些指令都变成单周期指令),可以实现数据块传送。,2,数据块传送,特,点,(,1,)数据存储器数据存储器,这类指令有:,MVDK Smem,dmad,指令的字数,/,执行周期,2/2,MVKD dmad,Smem,;,Smem=dmad,2/2,MVDD Xmem,Ymem,;,Ymem=Xmem 1/1,(,2,)程序存储器数据存储器,这类指令有:,MVPD pmad,Smem,;,Smem=pmad 2/3,MVDP Smem,pmad,;,pmad=Smem 2/4,pmad,为,16,位立即数程序存储器地址;,dmad,为,16,位立即数数据存储器地址;,Smem,为数据存储器地址;,Xmem,、,Ymem,为双操作数数据存储器地址,,Xmem,从,DB,数据总线上读出。,Ymem,从,CB,数据总线上读出。,(,3,)数据存储器,MMR,这类指令有:,MVDM dmad,MMR,;指令的字数,/,执行周期,2/2,MVMD MMR,dmad,;,dmad=MMR 2/2,MVMM mmrx,mmry,;,mmry=mmrx 1/1,(,4,)程序存储器(,Acc,)数据存储器,包括:,READA Smem,;,Smem=prog(A)1/5,WRITA Smem,;,prog(A)=Smem 1/5,mmrx,mmry,为,AR0,AR7,或,SP,;,MMR,为任何一个存储器映象寄存器;,例,5-6,将数组,x5,初始化为,1,2,3,4,5,。,.data,;定义初始化数据段起始地址,TBL:.word 1,2,3,4,5,;为标号地址,TBL,;开始的,5,个单元赋初值,.sect “.vectors”,;定义自定义段,并获,;得该段起始地址,B START,;无条件转移到标号为,START,的地址,.bss x,5,;为数组,x,分配,5,个存储单元,.text,;定义代码段起始地址,START:STM#x,AR5,;将,x,的首地址存入,AR5,RPT#4,;设置重复执行,5,次下条指令,MVPD TBL,*AR5+,;将,TBL,开始的,5,个值传给,x,(,1,)程序存储器数据存储器,start:STM#0,SWWSR,;复位,SWWSR,STM#STACK+30H,SP,;初始化堆指针,STM#x,AR1,;将目的地首地址赋给,AR1,RPT#19,;设定重复传送的次数为,20,次,MVPD table,*AR1+,;程序存储器传送到数,;据存储器,STM#x,AR2,;将,x,的首地址存入,AR2,STM#y,AR3,;将,y,的首地址存入,AR3,RPT#19,;设置重复执行,20,次下条指令,MVDD *AR2+,*AR3+,;将地址,x,开始的,20,个值,;复制到地址,y,开始的,20,个单元,end:B end,.end,用间接寻址方式获得操作数,且辅助寄存器只用,AR2,AR5,;,占用程序空间小;,运行速度快。,4,双操作数乘法,特,点,例,5-8,编制求解 的程序。,利用双操作数指令可以节省机器周期。迭代次数越多,节省的机器周期数也越多。本例中,在每次循环中,双操作数指令都比单操作数指令少用一个周期,节省的总机器周期数,=1T*N,(迭代次数),=NT,。,在单个周期内同时利用,C,总线和,D,总线,得到,32,位操作数。,5,长字运算,特,点,使用长操作数指令时,按指令中给出的地址存取的总是高,16,位操作数。这样,有两种数据排列方法:,(,1,)偶地址排列法,指令中给出的地址为偶地址,存储器中低地址存放高,16,位操作数。,如:,DLD *AR3+,A,执行前:,A=00 0000 0000,执行后:,A=00 6CAC BD90,AR3=0100 AR3=0102,(,0100h,),=6CAC,(高字)(,0100h,),=6CAC,(,0101h,),=BD90,(低字)(,0101h,),=BD90,(,2,)奇地址排列法,指令中给出的地址为奇地址,存储器中低地址存放低,16,位操作数。,如:,DLD *AR3+,A,执行前:,A=00 0000 0000,执行后:,A=00 BD90 6CAC,AR3=0101 AR3=0103,(,0100h,),=6CAC,(低字)(,0100h,),=6CAC,(,0101h,),=BD90,(高字)(,0101h,),=BD90,推荐采用偶地址排列法,将高,16,位操作数放在偶地址存储单元中。如:,程序存储器,.long 12345678 h,;偶地址:,1234,;奇地址:,5678,数据存储器,.bss xhi,2,1,1,;偶地址:,xhi,;奇地址:,xlo,变量名称 字长 页邻接 偶地址排列法,例,5-9,计算,Z,32,=X,32,+Y,32,。,标准运算 长字运算,LD xhi,16,A DLD xhi,A,ADDS xlo,A,DADD yhi,A,ADD yhi,16,A,DST A,zhi,ADDS ylo,A,(,3,个字,,3,个,T,),STH A,Zhi,STL A,Zlo,(,6,个字,,6,个,T,),(1),并行运算指同时利用,D,总线和,E,总线。其中,,D,总线用来执行加载或算术运算,,E,总线用来存放先前的结果。,(2),并行指令都是单字单周期指令。,(3),并行运算时所存储的是前面的运算结果,存储之后再进行加载或算术运算。,(4),并行指令都工作在累加器的高位。,6,并行运算,特,点,表,5-1,并行指令举例,指 令,指 令,举 例,操作说明,并行加载和乘法指令,LDMACR,LDMASR,LD Xmem,dst,MACR Ymem,dst,dst=Xmem,(,16-ASM,),dst=Xmem,(,16-ASM,),dst=dst+T*Xmem,并行存储和加,/,减法指令,STADD,STSUB,ST src,Ymem,ADD Xmem,dst,Ymem=src,(,16-ASM,),dst=dst+Xmem,.text,start:STM#0,SWWSR,STM#STACK+10H,SP,STM#x,AR1,RPT#5,MVPD table,*AR1+,STM#x,AR5,;将第一组变量的首地址传给,AR5,STM#d,AR2,;将第二组变量的首地址传给,AR2,LD#0,ASM,;设置,ASM=0,LD *AR5+,16,A,;将,x,的值左移,16,位放入,A,的高端字,ADD *AR5+,16,A,;将,y,值左移,16,位与,A,的高端字,x,相加,ST A,*AR5,;将,A,中的和值右移,16,位存入,z,中,LD *AR2+,B,;将,d,的值左移,16,位放入,B,的高端字,ADD *AR2+,16,B,;将,e,值左移,16,位与,B,的高端字,d,相加,STH B,*AR2,;将,B,的高端字中的和值存入,f,中,end:B end,.end,9,小数运算,整数运算的问题,(,1,)两个,16,位整数相乘,乘积总是“向左增长”。这意味着多次相乘后,乘积将会很快超出定点器件的数据范围。,(,2,)保存,32,位乘积到存储器,要开销,2,个机器周期以及,2,个字的存储器单元。,(,3,)由于乘法器都是,16,位相乘,因此很难在后续的递推运算中,将,32,位乘积作为乘法器的输入。,小数运算的优点,(,1,)乘积总是“向右增长”。这就味着超出定点器件数据范围的将是不太感兴趣的部分。,(,2,)既可以存储,32,位乘积,也可以存储高,16,位乘积,这就允许用较少的资源保存结果。,(,3,)可以用于递推运算。,小数运算与整数运算的比较,在汇编语言中,是不能直接写入十进制小数的,可写为整数运算式。,如果要定义一个系数,0.707,,可以写成:,.word 32768*707/1000,不能写成,32768*0.707,。,注意,Q,格式表示法,在,Q,格式中,,Q,之后的数字(如,Q15,格式中的,15,)决定小数点右边有多少位二进制位,故,Q15,表示在小数点后有,15,位小数。当用一个,16,位的字来表示,Q15,格式时,在,MSB,(最高位)的右边有一个小数点,而,MSB,表示符号位。所以,Q15,的表示数字可表示范围从,+1,(以,+0.999997,表示)到,-1,的值。,通过合适的,Q,格式,可以把数值根据所需的精确度做适当地转换,以便定点数的,DSP,也可以处理高精度的浮点数。下面以,Q15,为例,说明转换的过程。,1,),先确定准备转换的十进制数值,N,,是在,Q15,格式的数值范围之间,即,-1.000000N+0.999997,。,2,)数值,N,乘以,2,15,,即,N=N2,15,=N32768,3,)把步骤,2,)的结果加,2,16,,即,N=N+2,16,=N+65536,。,4,)步骤,3,)的结果转换成十六进制,并把第,17,位舍弃掉,得到的结果就是,N,的,Q15,转换值。,以字长为,4,位和,8,位累加器为例,先看一个小数乘法的例子。,0 1 0 0,(,0.52,3,0.5=,(,4,),10,=,(,0100,),2,),1 1 0 1,(,-0.3752,3,(,-0.375,),=,(,-3,),10,0 1 0 0,=,(,1101,),补,),0 0 0 0,0 1 0 0,1 1 0 0,(,-0100,),1 1 1 0 1 0 0,(,-0.1875=-12/2,6,-12=,(),补,),(,2,)小数乘法与冗余符号位,上述乘积是,7,位,当将其送到,8,位累加器时,为保持乘积的符号,必须进行符号位扩展,这样,累加器中的值为(,-0.09375=-12/2,7,),出现了冗余符号位。原因是:,S x x x,(,Q3,),S y y y,(,Q3,),S S z z z z z z,(,Q6,格式),即两个带符号数相乘,得到的乘积带有,2,个符号位,造成错误的结果。,同样,对于两个十六位数相乘,乘积只有,30,位,在最高的两位也是符号位,同样会造成错误的结果。,解决冗余符号的办法是:在程序中设定状态寄存器,ST1,中的,FRCT,(小数方式)位,1,,在乘法器将结果传送至累加器时就能自动地左移,1,位,累加器中的结果为:,zzzzzz0,(,Q7,格式),即(,-0.1875=-24/2,7,-24=,(),补,),自动地消去了两个带符号数相乘时产生的冗余符号位。所以在小数乘法编程时,应当事先设置,FRCT,位:,SSBX FRCT,MPY *AR2,*AR3,A,STH A,Z,这样,,C54x,就完成了,Q15*Q15=Q15,的小数乘法。,table:.word 1*32768/10,;在,table,开始的,8,个,.word 2*32768/10,;地址放数据,.word -3*32768/10,.word 4*32768/10,.word 8*32768/10,.word 6*32768/10,.word -4*32768/10,.word -2*32768/10,.text,;定义可执行程序代码段,start:SSBX FRCT,;设置,FRCT,位,表示进行小数乘,STM#x,AR1,;将,x,的首地址传给,AR1,RPT#7,;重复,8,次下条指令,MVPD table,*AR1+,;将程序空间,8,个数传给数据存储器,STM#x,AR2,;将数据存储器第一个数,x,1,的地址传给,AR2,STM#a,AR3,;将数据存储器第五个数,a,1,的地址传给,AR3,RPTZ A,#3,;将,A,清零,重复,4,次下条指令,MAC *AR2+,*AR3+,A,;执行乘法累加和,结果放在,A,中,STH A,y,;将,A,的高端字存入结果,y,,低端字省去,end:B end,;原处循环等待,.end,结果,y=0 x1EB7,。转换为十进制数:,y=,(,116,3,+1416,2,+1116,1,+716,0,),/32768=0.24,10,除法运算,方法:减法指令加重复指令实现无符号运算,(,1,)当被除数除数 此时商为小数。,(,2,)当被除数除数时 商为整数。,第三节 用,DSP,实现,FIR,滤波器,1,FIR,滤波器基本概念,1.,FIR,滤波器没有反馈回路,因此它是无条件稳定系统,其单位冲激响应,h,(,n,)是一个有限长序列。,2.,FIR,滤波算法实际上是一种乘法累加运算。,要,点,2.,用线性缓冲区法实现,z-1,的,FIR,滤波器设计,对于,N,级的,FIR,滤波器,在数据存储器中开辟一个称之为滑窗的,N,个单元的缓冲区,存放最新的,N,个输入样本;从最老的样本开始,每读一个样本后,将此样本向下移位,读完最后一个样本后,输入最新样本至缓冲区的顶部。,用线性缓冲区实现,z,-1,的优点是,新老数据在存储器中存放的位置直接明了。,特点,C54x,片内没有,I/O,资源,,CPU,通过外部译码可以寻址,64K,的,I/O,单元。,有两条实现输入和输出的指令:,PORTR PA,Smem,;将为,PA,的端口内容送,;数据存储器,Smem,PORTW Smem,PA,;将地址为,Smem,的数据,;存储器内容送端口,PA,数据的输入,/,输出,N=6,的线性缓冲区存储器图,使用存储器延时指令,DELAY,,可以将数据存储单元中的内容向较高地址的下一单元传送。,实现,z,-1,的运算指令为:,DELAY Smem,;(,Smem,),Seme+1,,即数据存储,;器单元的内容送下一高地址单元,DELAY *AR2,;,AR2,指向源地址,即将,AR2,所指单,;元内容复制到下一高地址单元中,存储器的延时操作,延时指令与其它指令,的,结合,LT+DELAYLTD,指令 ;单数据存储器的值装入,;,T,寄存器并送下一单元延时,MAC+DELAYMACD,指令;操作数与程序存储器值相乘,;后累加并送下一单元延时,例,5-25,编写,N=5,,,y,(,n,),=a,0,*x,(,n,),+a,1,*x,(,n-1,),+a,2,*x,(,n-2,),+a,3,*x,(,n-3,),+a,4,*x,(,n-4,)的计算程序。,先将系数,a,0,a,4,存放在数据存储器中,然后设置线性缓冲区,用以存放输入和输出数据。,(1),用线性缓冲区和直接寻址方法实现,FIR,线性缓冲区安排,.title“FIR1.ASM”,;定义源程序名,.mmregs,;定义存储器映象寄存器,.def start,;定义语句标号,start,.bss y,1,;为结果,y,预留,1,个单元的空间,XN .usect“XN”,1,;在自定义的未初始化段“,XN”,XNM1.usect“XN”,1,;中保留,5,个单元的空间,XNM2.usect“XN”,1,XNM3.usect“XN”,1,XNM4.usect“XN”,1,A0 .usect“A0”,1,;在自定义的未初始化段“,A0”,A1 .usect“A0”,1,;中保留,5,个单元的空间,A2 .usect“A0”,1,A3 .usect“A0”,1,A4 .usect“A0”,1,PA0 .set 0,;定义,PA0,为输出端口,PA1 .set 1,;定义,PA1,为输入端口,.data,table:.word 1*32768/10,;假定程序空间有五个参数,.word -3*32768/10,.word 5*32768/10,.word -3*32768/10,.word 1*32768/10,.text,start:.SSBX FRCT,;设置进行小数相乘,STM#A0,AR1,;,将数据空间用于放参数的首地址送,AR1,RPT#4,;重复下条指令,5,次传送,MVPD table,*AR1+,;传送程序空间的参数到数据空间,LD#XN,DP,;设置数据存储器页指针的起始位置,PORTR PA1,XN,;,从数据输入端口,I/O,输入最新数据,x,(,n,),FIR1:LD XNM4,T,;,x,(,n-4,),T,MPY A4,A,;,a,4,*x,(,n-4,),A,LTD XNM3,;,x,(,n-3,),T,x,(,n-3,),x,(,n-4,),MAC A3,A,;,A+a,3,*x,(,n-3,),A,LTD XNM2,;,x,(,n-2,),T,x,(,n-2,),x,(,n-3,),MAC A2,A,;,A+a,2,*x,(,n-2,),A,LTD XNM1,;,x,(,n-1,),T,x,(,n-1,),x,(,n-2,),MAC A1,A,;,A+a,1,*x,(,n-1,),A,LTD XN,;,x,(,n,),T,x,(,n,),x,(,n-1,),MAC A0,A,;,A+a,0,*x,(,n,),A,STH A,y,;保存,y,(,n,)的高字节,PORTW y,PA0,;输出,y,(,n,),BD FIR1,;执行完下条指令后循环,PORTR PA1,XN,;输入,x,(,n,),.end,vectors.obj,fir1.obj,-o fir1.out,-m fir1.map,-e start,MEMORY ,PAGE 0:EPROM:org=01OOOH len=01000H,VECS:org=03F80H len=00080H,PAGE 1:SPRAM:org=00060H len=00020H,DARAM:org=00080H len=01380H ,SECTIONS,.vectors:VECS PAGE 0,.text:EPROM PAGE 0,.data:EPROM PAGE 0,.bss:SPRAM PAGE 1,.XN:DARAM align(8)PAGE 1,.A0:DARAM align(8)PAGE 1 ,(2),用线性缓冲区和间接寻址方法实现,FIR,例,5-26,编写,y,(,n,),=a,0,*x,(,n,),+a,1,*x,(,n-1,),+a,2,*x,(,n-2,),+a,3,*x,(,n-3,),+a,4,*x,(,n-4,)的计算程序,其中,N=5,。,将系数,a,0,a,4,存放在数据存储器中,并设置线性缓冲区存放输入数据。利用,AR1,和,AR2,分别作为间接寻址线性缓冲区和系数区的辅助寄存器。,.title“FIR2.ASM”,;定义源程序名,.mmregs,;定义存储器映象寄存器,.def start,;定义语句标号,start,.bss y,1,;为结果,y,预留,1,个单元的空间,x .usect“x”,5,;,在自定义的未初始化段“,x”,中保留,5,个单元的空间,a .usect“a”,5,;,在自定义的未初始化段“,a”,中保留,5,个单元的空间,PA0 .set 0,;定义,PA0,为输出端口,PA1 .set 1,;定义,PA1,为输入端口,.data,table:.word 2*32768/10,;假定程序空间有五个参数,.word -3*32768/10,.word 4*32768/10,.word -3*32768/10,.word 2*32768/10,.text,start:STM#a,AR2,;将数据空间用于放参数,;的首地址送,AR2,RPT#4,;重复下条指令,5,次传送,MVPD table,*AR2+,;,传送程序空间的参数到数据空间,STM#x+4,AR1,;,AR1,指向,x,(,n-4,),STM#a+4,AR2,;,AR2,指向,a,4,STM#4,AR0,;指针复位值,4AR0,SSBX FRCT,;小数相乘,LD#x,DP,;设置数据存储器页指针,;的起始位置,PORTR PA1,x,;,从端口,PA1,输入最新值,x,(,n,),FIR2:LD *AR1-,T,;,x,(,n-4,),T,MPY *AR2-,A,;,a,4,*x,(,n-4,),A,LTD *AR1-,;,x,(,n-3,),T,x,(,n-3,),x,(,n-4,),MAC *AR2-,A,;,A+a,3,*x,(,n-3,),A,LTD *AR1-,;,x,(,n-2,),T,x,(,n-2,),x,(,n-3,),MAC *AR2-,A,;,A+a,2,*x,(,n-2,),A,LTD *AR1-,;,x,(,n-1,),T,x,(,n-1,),x,(,n-2,),MAC *AR2-,A,;,A+a,1,*x,(,n-1,),A,LTD *AR1,;,x,(,n,),T,x,(,n,),x,(,n-1,),MAC *AR2+0,A,;,A+a,0,*x,(,n,),A,AR2,复原,指向,a,4,STH A,y,;保存运算结果的高位字到,y,(,n,),PORTW y,(,n,),PA0,;将结果,y,(,n,)输出到端口,PA0,BD FIR2,;执行完下条指令后,从,FIR2,开始循环,PORTR PA1,*AR1+0,;输入新值,x,(,n,),AR1,复原指向,x+4,.end,(3),用线性缓冲区和带移位双操作数寻址方法实现,FIR,例,5-27,编写,y,(,n,),=a,0,*x,(,n,),+a,1,*x,(,n-1,),+a,2,*x,(,n-2,),+a,3,*x,(,n-3,),+a,4,*x,(,n-4,)的计算程序,其中,N=5,。,与前面的编程不同,本例中,系数,a,0,a,4,存放在程序存储器中,输入数据存放在数据存储器的线性缓冲区中。乘法累加利用,MACD,指令,该指令完成数据存储器单元与程序存储器单元相乘,并累加、移位的功能。,.title“FIR3.ASM”,;定义源程序名,.mmregs,;定义存储器映象寄存器,.def start,;定义语句标号,start,.bss y,1,;为结果,y,预留,1,个单元的空间,x .usect“x”,6,;在自定义的未初始化,;段“,x”,中保留,6,个单元,PA0,.set 0,;定义,PA0,为输出端口,PA1 .set 1,;定义,PA1,为输入端口,.data,COEF:.word 1*32768/10,;假定程序空间有五个参数,a4,.word -4*32768/10,;,a3,.word 3*32768/10,;,a2,.word -4*32768/10,;,a1,.word 1*32768/10,;,a0,.text,start,:,SSBX FRCT,;小数乘法,STM#x+5,AR1,;,AR1,指向,x,(,n-4,),STM#4,AR0,;设置,AR1,复位值,LD#x+1,DP,;,设置数据存储器页指针的起始位置,PORTR PA1,x+1,;输入最新值,x,(,n,),FIR3,:,RPTZ A,#4,;,累加器,A,清,0,设置重复下条指令,5,次,MACD *AR1-,COEF,A,;,x,(,n-4,),T,A=x,(,n-4,)*,a,4,+A,;,(,PAR,),+1PAR,x,(,n-4,),x,(,n-5,),STH A,*AR1,;暂存结果到,y,(,n,),PORTW *AR1+,PA0,;,输出,y,(,n,)到,PA0,,,AR1,指向,x,(,n,),BD FIR3,;执行下条指令后循环,PORTR PA1,*AR1+0,;,输入新数据到,x,(,n,),AR1,指向,x,(,n-4,),在数据存储器中开辟一个称之为滑窗的,N,个单元的缓冲区,滑窗中存放最新的,N,个输入样本;每次输入新样本时,以新样本改写滑窗中的最老的数据,而滑窗中的其它数据不作移动;利用片内,BK,(循环缓冲区长度)寄存器对滑窗进行间接寻址,循环缓冲区地址首尾相邻。,利用循环缓冲区实现,Z,-1,的优点是不需要移动数据,不存在一个机器周期中要求能一次读和一次写的数据存储器,因而可以将循环缓冲区定位在数据存储器的任何位置(线性缓冲区要求定位在,DARAM,)。,特点,3.,用循环缓冲区法实现,z,-1,的,FIR,滤波器设计,N=6,的循环缓冲区存储器图,用循环缓冲区和双操作数寻址方法实现,FIR,举例,例,5-28,编写,y,(,n,),=a,0,*x,(,n,),+a,1,*x,(,n-1,),+a,2,*x,(,n-2,),+a,3,*x,(,n-3,),+a,4,*x,(,n-4,)的计算程序,其中,N=5,。,本例中,存放,a,0,a,4,的系数表以及存放数据的循环缓冲区均设在,DARAM,中。,.title “FIR4.ASM”,;给汇编程序取名,.mmregs,;定义存储器映象寄存器,.def start,;定义标号,start,的起始位置,.bss y,1,;为未初始化变量,y,保留空间,xn .usect “xn”,5,;自定义,5,个单元空间的数据段,xn,a0 .usect “a0”,5,;自定义,5,个单元空间的数据段,a0,PA0 .set 0,;设置数据输出端口,I/O,,,PA0=0,PA1 .set 1,;设置数据输入端口,I/O,,,PA1=1,.data,table:.word 1*32768/10,;,a,0,=0.1=0 x0CCC,.word 2*32768/10,;,a,1,=0.2=0 x1999,.word 3*32768/10,;,a,2,=0.3=0 x2666,.word 4*32768/10,;,a,3,=0.4=0 x3333,.word 5*32768/10,;,a,4,=0.5=0 x4000,.text,start:SSBX FRCT,;小数乘法,STM#a0,AR1,;,AR1,指向,a0,RPT#4,;从程序存储器,table,开始的地址传送,MVPD table,*AR1+,;,5,个系数至数据空间,a0,开始的数据段,STM#xn+4,AR3,;,AR3,指向,x,(,n-4,),STM#a0+4,AR4,;,AR4,指向,a4,STM#5,BK,;设循环缓冲区长度,BK=5,STM#-1,AR0,;,AR0=-1,双操作数减量,LD#xn,DP,;,设置数据存储器页指针的起始位置,PORTR PA1,xn,;输入新数据到,x,(,n,),FIR4:RPTZ A,#4,;,A,清,0,重复执行下条指令,5,次,MAC *AR3+0%,*AR4+0%,A,;系数与输入数据双,;操作数相乘并累加,STH A,y,;保存结果的高字节到,y,(,n,),PORTW y,PA0,;输出,y,(,n,)到端口,PA0,BD FIR4,;执行完下条指令后循环,PORTR PA1,*AR3+0%,;,从端口,PA1,输入新数据到,x,(,n,),.end,4.,系数对称,FIR,滤波器设计,系数对称的,FIR,滤波器具有线性相位特性,这种滤波器是用得最多的,FIR,滤波器,特别是对相位失真要求很高的场合。,如果,FIR,滤波器的,h,(,n,)是实数,且满足偶对称,h,(,n,),=h,(,N-1-n,)或奇对称,h,(,n,),=-h,(,N-1-n,)的条件,则滤波器具有线性相位特性。,一个对称,FIR,滤波器满足,h,(,n,),=h,(,N-1-n,)。,例如,,N=8,的,FIR,滤波器,其输出方程为:,y,(,n,),=h,0,x,(,n,),+h,1,x,(,n-1,),+h,2,x,(,n-2,),+h,3,x,(,n-3,),+h,3,x,(,n-4,),+h,2,x,(,n-5,),+h,1,x,(,n-6,),+h,0,x,(,n-7,),总共有,8,次乘法和,7,次加法。如果利用对称性,可将其改写成:,y,(,n,),=h,0,x,(,n,),+x,(,n-7,),+h,1,x,(,n-1,),+x,(,n-6,),+h,2,x,(,n-2,),+x,(,n-5,),+h,3,x,(,n-3,),+x,(,n-4,),变成,4,次乘法和,7,次加法。可见乘法运算的次数少了一半。这是对称,FIR,的以一个优点。,对称,FIR,滤波器的实现可按如下步骤进行:,(1),将数据存储器分为新旧两个循环缓冲区,,New,循环缓冲区中存放,N/2=4,个新数据;,Old,循环缓冲区中存放,N/2=4,个老数据。每个循环缓冲区的长度为,N/2,。,(2),设置循环缓冲区指针,以,AR2,指向,New,循环缓冲区中最新的数据;以,AR3,指向,Old,循环缓冲区中最老的数据。,(3),在程序存储器中设置系数表。,(4),(,AR2,),+,(,AR3,),AH,(累加器,A,的高位),,AR2-1AR2,,,AR3-1AR3,。,(5),将累加器,B,清,0,,重复执行,4,次(,i=0,,,1,,,2,,,3,)下面的运算:,(,AH,)*系数,h,i,+,(,B,),B,,系数指针(,PAR,)加,1,,,(,AR2,),+,(,AR3,),AH,,,AR2,和,AR3,减。,(6),保存和输出结果(结果在,BH,中)。,(7),修正数据指针,让,AR2,和,AR3,分别指向,New,循环缓冲区最新的数据和,Old,循环缓冲区中最老的数据。,(8),用,New,循环缓冲区中最老的数据替代,Old,循环缓冲区中最老的数据。,Old,循环缓冲区指针减,1,。,(9),输入一个新数据替代,New,循环缓冲区中最老的数据。,重复执行,(4),(9),步。,在编程中要用到系数对称有限冲激响应滤波器指令,FIRS,,其操作为:,FIRS Xmem,Ymem,Pmad,该指令执行,PmadPAR,(程序存储器地址寄存器),当(,RC,),0,(,B,),+,(,A,(,32,16,),(由,PAR,寻址,Pmem,),B,(,Xmem,),+,(,Ymem,),16A,(,PAR,),+1PAR,(,RC,),-1RC,FIRS,指令在同一个机器周期内,通过,C,和,D,总线读,2,次数据存储器,同时通过,P,总线读一个系数。,例,5-29,设计对称,FIR,滤波器(,N=8,)。,.title“FIR5.ASM”,;给汇编程序取名,.mmregs,;定义存储器映象寄存器,.def start,;定义标号,start,的起始位置,.bss y,1,;为未初始化变量,y,保留空间,x_new.usect “DATA1”,4,;自定义,4,个单元的未初始化段,DTAT1,x_old.usect “DATA2”,4,;,自定义,4,个单元的未初始化段,DATA2,Size .set 4,;定义符号,size=4,PA0 .set 0,;设置数据输出端口,I/O,,,PA0=0,PA1 .set 1,;设置数据输入端口,I/O,,,PA1=1,.data,COEF.word 1*32768/10,2*32768/10,;,系数对称,只需,.word 3*32768/10,4*32768/10,;,给出,N/2=4,个系数,.text,start:LD#y,DP,;,设置数据存储器页指针的起始位置,SSBX FRCT,;小数乘法,STM#x_new,AR2,;,AR2,指向新缓冲区第,1,个单元,STM#x_old+,(,size-1,),AR3,;,AR3,指向老缓,;冲区最后,1,个单元,STM#size,BK,;,设置循环缓冲区长度,BK=size,STM#-1,AR0,;循环控制增量,AR0=-1,PORTR PA1,#x_new,;从,I/O,输入端口,PA1,;输入数据到,x,(,n,),FIR5:ADD *AR2+0%,*AR3+0%,A,;,AH=x,(,n,),+,;,x,(,n-7,)(第一次),RPTZ B,#,(,size-1,);,B=0,下条指令执行,size,次,FIRS *AR2+0%,*AR3+0%,COEF,;,B+=AH*h,0,;,AH=x,(,n-1,),+x,(,n-6,),STH B,y,;保存结果到,y,PORTW y,PA0,;输出结果到,PA0,MAR *+AR2,(,2,),%,;修正,AR2,指向新缓,;冲区最老的数据,MAR *AR3+%,;修正,AR3,指向老缓,;冲区最老的数据,MVDD *AR2,*AR3+0%,新缓冲区向老缓,;冲区传送一个数,BD FIR5,;执行完下条指令后转移,FIR5,并循环,PORTR PA1,*AR2,;输入新数据至新缓冲区,.end,IIR,滤波器设计,特 点,y,(,n,)由两部分构成:第一部分 是一个对,x,(,n,)的,M,节延时链结构,每节延时抽头后加权相加,是一个横向结构网络;第二部分 也是一个,N,节延时链的横向结构网络,不过它是对,y,(,n,)的延时,因此是个反馈网络。,若,a,i,=0,,,IIR,滤波器就变为,FIR,滤波器,其脉冲传输函数只有零点,系统总是稳定的,其单位冲激响应是有限长序列。而,IIR,滤波器的脉冲传递在,Z,平面上有极点存在,其单位冲激响应是无限长序列。,IIR,滤波器与,FIR,滤波器的一个重要区别是,,IIR,滤波器可以用较少的阶数获得很高的选择特性,所用的存储单元少,运算次数少,具有经济、高效的特点。但是,在有限精度的运算中,可能出现不稳定现象。而且,选择性越好,相位的非线性越严重,不像,FIR,滤波器可以得到严格的线性相位。因此,在相位要求不敏感的场合,如语言通信等,选用,IIR,滤波器较为合适;而对于图像信号处理、数据传输等以波形携带信息的系统,对线性相位要求较高,在条件许可的情况下,采用系数对称,FIR,滤波器较好。,2,二阶,IIR,滤波器的实现方法,3,个二阶节级联的六阶,IIR,滤波器,对于一个高阶的,IIR,滤波器,由于总可化成多个二阶基本节(或称二阶节)相级联或并联的形式,二阶节的标准形式由反馈通道和前向通道的差分方程构成:,反馈通道:,x0=w,(,n,),=x,(,n,),+A1*x1+A2*x2,前向通道:,y,(,n,),=B0*x0+B1*x1+B2*x2,二阶节,IIR,滤波器,(,1,)二阶,IIR,滤波器的单操作数指令实现法,如
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服