?? adaptive.asm
字號(hào):
;
; adaptive.asm - Adaptive filter for system identification
;
; Prototype: unsigned int adaptive(int *in, int *d, int *x, int *w,
; unsigned int Ns, unsigned int N, unsigned int index)
;
; Entry: in[] - input signals
; d[] - reference signal
; x[] - adaptive filter delay-line buffer
; w[] - adaptive filter coefficient array
; Ns - number of samples per block
; N - order of the adaptive filter
; index - index to x[]
;
; Return: T0 = Adaptive filter delay-line buffer index
;
TWOMU .set 0x1000 ; 2*MU
.def _adaptive
.sect "lms_code"
_adaptive:
pshm ST1_55 ; Save ST1, ST2, and ST3
pshm ST2_55
pshm ST3_55
mov mmap(AR3),BSA45
mov mmap(T1),BK47
mov mmap(AR2),BSA23
mov mmap(T1),BK03
mov AR4,AR3 ; AR3 -> x[] as circular buffer
mov #0,AR4 ; AR4 -> w[] as circular buffer
or #0x340,mmap(ST1_55); Set FRCT,SXMD,SATD
or #0x18,mmap(ST2_55) ; Enable circular addressing mode
bset SATA ; Set SATA
sub #1,T0
mov mmap(T0),BRC0 ; Set Sample block loop counter
sub #2,T1
mov mmap(T1),BRC1 ; Counter for LMS update loop
mov mmap(T1),CSR ; Counter for FIR filter loop
rptblocal loop-1 ; for (n=0; n<Ns; n++)
mov *AR0+,*AR3 ; x[n]=in[n]
mpym *AR3+,*AR4+,AC0 ; temp = w[0]*d[0]
|| rpt CSR ; for (i=0; i<N-1; i++)
macm *AR3+,*AR4+,AC0 ; y += w[i]*x[i]
sub *AR1+ <<#16,AC0 ; AC0=-e=y-d[n], AR1 points to d[n]
mpyk #-TWOMU,AC0
mov rnd(hi(AC0)),mmap(T1); T1=2*mu*e[n]
rptblocal lms_loop-1 ; for(j=0; i<N-2; i++)
mpym *AR3+,T1,AC0 ; AC0=2*mu*e*x[i]
add *AR4<<#16,AC0 ; w[i]+=2*mu*e*x[i]
mov rnd(hi(AC0)),*AR4+
lms_loop
mpym *AR3,T1,AC0 ; w[N-1]+=2*mu*e*x[N-1]
add *AR4<<#16,AC0
mov rnd(hi(AC0)),*AR4+ ; Store the last w[N-1]
loop
popm ST3_55 ; Restore ST1, ST2, and ST2
popm ST2_55
popm ST1_55
mov AR3,T0 ; Return T0=index
|| ret
.end
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -