




已阅读5页,还剩87页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章中主要掌握C54X的存储器和外设的接口方法,FIR、IIR滤波器实现方法,FFT实现方法,数字波形产生方法,以及程序自动加载,最后学习串行口编程。,第六章C54x的软硬件应用,FIR滤波器的C54实现方法IIR滤波器的C54实现方法FFT的C54x实现方法正弦和余弦信号发生器程序的自举加载C54x与外设的接口串口编程设计实例,FIR滤波器的C54实现方法,FIR滤波器的结构原理线型缓冲区法实现FIR循环缓冲区法实现FIR,FIR滤波器的结构原理,数字滤波器是DSP的一个最基本的应用领域,其中FIR滤波器的差分方程及结构图如下:y(n)=,Z-1,Z-1,Z-1,Z-1,X(n)X(n-1)X(n-2)X(n-N+2)X(n-N+1),a0,a1,a2,aN-2,aN-1,yn,FIR滤波器的结构原理,在结构图中Z-1表示延时,X(n)表示当前采样值,X(n-1)表示前一时刻采样值,X(n-2)表示X(n-1)之前的采样值,而X(n-N+1)表示的是与当前输出有关的最老的采样值。FIR滤波器的最主要特点是没有反馈回路,因而是无条件稳定系统。它的单位冲击响应h(n)是一个有限长序列。特别是h(n)=h(N-1-n)或h(n)=-h(N-1-n),且N为偶数时,即滤波器系数具有对称或反对称特性时,该滤波器输出具有线性相位特性。,FIR滤波器的C54实现方法,FIR滤波器的结构原理线性缓冲区法实现FIR循环缓冲区法实现FIR,线性缓冲区法实现FIR,(1)用线性缓冲区法实现Z-1线型缓冲区法的特点:i)对于N级的FIR滤波器,需要在数存单元中开辟一个称为滑窗的N个单元的缓冲区,存放最新的N个输入样本。ii)从最老的样本开始,每读一个样本后,将此样本向下移动。读完最后一个样本后,输入最新样本到缓冲区顶部。注意:由于线性缓冲区法使用了DELAY指令,因而该存储区必须定义在DARAM中。,线性缓冲区法实现FIR,如:一个六阶滤波器样本点处理方法,系数单元,线性缓冲区法实现FIR,(2)具有线性演示功能的指令有:DELAYSmem;(Smem+1)=(Smem)将数据送给下一个单元LTDSmem;相当于LT+DELAY执行先执行T=(Smem),然后再执行(Smem+1)=(Smem)MACDSmem,Pmad,src;相当于MACP+DELAY先执行src=src+(Smem)*(Pmad),然后再执行(Smem+1)=(Smem)由于线性缓冲区法都是将固定的单元内容和固定的滤波器系数相乘,因此数据在缓冲区中运算后必须送给它后一个单元,因此运算中都有数据向后移位的操作。,线性缓冲区法实现FIR,(3)直接寻址法实现FIR滤波器N=5,y(n)=PA0.SET0000H;D/A端口PA1.SET0001H;A/D端口.bssy,1;y(n)输出.bssXN,1;x(n)新采样值.bssXN1,1;x(n-1).bssXN2,1;x(n-2).bssXN3,1;x(n-3).bssXN4,1;x(n-4).TEXTA0:.WORD1*32768/10;各系数A1:.WORD2*32768/10,线性缓冲区法实现FIR,A2:.WORD3*32768/10A3:.WORD4*32768/10A4.WORD5*32768/10Start:LD#XN,DPSSBXFRCTPORTRPA1,XN;从端口PA1读入采样值,存入X(n)LOOP:LDXN4,T;T=X(n-4)MPYA4,A;A=X(n-4)*A4LTDXN3;T=X(n-3),X(n-4)=X(n-3),;LTD=LT+DELAYMACA3,A;A=X(n-3)*A3+X(n-4)*A4LTDXN2;T=X(n-2),X(n-3)=X(n-2)MACA2,A;A=A+X(n-2)*A2,x(n-3),x(n-2),x(n-1),x(n),x(n+1),线性缓冲区法实现FIR,LTDXN1MACA1,ALTDXNMACA0,A;A=STHA,y;保存结果,因为小数乘法,保存高16位PORTWy,PA0;将滤波器的输出从端口送出去BDLOOP;延迟后分支,执行下一条语句后再执;行分支操作PORTRPA1,XN;从端口PA1中读入下一个新的采样值。,线性缓冲区法实现FIR,(4)双操作数寻址法实现FIR滤波器N=5,y(n)=PA0.SET0000H;D/A端口PA1.SET0001H;A/D端口.bssx,7;y(n),x(n),x(n-1),x(n-4),输出及各采样值.textCOEF:.word1*32768/10,2*32768/10,3*32768/10,4*32768/10,5*32768/10;各滤波器系数a4,a3,a2,a1,a0,线型缓冲区法实现FIR,Start:SSBXFRCTSTM#x+5,AR1STM#4,AR0LD#x+1,DPPORTRPA1,x+1;从端口PA1读入采样值,存入X(n)FIR:RPTZA,#4MACD*AR1-,COEF,A;p240STHA,*AR1;保存滤波器输出结果PORTW*AR1+,PA0;将滤波器的输出从端口送出去BDFIR;延迟后分支操作PORTRPA1,*AR1+0;从端口PA1中读入下一个新的采样值。,ar1,COEF,FIR滤波器的C54实现方法,FIR滤波器的结构原理线型缓冲区法实现FIR循环缓冲区法实现FIR,循环缓冲区法实现FIR,(1)用循环缓冲区法实现Z-1循环缓冲区法的特点:i对于N阶FIR滤波器,在数据存储区中开辟一个也成为滑窗的N个单元的缓冲区,滑窗中保存最新的N个输入样本。ii每次输入新样本时改写滑窗中最老的数据,而滑窗中其它的数据不需移动。iii利用BK寄存器(循环缓冲区长度)对滑窗进行间接寻址,循环缓冲区地址首尾相邻注意:由于采用循环缓冲区寻址方式,因而缓冲区开始地址应安排在如下的地址单元中。,循环缓冲区法实现FIR,假设缓冲区长度为N,具有2KN=2K-1,则循环缓冲区应安排在以最低位地址为K个0开始的单元,如N=31,有K=5则循环缓冲区应设置在地址为XXXXXXXXXXX00000B开始的单元。缓冲区输出定位实现方法:1、在原程序中定义举例:X0:.usect“Fir_Memory”,31;定义未初始化段Fir_Memory,并为该段保留31个单元。2、在连接器命令文件中的SECTIONS(段输出定位)中加入如下命令:Fir_Memory:align(32)DATAPAGE1,循环缓冲区法实现FIR,循环缓冲区法使用的寻址方式有:*ARx+%;ARx=circ(ARx+1)*ARx-%;ARx=circ(ARx-1);*ARx-0%;ARx=circ(ARx+AR0)*ARx+0%;ARx=circ(ARx-AR0)*+ARx(lk)%;ARx=circ(ARx+lk),循环缓冲区法实现FIR,2)循环缓冲区法实现FIR滤波器N=5,y(n)=.title“FIR4.ASM”.mmregs.defstart.bssy,1;定义输出量xn.usect“s_xn”,5;x(n),x(n-1),x(n-4)a0.usect“s_a0”,5;a0,a1,a2,a3,a4PA0.set0000HPA1.set0001H.data,循环缓冲区法实现FIR,table:.word1*32768/10.word2*32768/10.word3*32768/10.word4*32768/10.word5*32768/10.textstart:SSBXFRCTSTM#a0,AR1RPT#4MVKDtable,*AR1+STM#xn+4,AR3;AR3指向最老采样值x(n-4)STM#a0+4,AR4;AR4指向系数a4,循环缓冲区法实现FIR,STM#5,BK;缓冲区长度为5STM#-1,AR0;AR0=-1LD#xn,DPPORTRPA1,xn;从端口PA1读入采样值;并存入X(n)中FIR:RPTZA,#4MAC*AR3+0%,*AR4+0%,ASTHA,yPORTWy,PA0BDFIRPORTRPA1,*AR3+0%;每次循环后AR3仍指.END;向最老采样值x(n-3),AR4仍指向a4,ar3,ar4,X(n+1),X(n-4),循环缓冲区法实现FIR,注意:在链接命令文件中的SECTIONS命令中指定s_xn:align(8)DARAMPAGE1s_a0:align(8)DARAMPAGE1,循环缓冲区法实现FIR,3)系数对称的FIR滤波器的实现系数对称的滤波器具有线性相位特性。在算法中使用FIRS指令:FIRSXmem,Ymem,Pmad执行:PAR=Pmadif(RC!=0)B=B+AH*PmadA=((Xmem)+(Ymem))16)PAR=PAR+1RC=RC-1;计数器,循环缓冲区法实现FIR,如N=8的系数对称的FIR滤波器输出方程如下:Y(n)=a0*x(n)+a1*x(n-1)+a2*x(n-2)+a3*x(n-3)+a4*x(n-4)+a5*x(n-5)+a6*x(n-6)+a7*x(n-7)=a0*x(n)+x(n-7)+a1*x(n-1)+x(n-6)+a2*x(n-2)+x(n-5)+a3*x(n-3)+x(n-4)从以上的推导可以看出由于系数的对称性使得乘法运算的次数减少了一倍。实现要点:(1)开辟两个循环缓冲区(New和Old)分别存放新老数据,长度都为N/2。(2)使用辅助寄存器AR2指向最新的数据和AR3指向最老的数据。,循环缓冲区法实现FIR,(3)将滤波器系数表存放在程序存储器中。(4)使用FIRS指令将AR2和AR3指向的单元相加并与程序存储器中的系数相乘。(5)利用单指令重复实现FIR滤波(6)修正数据指针,使AR2和AR3分别指向New和Old缓冲区中最老的数据。(7)用New缓冲区中最老的数据代替Old缓冲区中最老的数据。(8)读入新数据代替New缓冲区中最老的数据。(9)重复执行下一轮滤波操作,循环缓冲区法实现FIR,运算y(n)=a0*x(n)+x(n-7)+a1*x(n-1)+x(n-6)+a2*x(n-2)+x(n-5)+a3*x(n-3)+x(n-4).mmreg.defstart.bssy,1;输出x_new.usect“DATA1”,4;x(n),x(n-3),x(n-2),x(n-1);按逆序循环排列x_old.usect“DATA2”,4;x(n-4),x(n-5),x(n-6),x(n-7);按顺序循环排列size.set4;缓冲区尺寸PA0.set0000HPA1.set0001H,ar2,ar3,循环缓冲区法实现FIR,.textCOEF.word1*32768/10,2*32768/10;滤波器系数表.word2*32768/10,4*32768/10;a0,a1a2,a3;按顺序排列start:LD#y,DPSSBXFRCTSTM#x_new,AR2;AR2指向新缓冲区第一个单;元X(n)最新的数据STM#x_old+size-1,AR3;AR指向老缓冲区最;后一个单元X(n-7)最老的数据STM#size,BK;设置循环缓冲区大小,循环缓冲区法实现FIR,STM#-1,AR0;AR0=-1PORTRPA1,x_new;从端口PA1读入采;样值,并存入X(n)FIR:ADD*AR2+0%,*AR3+0%,A;第一次;A=x(n)16+x(n-7)16,然后将AR2指向x(n-1),AR3指向x(n-6)RPTZB,#(size-1);FIRS*AR2+0%,*AR3+0%,COEF;第一次执行;B=AH*a0,A=(x(n-1)+x(n-6)1;保存实部和STB,*QX+;(QX)=B16;保存实部差|LD*PX,A;读取虚部SUB*QX,16,A,B;ADD*QX,16,ASTHA,ASM,*PX+0%;保存虚部和STB,*QX+0%;保存虚部差|LD*PX,Astage_1_end:STM#fft_data,PX;PX指向fft_data的第一个单元(实部和单元)STM#fft_data+K_DATA_IDX_2,QX;QX指向第fft_data的相邻的实部和单元STM#K_FFT_SIZE/4-1,BRCLD*PX,16,A;读入第一个和值RPTBDstage_2_end-1STM#K_DATA_IDX_2+1,AR0;ar0=4;一级蝶形算法相邻和式之间运算SUB*QX,16,A,B;实部和相减第一次BH=A0+A4-A2-A6ADD*QX,16,A;实部和相加第一次AH=A0+A4+A2+A6STHA,ASM,*PX+;保存相邻实部和的和STB,*QX+;保存相邻实部和的差|LD*PX,ASUB*QX,16,A,B;第一次BH=A0+A4-A2-A6ADD*QX,16,A;第一次AH=A0+A4+A2+A6STHA,ASM,*PX+;保存相邻虚部和的和STHB,ASM,*QX+;保存相邻虚部和的差;二级蝶形算法相邻和式之间运算MAR*QX+;此时PX指向实差单元QX指向第三个实差单元ADD*PX,*QX,A;第一次A=实部(A0+A4)+虚部(A2-A6)SUB*PX,*QX-,B;第一次B=实部(A0+A4)-虚部(A2-A6)STHA,ASM,*PX+;保存SUB*PX,*QX,A;A=实部(A0+A4)-虚部(A0+A4-A2-A6)STB,*QX;|LD*QX+,B;STA,*PX|ADD*PX+0%,ASTA,*QX+0%|LD*PX,A;stage_2_end:STM#K_TWID_TBL_SIZE,BKST#K_TWID_IDX_3,d_twid_idxSTM#K_TWID_IDX_3,AR0STM#cosine,WRSTM#sine,WISTM#K_LOGN-3,STAGE_COUNTERST#K_FFT_SIZE/8-1,d_grps_cntSTM#K_FLY_COUNT_3-1,BUTTERFLY_COUNTERST#K_DATA_IDX_3,d_data_idxstage:STM#fft_data,PXLDd_data_idx,AADD*(PX),ASTLMA,QXMVDKd_grps_cnt,GROUP_COUNTERgroup:MVMDBUTTERFLY_COUNTER,BRCRPTBDbutterfly_end-1LD*WR,TMPY*QX+,AMACR*WI+0%,*QX-,AADD*PX,16,A,BSTB,*PX|SUB*PX+,BSTB,*QX|MPY*QX+,AMASR*QX,*WR+0%,AADD*PX,16,A,BSTA,*QX+|SUB*PX,BLD*WR,TSTB,*PX+|MPY*QX+,Abutterfly_end:PSHMAR0MVDKd_data_idx,AR0MAR*PX+0MAR*QX+0BANZDgroup,*GROUP_COUNTER-POPMAR0MAR*QX-LDd_data_idx,ASUB#1,A,BSTLMB,BUTTERFLY_COUNTERSTLA,1,d_data_idxLDd_grps_cnt,ASTLA,ASM,d_twid_idxBANZDstage,*STAGE_COUNTER-MVDKd_twid_idx,AR0;计算功率谱STM#fft_data,AR2STM#fft_data,AR3STM#fft_out,AR4STM#K_FFT_SIZE*2-1,BRCRPTBpower_end-1SQUR*AR2+,A;A=*AR2*AR2,T=*AR2SQURA*AR2+,A;A=A+*AR2*AR2,T=*AR2STHA,*AR4+power_end:STM#fft_out,AR4RPT#K_FFT_SIZE-1PORTW*AR4+,PA0here:Bhere.end,第六章C54x的软硬件应用,FIR滤波器的C54实现方法IIR滤波器的C54实现方法FFT的C54x实现方法正弦和余弦信号发生器程序的自举加载C54x与外设的接口串口编程设计实例,正弦和余弦信号发生器,正弦波产生方法主要有两种:1)查表法。运算量小,适用于精度不太高的场合,精度要求越高表就越大,同时使用的存储器容量也越大。一般在单片机中使用较多。2)泰勒级数展开法。相对于查表法而言,运算量增大,但使用的存储单元少,精度高。一般在DSP中使用较多。计算一个角度正弦值的程序清单.title“sinx.asm”;sin(theta)=x(1-x2/2*3(1-x2/4*5(1-x2/6*7(1-x2/8*9).mmregs.defstart,正弦和余弦信号发生器,.refsin_start,d_x,d_sinxSTACK:.usect“STACK”,10start:STM#STACK+10,SPLD#d_x,DPST#6487,d_x;6487/32768弧度CALLsin_startend:Bendsin_start:.defsin_startd_coeff.usect“coeff”,4.datatable:.word01c7h;c1=1/(8*9).word030bh;c2=1/(6*7),正弦和余弦信号发生器,.word0666h;c3=1/(4*5).word1556h;c4=1/(2*3)d_x.usectsin_vars,1d_squr_x.usectsin_vars,1d_temp.usectsin_vars,1d_sinx.usectsin_vars,1c_l.usectsin_vars,1.textSSBXFRCTSTM#d_coef,AR5;movecoeffstableRPT#3,正弦和余弦信号发生器,MVPD#table,*AR5+STM#d_coef,AR3STM#d_x,AR2STM#c_l,AR4ST#7FFFh,c_lSQUR*AR2+,A;A=x2STA,*AR2;AR2=x2|LD*AR4,B;B=1d_squr_xs=x2MASR*AR2+,*AR3+,B,A;A=1-x2/72;T=x2MPYAA;A=T*A=x2*(1-x2/72)STHA,*AR2;(d_temp)=x2*(1-x2/72),正弦和余弦信号发生器,MASR*AR2-,*AR3+,B,A;A=1-x2/42*(1-x2/72);T=x2*(1-x2/72)MPYA*AR2+;B=x2*(1-x2/42*(1-x2/72)STB,*AR2;d_temp)=x2*(1-x2/42*(1-x2/72)|LD*AR4,B;B=1MASR*AR2-,*AR3+,B,A;A=1-x2/20*(1-x2/42*(1-x2/72)MPYA*AR2+;B=x2(1-x2/20*(1-x2/42*(1-x2/72)STB,*AR2;(d_temp)=x2(1-x2/20*(1-x2/42*(1-x2/72)|LD*AR4,B;B=1,正弦和余弦信号发生器,MASR*AR2-,*AR3+,B,A;A=1-x2/6(1-x2/20*(1-x2/42*(1-x2/72)MPYAd_x;B=x(1-x2/6(1-x2/20*(1-x2/42*(1-x2/72)STHB,d_sinx;sin(theta)RET余弦值算法与正弦值算法类似,只是泰勒级数展开式不同。sin(theta)=x(1-x2/2*3(1-x2/4*5(1-x2/6*7(1-x2/8*9)cos(theta)=1-x2/2*(1-x2/3*4(1-x2/5*6(1-x2/7*8)以下为0-360度正弦波产生程序;thisfunctiongenaratesthesinewaveofangleusingthetaylorseriesexpansion;sin(theta)=x(1-x2/2*3(1-x2/4*5(1-x2/6*7(1-x2/8*9);cos(theta)=1-x2/2*(1-x2/3*4(1-x2/5*6(1-x2/7*8);sin(2*theta)=2*sin(theta)*cos(theta).titlesinx.asm.mmregs.global_sinxx.refsinx,d_xs,d_sinx,cosx,d_xc,d_cosxsin_x:.usectsin_x,360;setsinxmemorySTACK:.usectSTACK,10;setspvectork_theta.set240;theta=pi/360(0.5deg)*32768;setstep=0.5degPA0.set0;setoutputDAportaddress_sinxx:.textNOPLD#0,DP;resetdatapagepointerSTM#0 x2000,SWWSR;2waitcycleforIOspacecos(theta)RETcc1:nopnopnopret.end,正弦和余弦信号发生器,以下为0-360度正弦波产生程序;thisfunctiongenaratesthesinewaveofangleusingthetaylorseriesexpansion;sin(theta)=x(1-x2/2*3(1-x2/4*5(1-x2/6*7(1-x2/8*9);cos(theta)=1-x2/2*(1-x2/3*4(1-x2/5*6(1-x2/7*8);sin(2*theta)=2*sin(theta)*cos(theta).titlesinx.asm.mmregs.global_sinxx.refsinx,d_xs,d_sinx,cosx,d_xc,d_cosxsin_x:.usectsin_x,360;setsinxmemorySTACK:.usectSTACK,10;setspvectork_theta.set240;theta=pi/360(0.5deg)*32768;setstep=0.5degPA0.set0;setoutputDAportaddress_sinxx:.textNOPLD#0,DP;resetdatapagepointerSTM#0 x2000,SWWSR;2waitcycleforIOspacecos(theta)RETcc1:nopnopnopret.end,第六章C54x的软硬件应用,FIR滤波器的C54实现方法IIR滤波器的C54实现方法FFT的C54x实现方法正弦和余弦信号发生器程序的自举加载C54x与外设的接口设计实例,程序的自举加载,1DSP的程序只有加载后才能被执行,加载的方式有并行加载,从HPI自举加载,从I/O自举加载,从串行口自举加载和热自举加载五种,第六章C54x的软硬件应用,FIR滤波器的C54实现方法IIR滤波器的C54实现方法FFT的C54x实现方法正弦和余弦信号发生器程序的自举加载C54x与外设的接口串口编程设计实例,C54x与外设的接口,1)C54x提供以下引脚用于存储器及外设的连接及扩展,C54x与外设的接口,C54x与外设的接口,C54x与外设的接口,2)需要插入等待时间的计算方法和插入方法i)计算方法如下:例如DSP的时钟为40MHz,时钟周期为25nS,如果外部器件小于15(0.6*CLKOUT)时不用插入等待,如果大于15nS时就需要插入等待周期。具体插入等待周期的个数见下表:,C54x与外设的接口,ii)插入方法通过设置软件等待状态寄存器(SWWSR)来设置等待状态。,XPA扩展程存控制位,当XPA=1时采用扩展寻址方式LoProg或LoData在表示程存或数存的0000H7FFFH区间插入的等待状态数HiProg或HiData在表示程存或数存的8000HFFFFH区间插入的等待状态数I/O表示I/O空间插入的等待状态数,C54x与外设的接口,3)需要插入01个软件等待状态的存储器扩展方法,Address(20、16)-PS-MSTRBR/-W-DS-MSCREADY-IS-IOSTRBDATA(16),ADDRESS程存DATA(16)-CS1-CS2-OE,ADDRESS数存-CS2DATA(16)-WE-CS1-OE,ADDRESSI/O-WEDATA(16)-CS1-CS2-OE,1,C54x与外设的接口,4)需要插入27个软件等待状态的存储器扩展方法,Address(20、16)-PS-MSTRBR/-W-DS-MSCREADY-IS-IOSTRBDATA(16),ADDRESS程存DATA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中考数学总复习《特殊角三角函数值的混合运算》专项测试卷带答案
- 风险识别在公司战略根基构建过程中的作用试题及答案
- 山东省泰安市东平县2025届七下数学期末调研试题含解析
- 跨越难关2025年VB考试试题及答案
- 优化养老院安全管理计划
- 班级国际交流活动的计划与实施
- 向善向上社团活动安排计划
- 2024年云南省机关事务局下属事业单位真题
- 2024年西安雁塔雁南小学教师招聘笔试真题
- 生物学科学术研讨交流计划
- 国际压力性损伤-溃疡预防和治疗临床指南(2025年版)解读课件
- 高强瓦楞原纸产品商业计划书
- GB/T 20041.21-2017电缆管理用导管系统第21部分:刚性导管系统的特殊要求
- 总公司与分公司承包协议[页]
- 食品经营设施空间布局图
- 预制箱梁运输及安装质量保证体系及措施
- GB∕T 36266-2018 淋浴房玻璃(高清版)
- 内科学-原发性支气管肺癌
- 航空煤油 MSDS 安全技术说明书
- 导热系数测定仪期间核查方法、记录 Microsoft Word 文档
- 云南省劳动合同样本(共8页).doc
评论
0/150
提交评论