信息工程学通信工程系

上传人:新** 文档编号:568907087 上传时间:2024-07-27 格式:PPT 页数:122 大小:1.31MB
返回 下载 相关 举报
信息工程学通信工程系_第1页
第1页 / 共122页
信息工程学通信工程系_第2页
第2页 / 共122页
信息工程学通信工程系_第3页
第3页 / 共122页
信息工程学通信工程系_第4页
第4页 / 共122页
信息工程学通信工程系_第5页
第5页 / 共122页
点击查看更多>>
资源描述

《信息工程学通信工程系》由会员分享,可在线阅读,更多相关《信息工程学通信工程系(122页珍藏版)》请在金锄头文库上搜索。

1、信息工程学通信工程系信息工程学通信工程系DSPDSP技术及应用技术及应用DigitalSignalProcessor数字信号处理器数字信号处理器陈金鹰陈金鹰 副教授副教授1第五章第五章汇编语言编程举例汇编语言编程举例第一节汇编语言编程的基本方法第一节汇编语言编程的基本方法 第二节第二节 DSP DSP的浮点运算方法的浮点运算方法 第三节第三节 DSPDSP在信号发生器上的应用在信号发生器上的应用 第四节第四节 用用DSPDSP实现实现FIRFIR滤波器滤波器2第一节第一节汇编语言编程的基本方法汇编语言编程的基本方法 1 1堆栈的使用堆栈的使用 1.压入数据时,堆栈从高地址向低地压入数据时,堆栈

2、从高地址向低地址增长。址增长。2.压栈时指针先减,压栈时指针先减,SP-1,再压入数,再压入数据;据;3.出栈时,先弹出数据后,再出栈时,先弹出数据后,再SP+1。4.如要用堆栈,必须先设置,后使用。如要用堆栈,必须先设置,后使用。要要点点3例例5-1 设计一存储空间为设计一存储空间为100100个单元的堆栈。个单元的堆栈。size size .set 100 .set 100 ;设置堆栈空间的;设置堆栈空间的 ;大小为;大小为100100stack stack .usect .usect “STK”,size “STK”,size ;设设置置堆堆栈栈段段的的首首地地址址 ;和堆栈空间;和堆栈

3、空间 STM #stack+size,SP STM #stack+size,SP ;将栈底地址指针送;将栈底地址指针送 ; SP SP,对其初始化,对其初始化4例例5-2 编写求解加、减法的程序,计算编写求解加、减法的程序,计算z=x+y-wz=x+y-w。SUM1SUM1:LD x,A LD x,A ;将;将x x地址的内容送地址的内容送A A ADD y,AADD y,A ;将;将y y地址的内容与地址的内容与A A中中x x值相加值相加 SUB w,ASUB w,A ;将;将A A中的内容与中的内容与w w 相减,得相减,得z z STL A,z STL A,z ;将;将A A的的计算值

4、存入的的计算值存入z z 地址中地址中例例5-3 写求解直线方程的程序,计算写求解直线方程的程序,计算y=mx+by=mx+b。 SUM2SUM2:LD m,T LD m,T ;将;将m m 地址的内容送地址的内容送T T MPY x,AMPY x,A ;将;将x x 地址的内容与地址的内容与T T中的中的m m相乘,相乘, ;结果送;结果送A A ADD b,AADD b,A ;将;将A A中的中的mxmx与与b b 地址的内容相加,地址的内容相加, ;结果送;结果送A A STL A,y STL A,y ;将;将A A的的计算结果存入的的计算结果存入y y 地址中地址中 2 2 加、减法和

5、乘法运算加、减法和乘法运算 5传送速度比加载和存储指令要快;传送速度比加载和存储指令要快;传送数据不需要通过累加器;传送数据不需要通过累加器;可以寻址程序存储器;可以寻址程序存储器;与与RPTRPT指指令令相相结结合合(重重复复时时,这这些些指指令令都都变变成成单单周周期期指指令令),可可以以实实现现数据块传送。数据块传送。 3 3 数据块传送数据块传送 特特点点6(1 1)数据存储器)数据存储器数据存储器数据存储器 这类指令有:这类指令有:MVDK Smem,dmad MVDK Smem,dmad 指令的字数指令的字数/ /执行周期执行周期 2/2 2/2MVKD dmad,SmemMVKD

6、 dmad,Smem;Smem=dmad Smem=dmad 2/22/2MVDD Xmem,Ymem MVDD Xmem,Ymem ;Ymem=Xmem 1/1Ymem=Xmem 1/1(2 2)程序存储器)程序存储器数据存储器数据存储器 这类指令有:这类指令有:MVPD pmad,Smem MVPD pmad,Smem ;Smem=pmad 2/3Smem=pmad 2/3MVDP Smem,pmad MVDP Smem,pmad ;pmad=Smem 2/4pmad=Smem 2/4pmadpmad为为1616位立即数程序存储器地址;位立即数程序存储器地址;dmaddmad为为1616位

7、立即数数据存储器地址;位立即数数据存储器地址;SmemSmem为数据存储器地址;为数据存储器地址;XmemXmem、YmemYmem为为双双操操作作数数数数据据存存储储器器地地址址,XmemXmem从从DBDB数数据总线上读出。据总线上读出。YmemYmem从从CBCB数据总线上读出。数据总线上读出。7(3 3)数据存储器)数据存储器MMRMMR 这类指令有:这类指令有:MVDM dmad,MMR MVDM dmad,MMR ;指令的字数;指令的字数/ /执行周期执行周期 2/2 2/2MVMD MMR,dmad MVMD MMR,dmad ;dmad=MMR 2/2dmad=MMR 2/2M

8、VMM mmrx,mmry MVMM mmrx,mmry ;mmry=mmrx 1/1mmry=mmrx 1/1(4 4)程序存储器()程序存储器(AccAcc)数据存储器数据存储器 包括:包括:READA Smem READA Smem ;Smem=prog(A) 1/5Smem=prog(A) 1/5WRITA Smem WRITA Smem ;prog(A)= Smem 1/5prog(A)= Smem 1/5 mmrx,mmry mmrx,mmry为为AR0AR0AR7AR7或或SPSP; MMR MMR为任何一个存储器映象寄存器;为任何一个存储器映象寄存器;8例例5-6 将数组将数组

9、x5 x5 初始化为初始化为1,2,3,4,51,2,3,4,5。.data .data ;定义初始化数据段起始地址;定义初始化数据段起始地址TBL: .word 1,2,3,4,5 TBL: .word 1,2,3,4,5 ;为标号地址;为标号地址TBLTBL ;开始的;开始的5 5个单元赋初值个单元赋初值 .sect .sect “.vectors” “.vectors” ;定定义义自自定定义义段段,并并获获 ;得该段起始地址;得该段起始地址 B START B START;无条件转移到标号为;无条件转移到标号为STARTSTART的地址的地址 .bss x,5 .bss x,5 ;为数组

10、;为数组x x分配分配5 5个存储单元个存储单元 .text .text ;定义代码段起始地址;定义代码段起始地址START:STM #x,AR5 START:STM #x,AR5 ;将;将x x的首地址存入的首地址存入AR5AR5 RPT #4 RPT #4 ;设置重复执行;设置重复执行5 5次下条指令次下条指令 MVPD TBL,*AR5+MVPD TBL,*AR5+ ;将;将TBLTBL开始的开始的5 5个值传给个值传给x x(1 1)程序存储器)程序存储器数据存储器数据存储器9例例5-7 将数据存储器中的数组将数据存储器中的数组x10x10复制到数组复制到数组y10y10。 .titl

11、e “cjy1.asm” .title “cjy1.asm” ;为汇编源程序取名;为汇编源程序取名 .mmregs .mmregs ;定义存储器映象寄存器;定义存储器映象寄存器STACK .usect “STACK”,30HSTACK .usect “STACK”,30H;设置堆栈;设置堆栈 .bss x,10 .bss x,10 ;为数组;为数组x x分配分配1010个存储单元个存储单元 .bss y,10 .bss y,10 ;为数组;为数组y y分配分配1010个存储单元个存储单元 .data .datatable:.word 1,2,3,4,5,6,7,8,9,10table:.wor

12、d 1,2,3,4,5,6,7,8,9,10 .def start .def start ;定义标号;定义标号startstart .text .text(2 2)数据存储器)数据存储器数据存储器数据存储器10start:STM #0,SWWSR start:STM #0,SWWSR ;复位;复位SWWSRSWWSR STM #STACK+30H,SP STM #STACK+30H,SP;初始化堆指针;初始化堆指针 STM #x,AR1 STM #x,AR1 ;将目的地首地址赋给;将目的地首地址赋给AR1AR1 RPT #19 RPT #19 ;设定重复传送的次数为;设定重复传送的次数为202

13、0次次 MVPD table,*AR1+MVPD table,*AR1+ ;程序存储器传送到数;程序存储器传送到数 ;据存储器;据存储器 STM #x,AR2 STM #x,AR2 ;将;将x x的首地址存入的首地址存入AR2AR2 STM #y,AR3 STM #y,AR3 ;将;将y y的首地址存入的首地址存入AR3AR3 RPT #19 RPT #19 ;设置重复执行;设置重复执行2020次下条指令次下条指令 MVDD *AR2+,*AR3+MVDD *AR2+,*AR3+;将地址;将地址x x开始的开始的2020个值个值 ;复制到地址;复制到地址y y开始的开始的2020个单元个单元e

