DSP数字滤波FIR设计教程:[4]FIR的DSP实现

2025-10-14 11:48:45

1、线性缓冲区法:线性缓冲区法又称延迟线法,

(a)对于N级的FIR滤波器,在数据存储器中开辟一个N单元的缓冲区(滑窗),用来存放最新的N个输入样本;

(b)从最老样本开始取数,每取一个样本后,将此样本向下移位;

 (c)读完最后一个样本后,输入最新样本存入缓冲区的顶部

2、2)循环缓冲区法:循环缓冲区法的如下:

(a)对于N级FIR滤波器,在数据存储器中开辟一个N单元的缓冲区(滑窗),用来存放最新的N个输入样本;

(b)从最新样本开始取数;

(c) 读完最后一个样本(最老样本)后,输入最新样本来代替最老样本, 而其他数据位置不变;

(d)用片内BK(循环缓冲区长度)寄存器对缓冲区进行间接寻址,使循环缓冲区地址首尾相邻。本次设计的FIR滤波器所采用的就是循环缓冲区法

3、(2)C语言实现FIR

采用C语言算法在DSP平台上实现了FIR低通数字滤波器,C语言算法相比于汇编算法可移植性很强。这里是在TMS320VC5510DSP为平台编写的C语言算法, 此算法可以稍加改动用在其他DSP芯片上, 而汇编算法则不然。这种方法具有以下优点

4、(a) 程序的入口和出口由C语言自动管理,不必手工编写汇编程序实现。

(b) 程序结构清晰,可读性强。

(c) 程序调试方便。由于C程序中的变量全部由C语言来定义,因此采用C源码调试器可以方便地观察C语言变量。

(d) 可移植性较强,通用性好,

具体代码如下:

5、#include"stdio.h"

#include"fdacoefs.h"  //头文件包含滤波器的系数

#define N 81        //定义滤波器的阶数为81阶

#define Length 200     //定义缓冲区数组大小为200

long yn;

int input[Length];      //存放输入数据

int output[Length];     //存放输出数据

void main()

{

       int m,n;   

       int *x;

       for(n=0;n<Length-1;n++) //循环导入数据

       {

         x=&input[n];        //指针指向每次导入的数据

         yn=0;     //每做完一次乘累加后,把值赋给output数组后,从新归0

         for(m=0;m<N-1;m++)

              yn+=B[m]*(*(x++));//做N次的乘累加

         output[n]=yn;    把值赋给output数组

        }

     while(1);        //做完滤波后使程序保持在本循环中

}

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