首先,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
}