14、nd: B endend: B end .end .end11用用间接接寻址址方方式式获得得操操作作数数,且且辅助寄存器只用助寄存器只用AR2AR2AR5AR5;占用程序空占用程序空间小;小;运行速度快。运行速度快。 4 4双操作数乘法双操作数乘法 特特点点例例5-8 编制求解编制求解 的程序。的程序。利利用用双双操操作作数数指指令令可可以以节节省省机机器器周周期期。迭迭代代次次数数越越多多,节节省省的的机机器器周周期期数数也也越越多多。本本例例中中,在在每每次次循循环环中中,双双操操作作数数指指令令都都比比单单操操作作数数指指令令少少用用一一个个周期,节省的总机器周期数周期,节省的总机器周期

15、数=1T*N=1T*N(迭代次数)(迭代次数)=NT=NT。12 单操作数指令方案单操作数指令方案 双操作数指令方案双操作数指令方案 LD #0,B LD #0,B LD #0,B LD #0,B STM #a,AR2 STM #a,AR2 STM #a,AR2 STM #a,AR2 STM #x,AR3 STM #x,AR3 STM #x,AR3 STM #x,AR3STM #19,BRC STM #19,BRC STM #19,BRC STM #19,BRC RPTB done-1 RPTB done-1 RPTB done-1 RPTB done-1 LDLD *AR2+,T *AR2+

16、,T;1T 1T MPY *AR2+,*AR3+,AMPY *AR2+,*AR3+,A;1T1T MPYMPY *AR3+,A *AR3+,A;1T1T ADD A,B ADD A,B ;1T1T ADD A,B ADD A,B ;1T1Tdone:STH B,y done:STH B,ydone:STH B,y done:STH B,y STL B,y+1 STL B,y+1 STL B,y+1STL B,y+113在在单个个周周期期内内同同时利利用用C C总线和和D D总线,得到,得到3232位操作数。位操作数。 5 5长字运算长字运算 特特点点使使用用长长操操作作数数指指令令时时,按按指

17、指令令中中给给出出的的地地址址存存取取的的总总是高是高1616位操作数。这样,有两种数据排列方法:位操作数。这样,有两种数据排列方法:(1 1)偶偶地地址址排排列列法法 指指令令中中给给出出的的地地址址为为偶偶地地址址,存存储器中低地址存放高储器中低地址存放高1616位操作数。位操作数。如:如: DLD *AR3+,A DLD *AR3+,A执行前:执行前:A=00 0000 0000 A=00 0000 0000 执行后:执行后:A=00 6CAC BD90A=00 6CAC BD90 AR3=0100 AR3=0102 AR3=0100 AR3=0102 (0100h0100h)=6CAC

18、=6CAC(高字)(高字) (0100h0100h)=6CAC=6CAC (0101h0101h)=BD90=BD90(低字)(低字) (0101h0101h)=BD90=BD9014(2 2)奇奇地地址址排排列列法法 指指令令中中给给出出的的地地址址为为奇奇地地址址,存存储储器器中中低低地址存放低地址存放低1616位操作数。位操作数。如:如: DLD *AR3+,A DLD *AR3+,A执行前:执行前:A=00 0000 0000 A=00 0000 0000 执行后:执行后:A=00 BD90 6CACA=00 BD90 6CAC AR3=0101 AR3=0103 AR3=0101 A

19、R3=0103 (0100h0100h)=6CAC=6CAC(低字)(低字) (0100h0100h)=6CAC=6CAC (0101h0101h)=BD90=BD90(高字)(高字) (0101h0101h)=BD90=BD90推推荐荐采采用用偶偶地地址址排排列列法法,将将高高1616位位操操作作数数放放在在偶偶地地址址存存储储单单元元中。如:中。如: 程序存储器程序存储器 .long 12345678 h .long 12345678 h ;偶地址:;偶地址:12341234 ;奇地址:;奇地址:56785678 数据存储器数据存储器 .bss xhi, 2, 1, 1 .bss xhi,

20、 2, 1, 1 ;偶地址:;偶地址:xhi xhi ;奇地址:;奇地址:xloxlo 变量名称变量名称 字长字长 页邻接页邻接 偶地址排列法偶地址排列法 15例例5-9 计算计算Z Z3232=X=X3232+Y+Y3232。标准运算标准运算 长字运算长字运算 LD xhi,16,A DLD xhi,A LD xhi,16,A DLD xhi,A ADDS xlo,AADDS xlo,A DADD yhi,ADADD yhi,A ADD yhi,16,AADD yhi,16,A DST A,zhi DST A,zhi ADDS ylo,AADDS ylo,A (3 3个字,个字,3 3个个T

21、 T) STH A,Zhi STH A,Zhi STL A,Zlo STL A,Zlo(6 6个字,个字,6 6个个T T)16(1)(1)并并行行运运算算指指同同时利利用用D D总线和和E E总线。其其中中,D D总线用用来来执行行加加载或或算算术运运算算,E E总线用来存放先前的用来存放先前的结果。果。(2)(2)并行指令都是单字单周期指令。并行指令都是单字单周期指令。(3)(3)并并行行运运算算时时所所存存储储的的是是前前面面的的运运算算结结果,存储之后再进行加载或算术运算。果,存储之后再进行加载或算术运算。(4)(4)并行指令都工作在累加器的高位。并行指令都工作在累加器的高位。(5)(

22、5)大大多多数数并并行行运运算算指指令令都都受受累累加加器器移移位位方式方式ASMASM位影响。位影响。 6 6并行运算并行运算 特特点点17表表5-1 5-1 并行指令举例并行指令举例指指 令令指指 令令举举 例例操作说明操作说明并行加载和乘法指令并行加载和乘法指令LDMACRLDMACRLDMASRLDMASRLD Xmem,dstLD Xmem,dstMACR Ymem,dstMACR Ymem,dstdst=Xmem16dst=XmemYmem=src(16-16-ASMASM)dst=Xmem16dst=XmemYmem=src(16-16-ASMASM)dst=dst+T*Xmem

23、dst=dst+T*Xmem并行存储和加并行存储和加/ /减法减法指令指令STADDSTADDSTSUBSTSUBST src, YmemST src, YmemADD Xmem, dstADD Xmem, dstYmem=srcYmem=src(16-16-ASMASM)dst=dst+Xmemdst=dst+Xmem18例例5-10 编写计算编写计算z=x+yz=x+y和和f=d+ef=d+e的程序段。的程序段。在在此此程程序序段段中中用用到到了了并并行行存存储储/ /加加载载指指令令,即即在在同同一一机机器器周周期期内内利利用用E E总总线线存存储储和和D D总总线线加加载载。 数据存储

24、器分配如图数据存储器分配如图5-45-4所示。所示。 .title “cjy3.asm” .title “cjy3.asm” .mmregs .mmregsSTACK .usect “STACK”,10HSTACK .usect “STACK”,10H .bss x,3 .bss x,3 ;为第一组变量;为第一组变量 ;分配;分配3 3个存储单元个存储单元 .bss d,3 .bss d,3 ;为第二组变量;为第二组变量 ;分配;分配3 3个存储单元个存储单元 .def start .def start .data .datatable: .word 0123H,1027H,0,1020H,0

25、345H,0table: .word 0123H,1027H,0,1020H,0345H,019 .text .text start:STM #0,SWWSR start:STM #0,SWWSR STM #STACK+10H,SP STM #STACK+10H,SP STM #x,AR1 STM #x,AR1 RPT #5 RPT #5 MVPD table,*AR1+ MVPD table,*AR1+ STM #x,AR5 STM #x,AR5 ;将第一组变量的首地址传给;将第一组变量的首地址传给AR5 AR5 STM #d,AR2 STM #d,AR2 ;将第二组变量的首地址传给;将第二

26、组变量的首地址传给AR2AR2 LD #0,ASM LD #0,ASM ;设置;设置ASM=0 ASM=0 LD *AR5+,16,A LD *AR5+,16,A ;将;将x x的值左移的值左移1616位放入位放入A A的高端字的高端字 ADD *AR5+,16,A ADD *AR5+,16,A ;将;将y y值左移值左移1616位与位与A A的高端字的高端字x x相加相加 ST A,*AR5ST A,*AR5 ;将;将A A中的和值右移中的和值右移1616位存入位存入z z中中 LD *AR2+,BLD *AR2+,B ;将;将d d的值左移的值左移1616位放入位放入B B的高端字的高端字

27、 ADD *AR2+,16,B ADD *AR2+,16,B ;将;将e e值左移值左移1616位与位与B B的高端字的高端字d d相加相加 STH B,*AR2 STH B,*AR2 ;将;将B B的高端字中的和值存入的高端字中的和值存入f f中中end: B endend: B end .end .end20 7 76464位加法和减法运算位加法和减法运算 例例5-11 编写计算编写计算Z Z6464=W=W6464+X+X6464-Y-Y6464的程序段。的程序段。这这里里的的W W、X X、Y Y和和结结果果Z Z都都是是6464位位数数,它它们们都都由由两两个个3232位位的的长字组

28、成。利用长字指令可以完成长字组成。利用长字指令可以完成6464位数的加位数的加/ /减法。减法。 w w3 3 w w2 2 w w1 1 w w0 0 (W W6464)+ x+ x3 3 x x2 2 C x C x1 1 x x0 0 (X X6464) 低低3232位相加产生进位位相加产生进位C C- - y y3 3 y y2 2 C C y y1 1 y y0 0 (Y Y6464) 低低3232位位相相减减产产生生借借位位CC_ z z3 3 z z2 2 z z1 1 z z0 0 (Z Z6464)21DLD w1,A DLD w1,A ;A=wA=w1 1w w0 0DAD

