1.[数字信号处理] FIR 滤波器基础
2.[数字信号处理]使用窗函数设计 FIR 滤波器
3.[数字信号处理]单位冲击响应的频响与 FIR 的实现代码(C 语言)
4.[数字信号处理]相位特性解卷绕
5.[数字信号处理]IIR 滤波器基础
6.[数字信号处理]IIR 滤波器的间接设计
7.[数字信号处理]IIR 滤波器的直接设计
对于一个滤波器而言,其单位冲击响应是有限区间的数列的话,这个滤波器是 FIR 滤波器。反
之,其单位冲击响应是无限区间的数列的话,这个滤波器是 IIR 滤波器。
下面使用线性差分方程式,在时域内,解释一下 FIR 与 IIR 数字滤波器。使用单位脉冲响应和
其输入信号进行卷积运算,可得到下式
接下来,用 C 实现一个 FIR 滤波器,这里,系数是随意设置的。
#include <stdio.h> #include <math.h> #include <malloc.h> #include <string.h> double Real_Time_FIR_Filter(double *b, int b_Lenth, 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表示如下。
联系客服