?? 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 + -