29、D x1,A DADD x1,A ;A=wA=w1 1w w0 0+x+x1 1x x0 0, , 产生进位产生进位C CDLD w3,B DLD w3,B ;B=wB=w3 3w w2 2ADDC x2,B ADDC x2,B ;B=wB=w3 3w w2 2+x+x2 2+C+CADD x3,16,B ADD x3,16,B ;B=wB=w3 3w w2 2+x+x3 3x x2 2+C+CDSUB y1,A DSUB y1,A ;A=wA=w1 1w w0 0+x+x1 1x x0 0-y-y1 1y y0 0, , 产生借位产生借位CCDST A,z1 DST A,z1 ;z z1 1

30、z z0 0=w=w1 1w w0 0+x+x1 1x x0 0-y-y1 1y y0 0SUBB y2,B SUBB y2,B ;B=wB=w3 3w w2 2+x+x3 3x x2 2+C-y+C-y2 2-C-CSUB y3,16,B SUB y3,16,B ;B=wB=w3 3w w2 2+x+x3 3x x2 2+C-y+C-y3 3y y2 2-C-CDST B,z3 DST B,z3 ;z z3 3z z2 2=w=w3 3w w2 2+x+x3 3x x2 2+C-y+C-y3 3y y2 2-C-C由于没有长字带进(借)位加由于没有长字带进(借)位加/ /减法指令,所以上述程

31、序减法指令,所以上述程序中只能用中只能用1616位带进(借)位指令位带进(借)位指令ADDCADDC和和SUBBSUBB。22 8. 32 8. 32位乘法运算位乘法运算 x1 x0 S U x1 x0 S U y1 y0 S U y1 y0 S U_ _ _ x0 * y0 U * U x0 * y0 U * U y1 * x0 S * U y1 * x0 S * Ux1 * y0 S * Ux1 * y0 S * Uy1 * x1 S * Sy1 * x1 S * S_ _ _w3 w2 w1 w0 S U U Uw3 w2 w1 w0 S U U U例例5-12 编写计算编写计算W W6

32、464=X=X3232*Y*Y3232的程序段。的程序段。3232位乘法算式如下:位乘法算式如下:图图5-55-523 其其中中,S S为为带带符符号号数数,U U为为无无符符号号数数。数数据据存存储储器器分分配配如如图图5-55-5所所示示。在在3232位位乘乘法法运运算算中中,实实际际上上包包括括了了三三种种乘乘法法运运算算:U*UU*U、S*US*U和和S*SS*S。一一般般的的乘乘法法运运算算指指令令都都是是两两个个带带符符号号数数相相乘乘,即即S*SS*S。 所以,在编程时,要用到以下三条乘法指令:所以,在编程时,要用到以下三条乘法指令: MACSU Xmem,Ymem,src MA

33、CSU Xmem,Ymem,src ;无符号数与带符号数相乘并累加;无符号数与带符号数相乘并累加 ;src=Usrc=U(XmemXmem)* S* S(YmemYmem)+src+src MPYU Smem,dst MPYU Smem,dst ;无符号数相乘;无符号数相乘 ;dst=Udst=U()()* U* U(SmemSmem) MAC Xmem,Ymem,src MAC Xmem,Ymem,src ;两个符号数数相乘并累加;两个符号数数相乘并累加 ;src=Ssrc=S(XmemXmem)* S* S(YmemYmem)+src+src3232位乘法的程序段如下:位乘法的程序段如下:

34、24 STM #x0,AR2 STM #x0,AR2 ;将;将x x的首地址放入的首地址放入AR2 AR2 STM #y0,AR3 STM #y0,AR3 ;将;将y y的首地址存入的首地址存入AR3AR3 LD *AR2,T LD *AR2,T ;T=x0T=x0 MPYU *AR3+,AMPYU *AR3+,A ;A=ux0*uy0A=ux0*uy0 STL A,w0 STL A,w0 ;w0=ux0*uy0w0=ux0*uy0 LD A,-16,A LD A,-16,A ;A=A16A=A16 MACSU *AR2+,*AR3-,AMACSU *AR2+,*AR3-,A ;A+=y1*u

35、x0A+=y1*ux0 MACSU *AR3+,*AR2,AMACSU *AR3+,*AR2,A ;A+=x1*uy0A+=x1*uy0 STL A,w1 STL A,w1 ;w1=Aw1=A LD A,-16,A LD A,-16,A ;A=A16A=A16 MAC *AR2,*AR3,AMAC *AR2,*AR3,A ;A+=x1*y1A+=x1*y1 STL A,w2 STL A,w2 ;w2=Aw2=A的低的低1616位位 STH A,W3 STH A,W3 ;w3=Aw3=A的高的高1616位位25 9 9小数运算小数运算 整数运算的问题整数运算的问题(1 1)两两个个1616位位整

36、整数数相相乘乘,乘乘积积总总是是“向向左左增增长长”。这这意意味味着着多多次次相相乘乘后后,乘乘积积将将会会很很快快超超出出定点器件的数据范围。定点器件的数据范围。(2 2)保保存存3232位位乘乘积积到到存存储储器器,要要开开销销2 2个个机机器周期以及器周期以及2 2个字的存储器单元。个字的存储器单元。(3 3)由由于于乘乘法法器器都都是是1616位位相相乘乘,因因此此很很难难在在后后续续的的递递推推运运算算中中,将将3232位位乘乘积积作作为为乘乘法法器器的的输输入。入。小数运算的优点小数运算的优点(1 1)乘乘积积总总是是“向向右右增增长长”。这这就就味味着着超超出出定点器件数据范围的

37、将是不太感兴趣的部分。定点器件数据范围的将是不太感兴趣的部分。(2 2)既既可可以以存存储储3232位位乘乘积积,也也可可以以存存储储高高1616位乘积,这就允许用较少的资源保存结果。位乘积,这就允许用较少的资源保存结果。(3 3)可以用于递推运算。)可以用于递推运算。小数小数运算运算与整与整数运数运算的算的比较比较26C54xC54x采采用用2 2的的补补码码表表示示小小数数,其其最最高高位位为为符符号号位位,数数值值范范围围从从-1-11 1。一一个个1616位位2 2的的补补码码小小数数(Q15Q15格格式式)的的每每一一位位的的权权值值为:为: MSB MSB(最高位)(最高位) LS

38、B LSB(最低位)(最低位) -1. 1/2 1/4 1/8 2 -1. 1/2 1/4 1/8 2-15-15一一个个十十进进制制小小数数乘乘以以3276832768之之后后再再将将其其十十进进制制整整数数部部分分转转换换成十六进制数,就能得到这个十进制小数的成十六进制数,就能得到这个十进制小数的2 2的补码表示了。的补码表示了。11 7FFFh 7FFFh0.50.5正数:乘以正数:乘以32768 32768 4000h 4000h0 0 0000h 0000h-0.5 -0.5 负数:其绝对值部分乘以负数:其绝对值部分乘以3276832768,再取反加,再取反加1 C000h1 C00

39、0h-1 -1 8000h 8000h(1 1)小数的表示方法)小数的表示方法27在汇编语言中,是不能直接写入十进制在汇编语言中,是不能直接写入十进制小数的,可写为整数运算式。小数的,可写为整数运算式。如果要定义一个系数如果要定义一个系数0.7070.707,可以写成:,可以写成:.word 32768*707/1000.word 32768*707/1000不能写成不能写成32768*0.70732768*0.707。注意注意Q Q格式表示法格式表示法 在在Q Q格式中,格式中,Q Q之后的数字(如之后的数字(如Q15Q15格式中的格式中的1515)决)决定小数点右边有多少位二进制位,故定小

40、数点右边有多少位二进制位,故Q15Q15表示在小数表示在小数点后有点后有1515位小数。当用一个位小数。当用一个1616位的字来表示位的字来表示Q15Q15格式格式时,在时,在MSBMSB(最高位)的右边有一个小数点,而(最高位)的右边有一个小数点,而MSBMSB表表示符号位。所以示符号位。所以Q15Q15的表示数字可表示范围从的表示数字可表示范围从+1+1(以(以+0.999997+0.999997表示)到表示)到-1-1的值。的值。28通通过过合合适适的的Q Q格格式式,可可以以把把数数值值根根据据所所需需的的精精确确度度做做适适当当地地转转换换,以以便便定定点点数数的的DSPDSP也也可

41、可以以处处理理高高精精度度的的浮点数。下面以浮点数。下面以Q15Q15为例,说明转换的过程。为例,说明转换的过程。1 1)先先确确定定准准备备转转换换的的十十进进制制数数值值N N,是是在在Q15Q15格格式式的数值范围之间,即的数值范围之间,即-1.000000N+0.999997-1.000000N+0.999997。2 2)数值)数值N N乘以乘以2 21515,即,即N=N2N=N21515=N32768=N327683 3)把把步步骤骤2 2)的的结结果果加加2 21616,即即N=N+2N=N+21616=N+65536=N+65536。4 4)步步骤骤3 3)的的结结果果转转换换

