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