DSP数字滤波FIR设计教程:[4]FIR的DSP实现
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); //做完滤波后使程序保持在本循环中
}