42、成成十十六六进进制制,并并把把第第1717位位舍舍弃掉,得到的结果就是弃掉,得到的结果就是N N的的Q15Q15转换值。转换值。29下下面面通通过过把把-0.2345-0.2345及及+0.2345+0.2345转转换换成成Q15Q15格格式式来来说说明明转换方法。转换方法。-0.2345-0.2345的转换为:的转换为:-0.234532768=-7684.1-7684-0.234532768=-7684.1-7684-7684+65536=57852-7684+65536=578525785257852转转换换成成十十六六进进制制数数值值为为0E1FCh0E1FCh,所所以以结结果果为为E

43、1FChE1FCh。+0.2345+0.2345的转换为:的转换为:0.234532768=7684.176840.234532768=7684.176847684+65536=733207684+65536=733207332073320转换成十六进制数值为转换成十六进制数值为11E04h11E04h,并把第,并把第1717位舍位舍弃掉,结果为弃掉,结果为1E04h1E04h。30以字长为以字长为4 4位和位和8 8位累加器为例,先看一个小数乘法的例子。位累加器为例,先看一个小数乘法的例子。 0 1 0 0 0 1 0 0(0.520.523 30.5=0.5=(4 4)1010= =(01

44、000100)2 2) 1 1 0 1 1 1 0 1(-0.3752-0.37523 3(-0.375-0.375)= =(-3-3)1010 0 1 0 00 1 0 0 = =(11011101)补补)0 0 0 00 0 0 0 0 1 0 0 0 1 0 01 1 0 0 1 1 0 0 (-0100-0100)1 1 1 0 1 0 0 1 1 1 0 1 0 0 (-0.1875=-12/2-0.1875=-12/26 6-12=-12=(11101001110100)补补)(2 2)小数乘法与冗余符号位)小数乘法与冗余符号位31上上述述乘乘积积是是7 7位位,当当将将其其送送到

45、到8 8位位累累加加器器时时,为为保保持持乘乘积积的的符符号号,必必须须进进行行符符号号位位扩扩展展,这这样样,累累加加器器中中的的值值为为1111010011110100(-0.09375=-12/2-0.09375=-12/27 7),出出现现了了冗冗余符号位。原因是:余符号位。原因是: S x x x S x x x (Q3Q3) S y y y S y y y (Q3Q3)S S z z z z z z S S z z z z z z (Q6Q6格式)格式)即即两两个个带带符符号号数数相相乘乘,得得到到的的乘乘积积带带有有2 2个个符符号号位位,造成错误的结果。造成错误的结果。同同样样

46、,对对于于两两个个十十六六位位数数相相乘乘,乘乘积积只只有有3030位位,在最高的两位也是符号位,同样会造成错误的结果。在最高的两位也是符号位,同样会造成错误的结果。32解解决决冗冗余余符符号号的的办办法法是是:在在程程序序中中设设定定状状态态寄寄存存器器ST1ST1中中的的FRCTFRCT(小小数数方方式式)位位1 1,在在乘乘法法器器将将结结果果传传送送至至累累加加器器时时就就能能自自动动地地左左移移1 1位位,累累加加器器中中的的结结果果为为: zzzzzz0zzzzzz0( Q7Q7格格 式式 ) , 即即 1110100011101000( -0.1875=-0.1875=-24/2

47、24/27 7-24=-24=(1110100011101000)补补),自自动动地地消消去去了了两两个个带带符符号号数数相相乘乘时时产产生生的的冗冗余余符符号号位位。所所以以在在小小数数乘乘法法编编程时,应当事先设置程时,应当事先设置FRCTFRCT位:位:SSBX FRCTSSBX FRCT MPY *AR2,*AR3,AMPY *AR2,*AR3,ASTH A,ZSTH A,Z这样,这样,C54xC54x就完成了就完成了Q15*Q15=Q15Q15*Q15=Q15的小数乘法。的小数乘法。33例例5-13 编编制制计计算算 的的程程序序段段,其其中中数数据据均均为为小数:小数:a a1 1

48、=0.1,a=0.1,a2 2=0.2,a=0.2,a3 3=-0.3,a=-0.3,a4 4=0.4,x=0.4,x1 1=0.8,=0.8,x x2 2=0.6,x=0.6,x3 3=-0.4,x=-0.4,x4 4=-0.2=-0.2。 .title “cjy4.asm” .title “cjy4.asm” .mmregs .mmregsSTACK .usect “STACK”,10HSTACK .usect “STACK”,10H .bss a,4 .bss a,4 ;为;为a a分配分配4 4个存储单元个存储单元 .bss x,4 .bss x,4 ;为;为x x分配分配4 4个存储

49、单元个存储单元 .bss y,1 .bss y,1 ;为结果;为结果y y分配分配1 1个存储单元个存储单元 .def start .def start .data .data ;定义数据代码段;定义数据代码段34table: .word 1*32768/10 table: .word 1*32768/10 ;在;在tabletable开始的开始的8 8个个.word 2*32768/10 .word 2*32768/10 ;地址放数据;地址放数据 .word -3*32768/10 .word -3*32768/10.word 4*32768/10.word 4*32768/10.word

50、8*32768/10.word 8*32768/10.word 6*32768/10.word 6*32768/10.word -4*32768/10.word -4*32768/10.word -2*32768/10.word -2*32768/1035.text .text ;定义可执行程序代码段;定义可执行程序代码段start:SSBX FRCTstart:SSBX FRCT ;设置;设置FRCTFRCT位,表示进行小数乘位,表示进行小数乘 STM #x,AR1 STM #x,AR1 ;将;将x x的首地址传给的首地址传给AR1AR1 RPT #7 RPT #7 ;重复;重复8 8次下条

51、指令次下条指令 MVPD table,*AR1+ MVPD table,*AR1+ ;将程序空间;将程序空间8 8个数传给数据存储器个数传给数据存储器 STM #x,AR2 STM #x,AR2 ;将数据存储器第一个数;将数据存储器第一个数x x1 1的地址传给的地址传给AR2AR2 STM #a,AR3 STM #a,AR3 ;将数据存储器第五个数;将数据存储器第五个数a a1 1的地址传给的地址传给AR3AR3 RPTZ A,#3 RPTZ A,#3 ;将;将A A清零,重复清零,重复4 4次下条指令次下条指令 MAC *AR2+,*AR3+,A MAC *AR2+,*AR3+,A ;执行

52、乘法累加和,结果放在;执行乘法累加和,结果放在A A中中 STH A,y STH A,y ;将;将A A的高端字存入结果的高端字存入结果y y,低端字省去,低端字省去end: B end end: B end ;原处循环等待;原处循环等待 .end .end 结结果果y=0x1EB7y=0x1EB7。转转换换为为十十进进制制数数:y=y=(1161163 3+1416+14162 2+1116+11161 1+716+7160 0)/32768=0.24/32768=0.2436 10 10 除法运算除法运算 条件减法指令的功能如下:条件减法指令的功能如下:SUBC SUBC SmemSmem

53、,src src ;(srcsrc)- -(SmemSmem)15 15 ALUALU;输出端,如果;输出端,如果ALUALU输出端输出端0,0, ;则则(ALUALU输输出出端端)1+1src1+1src,;否则(;否则(srcsrc)1src1src。方法:减法指令加重复指令实现无符号运算方法:减法指令加重复指令实现无符号运算(1 1)当被除数除数)当被除数除数 此时商为小数。此时商为小数。37例例5-14 编写编写0.40.4(-0.8-0.8)的程序段。)的程序段。.title “cjy5.asm”.title “cjy5.asm”.mmregs.mmregsSTACK .usect

54、“STACK”,10HSTACK .usect “STACK”,10H.bss num,1 .bss num,1 ;为分子分配单元;为分子分配单元.bss den,1 .bss den,1 ;为分母分配单元;为分母分配单元.bss quot,1 .bss quot,1 ;为商分配单元;为商分配单元.data .data ;定义数据段起始地址;定义数据段起始地址table:.word 4*32768/10 table:.word 4*32768/10 ;在以;在以tabletable为地址的为地址的;单元放入;单元放入 0.4 0.4.word -8*32768/10 .word -8*3276

55、8/10 ;在以;在以tabletable为地址的为地址的;下一单元放入;下一单元放入-0.8-0.8.def start.def start38 .text .text ;定义数据段起始地址;定义数据段起始地址start: STM #num,AR1 start: STM #num,AR1 ;将分子所在单元的地址传给;将分子所在单元的地址传给AR1AR1 RPT #1 RPT #1 ;重复执行下一指令;重复执行下一指令2 2次次 MVPD table,*AR1+ MVPD table,*AR1+;传送程序空间的;传送程序空间的2 2个数据(分子、个数据(分子、 ;分母)至地址为;分母)至地址为

56、numnum开始的数据存储器单元开始的数据存储器单元 LD den,16,A LD den,16,A ;将分母移到累加器;将分母移到累加器A A(31311616) MPYA num MPYA num ;(;(numnum)* *( A A(31311616)BB, ;获取商的符号(在累加器;获取商的符号(在累加器B B中)中) ABS A ABS A ;分母取绝对值;分母取绝对值 STH A,den STH A,den ;分母绝对值存回原处;分母绝对值存回原处 LD num,16,A LD num,16,A ;分子加载到;分子加载到A A(31311616) ABS A ABS A ;分子取

57、绝对值;分子取绝对值 RPT #14 RPT #14 ;1515次减法循环,完成除法次减法循环,完成除法 SUBC den,A SUBC den,A ; XC XC 1,BLT 1,BLT ;如如果果B0B0(商商是是负负数数),则则需需要要变变号号 NEG A NEG A ;如果;如果B0B0执行求反,否则跳过此指令执行求反,否则跳过此指令 STL A,quot STL A,quot ;保存商;保存商end: B endend: B end .end .end39a a)被除数除数商为小数)被除数除数商为小数 b b被除数被除数除数商为整数除数商为整数40 10 10 除法运算除法运算 (2

58、 2)当被除数)当被除数除数除数时 商商为整数。整数。 例例5-15编写编写1638451216384512的程序段。的程序段。将将上上例例程程序序段段仅仅作作两两处处修修改改,其其它它不不变变,就就得得本本例的程序段:例的程序段:LD num,16,A LD num,16,A 改成改成 LD num,A LD num,ARPT #14 RPT #14 改成改成 RPT #15 RPT #15本例的程序段为:本例的程序段为: .title “cjy6.asm” .title “cjy6.asm” .mmregs .mmregsSTACK .usect “STACK”,10HSTACK .use

