[an error occurred while processing this directive]
|
Еще немного подготовительного...
Вариант №1 - 16-bit коэфф.
; 257-Tap symmetric FIR
FIR: .macro
mov #0,ac0
mov ac0,ac1 || rpt #127
mac *ar0+, *cdp+, ac0 :: mac *ar1-,*cdp+,ac1
add ac1,ac0
macm *ar0, *cdp, ac0
.endm; ------------------
; ar0, ar1 in circular mode (with base and size of buffer with size 257 words)
mov @firptr,ar0 ; pointer in circ. buffer
amov #coeffs,xcdp ; coefficients
mov ac0<<#-16,*-ar0 ; put input sample into circ. buffer
mov ar0,@eqptr ; store new pointer
amov ar0,ar1 ; set ar1
amar *ar1- ; to end of circ. buffer
FIR
Это-же можно сделать с командами FIRSADD, FIRSSUB.
Вариант №2 - 32-бит коэфф, 257-tap
; cdp - pointer to coeffs
; ar0 - begin of circ. buffer (circular mode)
; ar1 - end of circ. buffer (circular mode)DECFIR: .macro
mov #127,mmap(@BRC0)
mov #0,ac0
mov #0,ac1
mov #0,ac2
mov #0,ac3
|| rptblocal label?
mac *ar0 , *cdp+ , ac0 :: mac *ar1 , *cdp+ , ac1 ; Re, high
label?: mac *ar0+, uns(*cdp+) , ac2 :: mac *ar1- , uns(*cdp+), ac3 ; Re, lowbclr AR1LC
amar *cdp,xar1macm *ar0, *ar1+, ac0
macm *ar0, uns(*ar1+), ac2
add ac2,ac3
add ac1,ac0
sfts ac0,#1
add ac3<<#-15,ac0
.endm
Итого при достаточно большой длине фильтра для 16-битных коэфф. имеем один такт на 2 тапа, для 32-битных - один такт на один тап.
E-mail: info@telesys.ru