[数字信号处理] FIR滤波器基础

80 篇文章 5 订阅
73 篇文章 1 订阅

 对于一个滤波器而言,其单位冲击响应是有限区间的数列的话,这个滤波器是FIR滤波器。反之,其单位冲击响应是无限区间的数列的话,这个滤波器是IIR滤波器。

   下面使用线性差分方程式,在时域内,解释一下FIR与IIR数字滤波器。使用单位脉冲响应和其输入信号进行卷积运算,可得到下式


   将其改写为递归的方式,则

 

    上式是1次差分方程式,而对于N次数字滤波器的输入输出关系,表示为N次差分方程式,如下所示。

        

     由上式看,输出 y(n) 需要自己的历史值,也就是,含有反馈。

     a_k = 0的时候,反馈有作用,其系统框图如下。


     此时,输入单位脉冲,由于反馈的作用,系统的单位冲击响应是无限的。

     a_k != 0的时候,无反馈作用,其单位冲击响应是有限的,其单位框图如下。

     输入单位脉冲,由于没有反馈的作用,系统的单位冲击响应是有限的。也就是Finite Impulse Response,字面意思。

 接下来,用C实现一个FIR滤波器,这里,系数是随意设置的。

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <math.h>  
  3. #include <malloc.h>  
  4. #include <string.h>  
  5.   
  6.   
  7. double Real_Time_FIR_Filter(double *b,  
  8.                             int     b_Lenth,  
  9.                             double *Input_Data)  
  10. {      
  11.     int Count;  
  12.     double Output_Data = 0;  
  13.       
  14.     Input_Data += b_Lenth - 1;    
  15.       
  16.     for(Count = 0; Count < b_Lenth ;Count++)  
  17.     {   
  18.             Output_Data += (*(b + Count)) *  
  19.                             (*(Input_Data - Count));  
  20.     }           
  21.       
  22.     return (double)Output_Data;  
  23. }  
  24.   
  25. void Save_Input_Date (double Scand,  
  26.                       int    Depth,  
  27.                       double *Input_Data)  
  28. {  
  29.     int Count;  
  30.     
  31.     for(Count = 0 ; Count < Depth-1 ; Count++)  
  32.     {  
  33.         *(Input_Data + Count) = *(Input_Data + Count + 1);  
  34.     }  
  35.       
  36.     *(Input_Data + Depth-1) = Scand;  
  37. }  
  38.   
  39.   
  40. int main(void)  
  41. {  
  42.     double b[] = {0.5 , -0.5 , 1};  
  43.     double Scand_Data = 0;  
  44.     char Command = 0;  
  45.      
  46.     int b_Lenth = (sizeof(b)/sizeof(double));  
  47.     int Count = 0;  
  48.       
  49.     double Input_Data[sizeof(b)/sizeof(double)] = {0};  
  50.     double Output_Data = 0;  
  51.       
  52.     /*--------------------display----------------------------*/        
  53.     printf("  b(k) : ");  
  54.     for(Count = 0; Count < b_Lenth ;Count++)  
  55.     {  
  56.         printf("%f " , b[Count]);  
  57.     }  
  58.     printf("\n");  
  59.     /*-----------------------------------------------------*/  
  60.       
  61.     Count = 0;  
  62.     while(1)  
  63.     {  
  64.         if(Count == 0) printf("The Input : ");     
  65.         else printf("The Next Input : ");     
  66.      
  67.         scanf("%lf",&Scand_Data);  
  68.         printf("Input x(%d) : %lf         ",Count,Scand_Data);      
  69.           
  70.         Save_Input_Date (Scand_Data,  
  71.                          b_Lenth,  
  72.                          Input_Data);  
  73.   
  74.         Output_Data = Real_Time_FIR_Filter(b,  
  75.                                            b_Lenth,  
  76.                                            Input_Data);          
  77.                                
  78.         printf("Output y(%d) : %lf  \n",Count,Output_Data);                      
  79.   
  80.         scanf("%c",&Command);  
  81.         if(Command == 27) break;    //ESC  
  82.           
  83.         Count++;  
  84.     }  
  85.       
  86.     printf("\n");  
  87.       
  88.     return (int)0;  
  89. }  

到此,一个FIR滤波器就实现了,只需要不停的输入输入信号就好了,ESC键可以停止程序。

其单位冲击响应用Matlab表示如下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值