59、ct “STACK”,10H41 .bss num,1 .bss num,1 ;为分子分配单元;为分子分配单元 .bss den,1 .bss den,1 ;为分母分配单元;为分母分配单元 .bss quot,1 .bss quot,1 ;为商分配单元;为商分配单元 .data .data ;定义数据段起始地址;定义数据段起始地址table: .word 66*32768/100 table: .word 66*32768/100 ;在以;在以tabletable为地址为地址 ;的单元放入;的单元放入1638416384 .word -33*32768/100 .word -33*32768/

60、100 ;在以;在以tabletable为地址为地址 ;的下一单元放入;的下一单元放入512512 .def start .def start .text .text ;定义数据段起始地址;定义数据段起始地址start: STM #num,AR1start: STM #num,AR1;将分子所在单元地址传给;将分子所在单元地址传给AR1AR1 RPT #1 RPT #1 ;重复执行下一指令;重复执行下一指令2 2次次 MVPD table,*AR1+ MVPD table,*AR1+;传送程序空间的;传送程序空间的2 2 ;数据(分子、分母)至数据(分子、分母)至地址地址为 ; num num

61、开始的数据存开始的数据存储器器单元元 42 LD den,16,A LD den,16,A ;将分母移到累加器;将分母移到累加器A A(31311616) MPYA num MPYA num ;(;(numnum)* *( A A(31311616)BB, ;获取商的符号(在累加器;获取商的符号(在累加器B B中)中) ABS A ABS A ;分母取绝对值;分母取绝对值 STH A,den STH A,den ;分母绝对值存回原处;分母绝对值存回原处 LD num,A LD num,A ;分子加载到;分子加载到A A(15150 0) ABS A ABS A ;分子取绝对值;分子取绝对值 R

62、PT #15 RPT #15 ;1616次减法循环,完成除法次减法循环,完成除法 SUBC den,A SUBC den,A ; XC 1,BLT XC 1,BLT ;如果;如果B0B0(商是负数),则需要变号(商是负数),则需要变号 NEG A NEG A ;如果;如果B0B VECS PAGE 0 .vectors: VECS PAGE 0 .text: EPROM PAGE 0 .text: EPROM PAGE 0 .data: EPROM PAGE 0 .data: EPROM PAGE 0 .bss: SPRAM PAGE 1 .bss: SPRAM PAGE 1 .XN: DAR

63、AM align(8) PAGE 1 .XN: DARAM align(8) PAGE 1 .A0: .A0: DARAM DARAM align(8) align(8) PAGE PAGE 1 1 80(2)(2)用用线性性缓冲区和冲区和间接接寻址方法址方法实现FIRFIR例例5-26编写编写y(n)=a0*x(n)+a1*x(n-1)+a2*x(n-2)+a3*x(n-3)+a4*x(n-4)的计算程序,)的计算程序,其中其中N=5。将系数将系数a a0 0a a4 4存放在数据存储器中,并设置线性缓存放在数据存储器中,并设置线性缓冲区存放输入数据。利用冲区存放输入数据。利用AR1AR1和

64、和AR2AR2分别作为间接寻址分别作为间接寻址线性缓冲区和系数区的辅助寄存器。线性缓冲区和系数区的辅助寄存器。81 .title “FIR2.ASM” .title “FIR2.ASM” ;定义源程序名;定义源程序名 .mmregs .mmregs ;定义存储器映象寄存器;定义存储器映象寄存器 .def start .def start ;定义语句标号;定义语句标号startstart .bss y,1 .bss y,1 ;为结果;为结果y y预留预留1 1个单元的空间个单元的空间x x .usect .usect “x”,5 “x”,5 ;在在自自定定义义的的未未初初始始化化段段“x”“x”

65、中中保保留留5 5个个单单元元的空间的空间a a .usect .usect “a”,5 “a”,5 ;在在自自定定义义的的未未初初始始化化段段“a”“a”中中保保留留5 5个个单单元元的空间的空间PA0 .set 0 PA0 .set 0 ;定义;定义PA0PA0为输出端口为输出端口PA1 .set 1 PA1 .set 1 ;定义;定义PA1PA1为输入端口为输入端口 .data .datatable: .word 2*32768/10 table: .word 2*32768/10 ;假定程序空间有五个参数;假定程序空间有五个参数 .word -3*32768/10 .word -3*3

66、2768/10 .word 4*32768/10 .word 4*32768/10 .word -3*32768/10 .word -3*32768/10 .word 2*32768/10 .word 2*32768/1082 .textstart:STM#a,AR2;将数据空间用于放参数;将数据空间用于放参数;的首地址送;的首地址送AR2RPT#4;重复下条指令;重复下条指令5次传送次传送MVPDtable,*AR2+;传送程序空间的参数到数据空间传送程序空间的参数到数据空间STM#x+4,AR1;AR1指向指向x(n-4)STM#a+4,AR2;AR2指向指向a4STM#4,AR0;指针复

67、位值;指针复位值4AR0SSBXFRCT;小数相乘;小数相乘LD#x,DP;设置数据存储器页指针;设置数据存储器页指针;的起始位置;的起始位置PORTRPA1,x;从端口从端口PA1输入最新值输入最新值x(n)83FIR2:LD*AR1-,T;x(n-4)TMPY*AR2-,A;a4*x(n-4)ALTD*AR1-;x(n-3)T,x(n-3)x(n-4)MAC*AR2-,A;A+a3*x(n-3)ALTD*AR1-;x(n-2)T,x(n-2)x(n-3)MAC*AR2-,A;A+a2*x(n-2)ALTD*AR1-;x(n-1)T,x(n-1)x(n-2)MAC*AR2-,A;A+a1*x

68、(n-1)ALTD*AR1;x(n)T,x(n)x(n-1)MAC*AR2+0,A;A+a0*x(n)A,AR2复原,指向复原,指向a4STHA,y;保存运算结果的高位字到;保存运算结果的高位字到y(n)PORTWy(n),PA0;将结果;将结果y(n)输出到端口)输出到端口PA0BDFIR2;执行完下条指令后,从;执行完下条指令后,从FIR2开始循环开始循环PORTRPA1,*AR1+0;输入新值;输入新值x(n),AR1复原指向复原指向x+4.end84(3) (3) 用用线性性缓冲区和冲区和带移位双移位双操作数操作数寻址方法址方法实现 FIR FIR例例5-27编写编写y(n)=a0*x

69、(n)+a1*x(n-1)+a2*x(n-2)+a3*x(n-3)+a4*x(n-4)的计算程序,其中)的计算程序,其中N=5。与前面的与前面的编程不同,本例中,系数程不同,本例中,系数a a0 0a a4 4存放在程存放在程序存序存储器中,器中,输入数据存放在数据存入数据存放在数据存储器的器的线性性缓冲冲区中。乘法累加利用区中。乘法累加利用MACDMACD指令,指令,该指令完成数据存指令完成数据存储器器单元与程序存元与程序存储器器单元相乘,并累加、移位的功能。元相乘,并累加、移位的功能。 85.title“FIR3.ASM”;定义源程序名;定义源程序名.mmregs;定义存储器映象寄存器;定

70、义存储器映象寄存器.defstart;定义语句标号;定义语句标号start.bssy,1;为结果;为结果y预留预留1个单元的空间个单元的空间x.usect“x”,6;在自定义的未初始化;在自定义的未初始化;段;段“x”中保留中保留6个单元个单元PA0.set0;定义;定义PA0为输出端口为输出端口PA1.set1;定义;定义PA1为输入端口为输入端口.dataCOEF:.word1*32768/10;假定程序空间有五个参数;假定程序空间有五个参数,a4.word-4*32768/10;a3.word3*32768/10;a2.word-4*32768/10;a1.word1*32768/10;

71、a086.textstart:SSBXFRCT;小数乘法;小数乘法STM#x+5,AR1;AR1指向指向x(n-4)STM#4,AR0;设置;设置AR1复位值复位值LD#x+1,DP;设置数据存储器页指针的起始位置设置数据存储器页指针的起始位置PORTRPA1,x+1;输入最新值;输入最新值x(n)FIR3:RPTZA,#4;累加器累加器A清清0,设置重复下条指令设置重复下条指令5次次MACD*AR1-,COEF,A;x(n-4)T,A=x(n-4)*a4+A;(PAR)+1PAR,x(n-4)x(n-5)STHA,*AR1;暂存结果到;暂存结果到y(n)PORTW*AR1+,PA0;输出输出

