首先,FIR滤波器的输出公式为:
(具体的话可以查看数字信号处理书籍,都忘得差不多了。。。)
假设:输入的信号是x(n) = sin(2*pi*f1*n/fs) + sin(2*pi*f2*n/fs)
所设计的滤波器是一个低通FIR滤波器,使用的是hamming窗,阶数为10
则可以使用MATLAB 的滤波器设计工具来设计滤波器:
然后可以通过设计滤波器,生成C头文件来获取所需要的数值:
FIR滤波器的C程序如下:
#include <stdio.h> #include <math.h> #define pi 3.1415 #define N 11 //N为滤波器的阶数+1 #define LEN 512 int inputdata[LEN]; //假设数据的长度为512 int outputdata[LEN]; long int yn; //yn为int的话,在运算中数据可能会溢出,从而滤波失败 const int B[N] = {166, 0, -1374, 0, 9453, 16279, 9453, 0, -1374, 0, 166} //FIR滤波器的参数,由MATLAB生成
void main() { int f1,f2,fs,i,j; int *a; f1=100; //频率分量1(Hz) f2=300; //频率分量2(Hz) fs=800; //采样频率(Hz) for(i=0;n<LEN;n++) { inputdata[n]=sin(2*pi*f1*n/fs) + sin(2*pi*f2*n/fs); //产生信号 } for(j=0;j<LEN;j++) //根据公式来进行滤波 { a=&inputdata[j]; yn=0; for(i=0;i<N;i++) { yn=yn+B[i]*(*a++); } outputdata[j]=yn>>16; //滤波后信号 } while(1); }
在CCS环境下运行,并且通过Graph来观察inputdata和outputdata的时域和频域图(这里就不上图了,在学校的实验课上测试过了。。。)
其CMD文件为:
-e start MEMORY { PAGE 0: PARAM: org = 3000h len = 4000h PAGE 1: DARAM: org = 100h len=4000h } SECTIONS{ .text : > PARAM PAGE 0 stack : > DARAM PAGE 1 filter_vars : > DARAM PAGE 1 .bss : > DARAM PAGE 1 .data : > DARAM PAGE 1 }
时间: 2024-10-29 19:11:11