[數字訊號處理] FIR濾波器基礎
阿新 • • 發佈:2018-12-29
對於一個濾波器而言,其單位衝擊響應是有限區間的數列的話,這個濾波器是FIR濾波器。反之,其單位衝擊響應是無限區間的數列的話,這個濾波器是IIR濾波器。
下面使用線性差分方程式,在時域內,解釋一下FIR與IIR數字濾波器。使用單位脈衝響應和其輸入訊號進行卷積運算,可得到下式
將其改寫為遞迴的方式,則
上式是1次差分方程式,而對於N次數字濾波器的輸入輸出關係,表示為N次差分方程式,如下所示。
由上式看,輸出 y(n) 需要自己的歷史值,也就是,含有反饋。
a_k = 0的時候,反饋有作用,其系統框圖如下。
此時,輸入單位脈衝,由於反饋的作用,系統的單位衝擊響應是無限的。
a_k != 0的時候,無反饋作用,其單位衝擊響應是有限的,其單位框圖如下。
輸入單位脈衝,由於沒有反饋的作用,系統的單位衝擊響應是有限的。也就是Finite Impulse Response,字面意思。
接下來,用C實現一個FIR濾波器,這裡,係數是隨意設定的。
- #include <stdio.h>
- #include <math.h>
- #include <malloc.h>
- #include <string.h>
- double Real_Time_FIR_Filter(double *b,
-
int
- double *Input_Data)
- {
- int Count;
- double Output_Data = 0;
- Input_Data += b_Lenth - 1;
- for(Count = 0; Count < b_Lenth ;Count++)
- {
- Output_Data += (*(b + Count)) *
-
(*(Input_Data - Count));
- }
- return (double)Output_Data;
- }
- void Save_Input_Date (double Scand,
- int Depth,
- double *Input_Data)
- {
- int Count;
- for(Count = 0 ; Count < Depth-1 ; Count++)
- {
- *(Input_Data + Count) = *(Input_Data + Count + 1);
- }
- *(Input_Data + Depth-1) = Scand;
- }
- int main(void)
- {
- double b[] = {0.5 , -0.5 , 1};
- double Scand_Data = 0;
- char Command = 0;
- int b_Lenth = (sizeof(b)/sizeof(double));
- int Count = 0;
- double Input_Data[sizeof(b)/sizeof(double)] = {0};
- double Output_Data = 0;
- /*--------------------display----------------------------*/
- printf(" b(k) : ");
- for(Count = 0; Count < b_Lenth ;Count++)
- {
- printf("%f " , b[Count]);
- }
- printf("\n");
- /*-----------------------------------------------------*/
- Count = 0;
- while(1)
- {
- if(Count == 0) printf("The Input : ");
- else printf("The Next Input : ");
- scanf("%lf",&Scand_Data);
- printf("Input x(%d) : %lf ",Count,Scand_Data);
- Save_Input_Date (Scand_Data,
- b_Lenth,
- Input_Data);
- Output_Data = Real_Time_FIR_Filter(b,
- b_Lenth,
- Input_Data);
- printf("Output y(%d) : %lf \n",Count,Output_Data);
- scanf("%c",&Command);
- if(Command == 27) break; //ESC
- Count++;
- }
- printf("\n");
- return (int)0;
- }
到此,一個FIR濾波器就實現了,只需要不停的輸入輸入訊號就好了,ESC鍵可以停止程式。
其單位衝擊響應用Matlab表示如下。