72、y(n)到)到PA0,AR1指向指向x(n)BDFIR3;执行下条指令后循环;执行下条指令后循环PORTRPA1,*AR1+0;输入新数据到输入新数据到x(n),AR1指向指向x(n-4)87(4) (4) 用循用循环缓冲区和双操冲区和双操作数作数寻址方法址方法实现 FIR FIR例例5-28编写编写y(n)=a0*x(n)+a1*x(n-1)+a2*x(n-2)+a3*x(n-3)+a4*x(n-4)的计算程序,其中)的计算程序,其中N=5。本例中,存放本例中,存放a a0 0a a4 4的系数表以及存的系数表以及存放数据的循放数据的循环缓冲区均冲区均设在在DARAMDARAM中。中。 88

73、.title“FIR4.ASM”;给汇编程序取名;给汇编程序取名.mmregs;定义存储器映象寄存器;定义存储器映象寄存器.defstart;定义标号;定义标号start的起始位置的起始位置.bssy,1;为未初始化变量;为未初始化变量y保留空间保留空间xn.usect“xn”,5;自定义;自定义5个单元空间的数据段个单元空间的数据段xna0.usect“a0”,5;自定义;自定义5个单元空间的数据段个单元空间的数据段a0PA0.set0;设置数据输出端口;设置数据输出端口I/O,PA0=0PA1.set1;设置数据输入端口;设置数据输入端口I/O,PA1=1.datatable:.word1

74、*32768/10;a0=0.1=0x0CCC.word2*32768/10;a1=0.2=0x1999.word3*32768/10;a2=0.3=0x2666.word4*32768/10;a3=0.4=0x3333.word5*32768/10;a4=0.5=0x4000.text89start:SSBXFRCT;小数乘法;小数乘法STM#a0,AR1;AR1指向指向a0RPT#4;从程序存储器;从程序存储器table开始的地址传送开始的地址传送MVPDtable,*AR1+;5个系数至数据空间个系数至数据空间a0开始的数据段开始的数据段STM#xn+4,AR3;AR3指向指向x(n-4

75、)STM#a0+4,AR4;AR4指向指向a4STM#5,BK;设循环缓冲区长度;设循环缓冲区长度BK=5STM#-1,AR0;AR0=-1,双操作数减量双操作数减量LD#xn,DP;设置数据存储器页指针的起始位置设置数据存储器页指针的起始位置PORTRPA1,xn;输入新数据到;输入新数据到x(n)FIR4:RPTZA,#4;A清清0,重复执行下条指令重复执行下条指令5次次MAC*AR3+0%,*AR4+0%,A;系数与输入数据双;系数与输入数据双;操作数相乘并累加;操作数相乘并累加STHA,y;保存结果的高字节到;保存结果的高字节到y(n)PORTWy,PA0;输出;输出y(n)到端口)到

76、端口PA0BDFIR4;执行完下条指令后循环;执行完下条指令后循环PORTRPA1,*AR3+0%;从端口从端口PA1输入新数据到输入新数据到x(n).end90 4. 4.系数对称系数对称FIRFIR滤波器设计滤波器设计系系数数对称称的的FIRFIR滤波波器器具具有有线性性相相位位特特性性,这种种滤波波器器是是用用得得最最多多的的FIRFIR滤波波器器,特特别是是对相相位位失失真真要要求很高的求很高的场合。合。如如果果FIRFIR滤波波器器的的h h(n n)是是实数数,且且满足足偶偶对称称h h(n n)=h=h(N-1-nN-1-n)或或奇奇对称称h h(n n)=-h=-h(N-1-n

77、N-1-n)的的条条件件,则滤波器具有波器具有线性相位特性。性相位特性。 一个对称一个对称FIRFIR滤波器满足滤波器满足h h(n n)=h=h(N-1-nN-1-n)。)。 91例如,例如,N=8N=8的的FIRFIR滤波器,其输出方程为:滤波器,其输出方程为:y y(n n)=h=h0 0x x(n n)+h+h1 1x x(n-1n-1)+h+h2 2x x(n-2n-2)+h+h3 3x x(n-n-3 3)+h+h3 3x x(n-4n-4)+h+h2 2x x(n-5n-5)+h+h1 1x x(n-6n-6)+h+h0 0x x(n-7n-7)总总共共有有8 8次次乘乘法法和和

78、7 7次次加加法法。如如果果利利用用对对称称性性,可可将将其改写成:其改写成: y y(n n)=h=h0 0xx(n n)+x+x(n-7n-7)+h+h1 1xx(n-1n-1)+x+x(n-n-6 6)+h+h2 2xx(n-2n-2)+x+x(n-5n-5)+h+h3 3xx(n-3n-3)+x+x(n-4n-4) 变成变成4 4次乘法和次乘法和7 7次加法。可见乘法运算的次数少了次加法。可见乘法运算的次数少了一半。这是对称一半。这是对称FIRFIR的以一个优点。的以一个优点。 92对称对称FIRFIR滤波器的实现可按如下步骤进行:滤波器的实现可按如下步骤进行:(1) (1) 将将数数

79、据据存存储储器器分分为为新新旧旧两两个个循循环环缓缓冲冲区区,NewNew循循环环缓缓冲冲区区中中存存放放N/2=4N/2=4个个新新数数据据;OldOld循循环环缓缓冲冲区区中中存存放放N/2=4N/2=4个个老老数数据据。每每个个循循环环缓缓冲冲区区的的长长度为度为N/2N/2。93(2) (2) 设设置置循循环环缓缓冲冲区区指指针针,以以AR2AR2指指向向NewNew循循环环缓缓冲冲区区中中最最新新的的数数据据;以以AR3AR3指指向向OldOld循循环环缓缓冲冲区区中中最最老老的的数据。数据。(3) (3) 在程序存储器中设置系数表。在程序存储器中设置系数表。(4)(4)(AR2AR

80、2)+ +(AR3AR3)AHAH(累累加加器器A A的的高高位位),AR2-AR2-1AR21AR2,AR3-1AR3AR3-1AR3。(5) (5) 将将累累加加器器B B清清0 0,重重复复执执行行4 4次次(i=0i=0,1 1,2 2,3 3)下面的运算:下面的运算:(AHAH)* *系数系数h hi i+ +(B B)BB,系数指针(,系数指针(PARPAR)加)加1 1,(AR2AR2)+ +(AR3AR3)AHAH,AR2AR2和和AR3AR3减。减。94(6) (6) 保存和输出结果(结果在保存和输出结果(结果在BHBH中)。中)。(7) (7) 修修正正数数据据指指针针,让

81、让AR2AR2和和AR3AR3分分别别指指向向NewNew循循环环缓缓冲区最新的数据和冲区最新的数据和OldOld循环缓冲区中最老的数据。循环缓冲区中最老的数据。(8) (8) 用用NewNew循循环环缓缓冲冲区区中中最最老老的的数数据据替替代代OldOld循循环环缓缓冲区中最老的数据。冲区中最老的数据。OldOld循环缓冲区指针减循环缓冲区指针减1 1。(9) (9) 输输入入一一个个新新数数据据替替代代NewNew循循环环缓缓冲冲区区中中最最老老的的数数据。据。重复执行重复执行(4)(4)(9)(9)步。步。95在在编编程程中中要要用用到到系系数数对对称称有有限限冲冲激激响响应应滤滤波波器

