DSP实现FIR有三种方式,即线性缓冲区法、循环缓冲区法,还有系数对称缓冲法。前面两种方法的思路是完全不同的,对称系数法只是一种扩展。所以我只介绍前面两种实现方法的思想。 线性缓冲区法:假设有7个数分别为X(n),x(n-1),x(n-2),x(n-3),x(n-4),x(n-5),x(n-6),它们的地址分别为80h,81h,82h,83h,84h,85h,86h。这些数从端口输进来,然后分别与对应的系数相乘。作乘法的时候,有一个问题特别要注意,就MACD指令,它的意思是乘一次数据会向高地址移一次。比如MACD x(n-6),b6,A(这条指令只做说明用,不能代表什么),乘完之后,x(n-6)不是在86h单元,而是被移到87单元了。如果我们做7次这样的运算的话,那么相当于把所有的数据往高地址移了一次。这个时候,我们再把新输进的数放到原先x(n)的位置,然后重复以上的操作,这就是线性缓冲法的基本思想。
循环缓冲法:循环缓冲法最重要的一点是它只在固定的一个区域来进行数据的运算,这个区域由BK来确定。循环缓冲寻址法,当我们设置好了缓冲区大小的时候,ARX必须满足2^R>N(R是地址的低R位,N是缓冲区的大小)。如果不满足的话,编译的时候就等着出错吧!!!使用循环缓冲法就像C语言使用指针一样,我们不是移动数据,而是将数据的地址交换一下。
以上就是两种方法的两种的基本思路。
只给一部分让大家参考一下,从而真正的领悟DSP算法的真谛。
.title "fir.asm"
.mmregs
.def start
.ref buf
.data
coef: .word 5*32768/10;b6
.word 6*32768/10;b5
.word 7*32768/10;b4
.word 8*32768/10;b3
.word 7*32768/10;b2
.word 6*32768/10;b1
.word 5*32768/10;b0
.text
start: SSBX FRCT
STM #-1h,AR0
STM #8000h,AR7
STM #buf+6,AR2
STM #coef+6,AR4
STM #coef,AR3
STM #7,BK
STM #buf+360+7,AR5
STM #720,AR1
fir: RPTZ A,#6
MVPD coef,*AR3+
;MVPD coef,*AR3+;buffer
;MVPD coef,*AR3;buffer
;MACD *AR2-,coef,A ;linear
;MACD *AR2,coef,A ;linear
RPTZ A,#6
MAC *AR2+0%,*AR4+0%,A;buffer
STH A,*AR7+;get yn
LD *AR5+,16,A
STH A,*AR2
BANZ fir,*AR1-
FIN: B FIN
此程序包含了线性和缓冲的两种算法。 |