滤波子程序:filter_start ;================================================================= .text filter_start: STM #K_CIR,BK ;设置环形buffer的大小 STM #1,AR0 ;和步长 STM #inputdata,ORIGIN ;AR2 STM #bufferdatax,INPUT ;AR3 STM #bufferdatay,FILTER ;AR4 STM #filterdata,OUTPUT ;AR5 ;初始化 RPT #K_B-1-1 ; ST #0,*INPUT+0% ;x(-1)、x(-2)、x(-3)设为0 RPT #K_A-1 ST 0,*FILTER+% ;y(-1)、y(-2)、y(-3)设为0 STM #bufferdatay,FILTER STM #K_DATA_SIZE-1,BRC ;块循环次数,头三个值已经直接通过了 RPTB filter_end-1 ;块循环结束位置 ;可以把块循环改成中断调用,有新数据就中断一次。 nop ;数据从件导入点,加nop保证数据在使用前导入 nop MVDD *ORIGIN,*INPUT ;新数据 MAR *+INPUT(-K_B+1)% MPY *INPUT+0%,#b3,B ;B=x(n-3)*b3, i=i+1 LD B,A MPY *INPUT+0%,#b2,B ;B=x(n-2)*b2, i=i+1 ADD B,A MPY *INPUT+0%,#b1,B ;B=x(n-1)*b1, i=i+1 ADD B,A MPY *INPUT+0%,#b0,B ;B=x(n)*b0, i=i+1 ADD B,A MPY *FILTER+0%,#a3,B ;B=y(n-3)*a3, j=j+1 j=n-3为y的指针 ADD B,A MPY *FILTER+0%,#a2,B ;B=y(n-2)*a2, j=j+1 ADD B,A MPY *FILTER+0%,#a1,B ;B=y(n-1)*a1, j=j+1 ADD B,A STH A,*FILTER ;传送y(n)至y区, ;16位小数相乘得到的是32位小数 STH A,*OUTPUT ;传送y(n)至结果区 ;取前16位就行了 MAR *+FILTER(-K_A+1)% nop nop ;数据文件导出点,加nop保证数据在导出前已更新 filter_end: NOP ;循环结束 RET .end |