82、器指指令令FIRSFIRS,其操作为:,其操作为:FIRS Xmem,Ymem,PmadFIRS Xmem,Ymem,Pmad该指令执行该指令执行 PmadPAR PmadPAR(程序存储器地址寄存器)(程序存储器地址寄存器)当(当(RCRC)00(B B)+ +(A A(32321616)(由(由PARPAR寻址寻址PmemPmem)BB(XmemXmem)+ +(YmemYmem)16A16A(PARPAR)+1PAR+1PAR(RCRC)-1RC-1RCFIRSFIRS指指令令在在同同一一个个机机器器周周期期内内,通通过过C C和和D D总总线线读读2 2次次数据存储器,同时通过数据存储

83、器,同时通过P P总线读一个系数。总线读一个系数。96例例5-29 设计对称设计对称FIRFIR滤波器(滤波器(N=8N=8)。)。 .title “FIR5.ASM” .title “FIR5.ASM” ;给汇编程序取名;给汇编程序取名 .mmregs .mmregs ;定义存储器映象寄存器;定义存储器映象寄存器 .def start .def start ;定义标号;定义标号startstart的起始位置的起始位置 .bss y,1 .bss y,1 ;为未初始化变量;为未初始化变量y y保留空间保留空间x_new x_new .usect .usect “DATA1”,4 “DATA1”

84、,4 ;自自定定义义4 4个个单单元元的的未未初初始始化化段段DTAT1DTAT1x_old x_old .usect .usect “DATA2”,4 “DATA2”,4 ;自自定定义义4 4个个单单元元的的未未初初始始化化段段DATA2DATA2Size .set 4 Size .set 4 ;定义符号;定义符号size=4size=4PA0 .set 0 PA0 .set 0 ;设置数据输出端口;设置数据输出端口I/OI/O,PA0=0PA0=0PA1 .set 1 PA1 .set 1 ;设置数据输入端口;设置数据输入端口I/OI/O,PA1=1PA1=1 .data .dataCOE

85、F .word 1*32768/10,2*32768/10COEF .word 1*32768/10,2*32768/10;系数对称系数对称, ,只需只需 .word 3*32768/10,4*32768/10 .word 3*32768/10,4*32768/10 ;给出给出N/2=4N/2=4个系数个系数97.textstart:LD#y,DP;设置数据存储器页指针的起始位置设置数据存储器页指针的起始位置SSBXFRCT;小数乘法;小数乘法STM#x_new,AR2;AR2指向新缓冲区第指向新缓冲区第1个单元个单元STM#x_old+(size-1),AR3;AR3指向老缓指向老缓;冲区最

86、后;冲区最后1个单元个单元STM#size,BK;设置循环缓冲区长度设置循环缓冲区长度BK=sizeSTM#-1,AR0;循环控制增量;循环控制增量AR0=-1PORTRPA1,#x_new;从;从I/O输入端口输入端口PA1;输入数据到;输入数据到x(n)98FIR5:ADD*AR2+0%,*AR3+0%,A;AH=x(n)+;x(n-7)(第一次)(第一次)RPTZB,#(size-1);B=0,下条指令执行下条指令执行size次次FIRS*AR2+0%,*AR3+0%,COEF;B+=AH*h0,;AH=x(n-1)+x(n-6)STHB,y;保存结果到;保存结果到yPORTWy,PA0

87、;输出结果到;输出结果到PA0MAR*+AR2(2)%;修正;修正AR2,指向新缓指向新缓;冲区最老的数据冲区最老的数据MAR*AR3+%;修正;修正AR3,指向老缓指向老缓;冲区最老的数据;冲区最老的数据MVDD*AR2,*AR3+0%新缓冲区向老缓新缓冲区向老缓;冲区传送一个数;冲区传送一个数BDFIR5;执行完下条指令后转移;执行完下条指令后转移FIR5并循环并循环PORTRPA1,*AR2;输入新数据至新缓冲区;输入新数据至新缓冲区.end99第五第五节 用用DSPDSP实现IIRIIR滤波器波器 1 1IIRIIR滤波器的基本概念滤波器的基本概念 100特特 点点y y(n n)由由

88、两两部部分分构构成成:第第一一部部分分 是是一一个个对对x x(n n)的的M M节节延延时时链链结结构构,每每节节延延时时抽抽头头后后 加加 权权 相相 加加 , 是是 一一 个个 横横 向向 结结 构构 网网 络络 ; 第第 二二 部部 分分 也也是是一一个个N N节节延延时时链链的的横横向向结结构构网网络络,不不过过它它是是对对y y(n n)的延时,因此是个反馈网络。)的延时,因此是个反馈网络。若若a ai i=0=0,IIRIIR滤滤波波器器就就变变为为FIRFIR滤滤波波器器,其其脉脉冲冲传传输输函函数数只只有有零零点点,系系统统总总是是稳稳定定的的,其其单单位位冲冲激激响响应应是

89、是有有限限长长序序列列。而而IIRIIR滤滤波波器器的的脉脉冲冲传传递递在在Z Z平平面面上上有有极极点点存存在在,其其单单位位冲冲激激响响应应是是无无限长序列。限长序列。101特特 点点IIRIIR滤滤波波器器与与FIRFIR滤滤波波器器的的一一个个重重要要区区别别是是,IIRIIR滤滤波波器器可可以以用用较较少少的的阶阶数数获获得得很很高高的的选选择择特特性性,所所用用的的存存储储单单元元少少,运运算算次次数数少少,具具有有经经济济、高高效效的的特特点点。但但是是,在在有有限限精精度度的的运运算算中中,可可能能出出现现不不稳稳定定现现象象。而而且且,选选择择性性越越好好,相相位位的的非非线

90、线性性越越严严重重,不不像像FIRFIR滤滤波波器器可可以以得得到到严严格格的的线线性性相相位位。因因此此,在在相相位位要要求求不不敏敏感感的的场场合合,如如语语言言通通信信等等,选选用用IIRIIR滤滤波波器器较较为为合合适适;而而对对于于图图像像信信号号处处理理、数数据据传传输输等等以以波波形形携携带带信信息息的的系系统统,对对线线性性相相位位要要求求较较高高,在在条条件件许许可可的的情情况况下,采用系数对称下,采用系数对称FIRFIR滤波器较好。滤波器较好。102 2 2 二阶二阶IIRIIR滤波器的实现方法滤波器的实现方法 3 3个二阶节级联的六阶个二阶节级联的六阶IIRIIR滤波器滤

91、波器对于一个高阶的对于一个高阶的IIRIIR滤波器,由于总可化成多个二滤波器,由于总可化成多个二阶基本节(或称二阶节)相级联或并联的形式阶基本节(或称二阶节)相级联或并联的形式103二二阶阶节节的的标标准准形形式式由由反反馈馈通通道道和和前前向向通通道道的的差差分分方程构成:方程构成:反馈通道:反馈通道: x0=w x0=w(n n)=x=x(n n)+A1*x1+A2*x2+A1*x1+A2*x2前向通道:前向通道: y y(n n)=B0*x0+B1*x1+B2*x2=B0*x0+B1*x1+B2*x2二阶节二阶节IIRIIR滤波器滤波器104(1 1)二)二阶IIRIIR滤波器的波器的单

92、操作数指令操作数指令实现法法如存如存储器分配器分配图所所示。示。x0x0单元有三个用元有三个用处:存放:存放输入数据入数据x x(n n)、)、暂时存放相存放相加器的加器的输出出x0x0和和输出出数据数据y y(n n)。)。例例5-30 5-30 编写二阶编写二阶IIRIIR滤波器的程序。滤波器的程序。 存储器分配图存储器分配图105.title“IIR1.ASM”;给汇编程序取名;给汇编程序取名.mmregs;定义存储器映象寄存器;定义存储器映象寄存器.defstart;定义标号;定义标号start的起始位置的起始位置X0.usect“x”,1;自定义;自定义3个单元的未初始化段个单元的未

93、初始化段xX1.usect“x”,1;X2.usect“x”,1;B2.usect“COEF”,1;自自定定义义5个个单单元元的的未未初初始始化化段段COEFB1.usect“COEF”,1;B0.usect“COEF”,1;A2.usect“COEF”,1;A1.usect“COEF”,1;PA0.set0;设置数据输出端口;设置数据输出端口I/O,PA0=0PA1.set1;设置数据输入端口;设置数据输入端口I/O,PA1=1.datatable:.word0,0;x(n-1),x(n-2).word1*32768/10,2*32768/10,3*32768/10;B2,B1,B0.wor

94、d5*32768/10,-4*32768/10;A2,A1106.textstart:LD#x0,DP;以;以x0的地址为数据存储器的地址为数据存储器;页指针起始位置;页指针起始位置SSBXFRCT;小数乘法;小数乘法STM#x1,AR1;x1首地址传给首地址传给AR1RPT#1;重复;重复2次下条指令次下条指令MVPD#table,*AR1+;用程序空间的;用程序空间的2个个;系数;系数0对对x1,x2单元清零单元清零STM#B2,AR1;B2首地址传给首地址传给AR1RPT#4;重复;重复5次下条指令次下条指令MVPD#table+2,*AR1+;用;用5个系数对个系数对;B2,B1,B0

95、,A2,A1单元赋值单元赋值107IIR1:PORTRPA1,x0;从;从PA1输入数据到输入数据到x(n)LDx0,16,A;计算反馈通道;计算反馈通道,x0送送A的的16位高端字位高端字LDx1,T;x1送送T寄存器寄存器MACA1,A;x0+x1*A1ALDx2,T;x2送送T寄存器寄存器MACA2,A;x0+x1*A1+x2*A2ASTHA,x0;暂存;暂存x0+x1*A1+x2*A2x0单元单元MPYB2,A;计算前向通道;计算前向通道,x2*B2ALTDx1;x1送送T寄存器寄存器,x1移至移至x2单元单元MACB1,A;x2*B2+x1*B1ALTDx0;x0送送T寄存器寄存器,

96、x0移至移至x1单元单元MACB0,A;x2*B2+x1*B1+x0*B0ASTHA,x0;暂存暂存y(n)=x2*B2+x1*B1+x0*B0x0单元单元BDIIR1;执行完下条指令后循环;执行完下条指令后循环PORTWx0,PA0;给出结果;给出结果y(n)到)到PA0端口端口.end108(2 2)二)二阶IIRIIR滤波器的双操作数指令波器的双操作数指令实现 特点是,乘法累加运算利用双操作数指令,数特点是,乘法累加运算利用双操作数指令,数据和系数表在数据存据和系数表在数据存储器(器(DARAMDARAM),其存),其存储器分器分配配图如如图 109例例5-31用双操作数指令实现二阶用双

97、操作数指令实现二阶IIR滤波器。滤波器。H(z)=.title“IIR2.ASM”;给汇编程序取名;给汇编程序取名.mmregs;定义存储器映象寄存器;定义存储器映象寄存器.defstart;定义标号;定义标号start的起始位置的起始位置x2.usect“x”,1;自定义;自定义3个单元的未初始化段个单元的未初始化段xX1.usect“x”,1;X0.usect“x”,1;COEF.usect“COEF”,5;自定义自定义5个单元的未初始化段个单元的未初始化段COEFPA0.set0;设置数据输出端口;设置数据输出端口I/O,PA0=0PA1.set1;设置数据输入端口;设置数据输入端口I/

98、O,PA1=1110.datatable:.word0,0;x(n-2),x(n-1).word676*32768/10000,1352*32768/10000;B2,B1.word676*32768/10000;B0.word-4174*32768/10000,707*32768/10000;A2,A1/2.textstart:SSBXFRCT;小数乘法;小数乘法STM#x2,AR1;x2首地址传给首地址传给AR1RPT#1;重复;重复2次下条指令次下条指令MVPD#table,*AR1+;用程序空间的用程序空间的2个系数个系数0对对x2,x1单元清零单元清零STM#COEF,AR1;COE

