📄 zhy_205.asm
字号:
*************************************************************
* 系数对称FIR滤波器的实现方法
* N=8的FIR滤波器,若h(n)=h(N-1-n),就是系数对称滤波器,其输出 *
* 方程:y(n) = h0*x(n) + h1*x(n-1) + h2*x(n-2) + h3*x(n-3) *
* +h4*x(n-4)+h5*x(n-5) + h6*x(n-6) + h7*x(n-7) *
* = h0*(x(n)+x(n-7)) + h1*(x(n-1)+x(x-6)) *
* h2*(x(n-2)+x(n-5)) + h3*(x(n-3)+x(n-4)) *
* *
*-----------------------------------------------------------*
* 程序来源:DSP技术与应用实例(赵红怡) Page 205 *
* lvlishan *
* 2009 04 13 *
* 2009 04 17 *
*************************************************************
.title "FIR4.ASM"
.mmregs
.def _c_int00
.bss y,1
x_new .usect "DATA1",4
x_old .usect "DATA2",4
x_in .usect "DATA3",4
x_out .usect "DATA4",4
y_out .usect "DATA5",256
size .set 4
PA0 .set 0
PA1 .set 1
.data
COEF .word 1*32768/10,2*32768/10 ;对称的系数,只给出N/2=4个
.word 3*32768/10,4*32768/10
.text
_c_int00:
LD #x_new,DP ;设置DP指针
SSBX FRCT ;乘法模式:有符号小数乘法
STM #y_out,AR4
STM #x_in,AR5
STM #x_new,AR2
STM #x_old+(size-1),AR3
STM #size,BK ;循环缓冲区的长度=size
STM #-1,AR0 ;设置步进值
;PORTR PA1,@x_new;读取新的数据
;使用分号屏蔽掉的代码是书中源程序之中所带的指令
FIR: NOP
NOP ;add a input toggle probe point here 在此处增加输入探针
NOP
STM #x_in,AR5
LD *AR5,A
LD *AR5,A
STL A,*AR2
LD #0,A
;x_new ; x_old
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=B+AH*h0
;AH = x(n-1)+x(n-6)
LD #y,DP ;设置DP指针
STH B,@y ;保存滤波器输出结果
NOP ;add a output toggle probe point here 在此处增加输出探针
;PORTW @y,PA0 ;输出结果
STH B,*AR4+
MAR *AR2-%;
MAR *AR2-%
NOP
MAR *AR3+%
NOP
MVDD *AR2,*AR3
;MAR *-AR2(2)% ;修正AR2指向新缓冲区最老的数据
;MAR *AR3+0% ;修正AR3指向老缓冲区最老的数据
MAR *AR3-%
NOP
;MVDD *AR2,*AR3+0% ;新缓冲区向老缓冲区传送一个数
B FIR ;延迟跳转
;PORTR PA1,*AR2 ;输入新数据到新缓冲区
.end
****************************************************************
* 寻址方式说明: *
* MAR *+ARx(1k) --> addr = circ(ARx+1k) *
* = circ(ARx+1k) *
* 指令说明: *
* FIRS Xmem,Ymem,pmad --> *
* pmad -> PAR *
* While(RC!=0) *
* (B)+(A(32~16))*(Pmem addressed by PAR) -->B *
* ((Xmem)+(Ymem))<<16 -->A *
* (PAR)+1-->PAR *
* RC-1-->RC *
****************************************************************
* (PAR) program address register *
****************************************************************
** --------------------------------------------------------------- **
** 缓冲区的存取说明: **
** 循环缓冲区分为两段:较新缓冲区(0x80,0x81,0x82,0x83) **
** 较老缓冲区(0x88,0x89,0x8A,0x8B) **
** 较新缓冲区中的数据总是从最新的数据开始计算, 计算顺序为: **
** (每行的第1个数据是最新数据) **
** 80 83 82 81<>80 83 **
** 81 80 83 82<>81 80 **
** 82 81 80 83<>82 81 **
** 82 82 81 80<>83 82 **
** 80 83 82 81<>80 83 **
** ... ... 循环 **
** 较老缓冲区中的数据总是从最老的数据开始计算, 计算顺序为: **
** (每行的第1个数据是最老数据,第4个数据在当前次计算完毕时更新) **
** 8B 8A 89 88 8B<>8A **
** 8A 89 88 8B 8A<>89 **
** 89 88 8B 8A 89<>88 **
** 88 8B 8A 89 88<>8B **
** 8B 8A 89 88 8B<>8A **
** ... ... 循环 **
** --------------------------------------------------------------- **
** 2009 04 17 **
** --------------------------------------------------------------- **
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -