打印

DSP实现FIR的过程

[复制链接]
1865|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaochy1126|  楼主 | 2012-7-9 18:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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
此程序包含了线性和缓冲的两种算法。

相关帖子

沙发
tianli1980| | 2012-7-12 09:00 | 只看该作者
DSP的可移植性好,能从不同方法得来的滤波器系数写入 filter_coeff.inc子程序中。学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1061

主题

11320

帖子

26

粉丝