99、F首地址传给首地址传给AR1RPT#4;重复;重复5次下条指令次下条指令MVPD#table+2,*AR1+;将;将5个系数传到个系数传到COEF单元单元STM#x2,AR3;x2首地址传给首地址传给AR3STM#COEF+4,AR4;COEF中的中的A1地址传给地址传给AR4MVMMAR4,AR1;保存;保存AR4地址值在地址值在AR1中中STM#3,BK;设置循环缓冲区长度;设置循环缓冲区长度STM#-1,AR0;设置间接寻址步长;设置间接寻址步长111IIR2:PORTRPA1,*AR3;从;从PA1口输入数据到口输入数据到x(n)LD*AR3+0%,16,A;计算反馈通道,;计算反馈通

100、道,A=x(n)MAC*AR3,*AR4,A;A=x(n)+A1*x1MAC*AR3+0%,*AR4-,A;A=x(n)+A1*x1+A1*x1MAC*AR3+0%,*AR4-,A;A=x(n)+;2*A1*x1+A2*x2=x0STHA,*AR3;保存;保存x0MPY*AR3+0%,*AR4-,A;计算前向通道。;计算前向通道。A=B0*x0MAC*AR3+0%,*AR4-,A;A=B0*x0+B1*x1MAC*AR3,*AR4-,A;A=B0*x0+B1*x1+B2*x2=y(n)STHA,*AR3;保存;保存y(n)MVMMAR1,AR4;AR4重新指向重新指向A1BDIIR2;执行完下

101、条指令后循环;执行完下条指令后循环PORTW*AR3,PA0;向;向PA0口输出数据口输出数据.end112(3 3)直接形式二)直接形式二阶IIRIIR滤波器的波器的实现法法直接形式二直接形式二阶IIRIIR滤波器,在迭代运算中波器,在迭代运算中对信号信号先衰减后增益,系先衰减后增益,系统的的动态范范围和和鲁棒性棒性较好。好。 IIRIIR差分方程为:差分方程为:y y(n n)=B0*x=B0*x(n n)+B1*x+B1*x(n-1n-1)+B2*x+B2*x(n-2n-2)+A1*y+A1*y(n-1n-1)+A2*y+A2*y(n-2n-2)H(H(z z)=)=IIRIIR的脉冲传

102、递函数为:的脉冲传递函数为:113编编程程时时,将将变变量量和和系系数数都都存存放放在在DARAMDARAM中中,并并采采用用循循环环缓缓冲冲区区方方式式寻寻址址,共共需需开开辟辟4 4个个循循环环缓缓冲冲区区,用用来来存放变量和系数。这存放变量和系数。这4 4个循环缓冲区的结构如图所示:个循环缓冲区的结构如图所示:114例例5-32编写直接形式二阶编写直接形式二阶IIR滤波器的源程序。滤波器的源程序。.title“IIR3.asm”;给汇编程序取名;给汇编程序取名.mmregs;说明存储器映象寄存器;说明存储器映象寄存器defstart;定义标号;定义标号start的起始位置的起始位置X.u

103、sect“X”,3;自定义;自定义3个单元的未初始化段个单元的未初始化段XY.usect“Y”,3;自定义;自定义3个单元的未初始化段个单元的未初始化段YB.usect“B”,3;自定义;自定义3个单元的未初始化段个单元的未初始化段BA.usect“A”,3;自定义;自定义3个单元的未初始化段个单元的未初始化段APA0.set0;设置数据输出端口;设置数据输出端口I/O,PA0=0PA1.set1;设置数据输入端口;设置数据输入端口I/O,PA1=1.datatable:.word0,0;为;为x(n-2),),x(n-1)预留一单元空间)预留一单元空间.word0,0;为;为y(n-2),)

104、,y(n-1)预留一单元空间)预留一单元空间.word1*32768/10,2*32768/10,3*32768/10;放置系数;放置系数B2,B1,B0.word5*32768/10,-4*32768/10;放置系数;放置系数A2,A1115.textstart:SSBXFRCT;指明进行小数乘法;指明进行小数乘法STM#x,AR1;传送初始数据;传送初始数据x(n-2),),x(n-1)RPT#1;重复二次下条指令;重复二次下条指令MVPD#table,*AR1+;x(n-2)=0,x(n-1)=0STM#Y,AR1;传送初始数据;传送初始数据y(n-2),),y(n-1)RPT#1;重复

105、二次下条指令;重复二次下条指令MVPD#table+2,*AR1+;y(n-2)=0,y(n-1)=0STM#B,AR1;传送系数;传送系数B2,B1,B0RPT#2;重复三次下条指令;重复三次下条指令MVPD#table+4,*AR1+;系数系数B从程序存储器传到数据存储器从程序存储器传到数据存储器STM#A,AR1;传送系数;传送系数A2,A1RPT#1;重复二次下条指令;重复二次下条指令MVPD#table+7,*AR1+;将系数;将系数A从程序存储器传到数据存储器从程序存储器传到数据存储器116STM#X+2,AR2;辅助寄存器指针初始化,;辅助寄存器指针初始化,AR2指向指向x(n)

106、STM#A+1,AR3;辅助寄存器指针初始化,;辅助寄存器指针初始化,AR3指向指向A1STM#Y+1,AR4;辅助寄存器指针初始化,;辅助寄存器指针初始化,AR4指向指向y(n-1)STM#B+2,AR5;辅助寄存器指针初始化,;辅助寄存器指针初始化,AR5指向指向B0STM#3,BK;设置循环缓冲区长度,(;设置循环缓冲区长度,(BK)=3STM#-1,AR0;设置间接寻址步长,(;设置间接寻址步长,(AR0)=-1117IIR3:PORTRPA1,*AR2;从;从PA1口输入数据到口输入数据到x(n)MPY*AR2+0%,*AR5+0%,A;计算前向通道,计算前向通道,A=x(n)*B0

107、MAC*AR2+0%,*AR5+0%,A;A=x(n)*B0+x(n-1)*B1MAC*AR2,*AR5+0%,A;A=x(n)*B0+x(n-1)*B1+x(n-2)*B2MAC*AR4+0%,*AR3+0%,A;计算反馈通道计算反馈通道,A=A+y(n-1)*A1MAC*AR4+0%,*AR3+0%,A;A=A+y(n-2)*A2MAR*AR3+0%;AR3指向指向A1STHA,*AR4;保存;保存y(n)BDIIR3;执行完下条指令后循环;执行完下条指令后循环PORTW*AR4,PA0;输出;输出y(n)到)到I/O端口端口PA0.end118 3 3高阶高阶IIRIIR滤波器的实现滤波

108、器的实现 一一个个高高阶阶IIRIIR滤滤波波器器可可以以分分解解成成若若干干个个二二阶阶基基本本节节相级联。相级联。由由于于调调整整每每个个二二阶阶基基本本节节的的系系数数,只只涉涉及及到到这这个个二二阶阶节节的的一一对对极极点点和和零零点点,不不影影响响其其他他零零、极极点点,因因此便于调整系统的性能。此便于调整系统的性能。此此外外,由由于于字字长长有有限限,每每个个二二阶阶基基本本节节运运算算后后都都会会带带来来一一定定的的误误差差,合合理理安安排排各各二二阶阶基基本本节节的的前前后后次次序,将使系统的精度得到优化。序,将使系统的精度得到优化。119对高对高阶IIRIIR滤波器的波器的几

109、点特殊处理几点特殊处理当当出出现现一一个个或或一一个个以以上上系系数数。此此时时,既既可可以以用用最最大大的的系系数数来来定定标标,即即用用最最大大的的系系数数去去除除所所有有的的系系数数,也也可可以以将将此此的的系系数数分分解解成成两两个个的系数进行运算和相加,例如的系数进行运算和相加,例如B0=1.2B0=1.2,则:,则:x x(n n)*B0=x*B0=x(n n)* *(B0/2B0/2)+x+x(n n)* *(B0/2B0/2)=0.6*x=0.6*x(n n)+0.6*x+0.6*x(n n)这这样样,将将使使所所有有的的系系数数保保持持精精度度,而而仅仅仅仅多多开开销销一一个

110、个机机器器周周期期。前前面面的的例例5-315-31中中的的系系数数A1A1为为是是这样处理的。这样处理的。(1 1)系数)系数时的定标方法时的定标方法120(2 2)对输入数据定入数据定标 一一般般地地,从从外外设设口口输输入入一一个个数数据据加加载载到到累累加加器器A A,可用以下指令:可用以下指令:PORTR 0001h,XinPORTR 0001h,XinLD Xin,16,ALD Xin,16,A如如果果运运算算过过程程中中可可能能出出现现的的输输出出值值,可可在在输输入入数据时将其缩小若干倍,如:数据时将其缩小若干倍,如:PORTR 0001h,XinPORTR 0001h,XinLD Xin,16-3,ALD Xin,16-3,A将将输输入入数数据据除除以以8 8,将将使使输输出出值值小小于于。上上面面用用多多种种不不同同的的方方法法进进行行了了滤滤波波器器的的设设计计,在在实实现现滤滤波波器器功功能能的的前前提提下下,程程序序的的繁繁简简和和对对存存储储器器的的使使用用情情况况是是不不同的,应用中应根据具体情况进行选择。同的,应用中应根据具体情况进行选择。121122

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号