使用窗函数设计FIR滤波器

首先,先明白几个概念。通带,阻带,过渡带,通带纹波和阻带纹波分别是什么?看下图,

       范围称为通带,对于允许误差而言,这个范围,称为通带纹波。同样的,对于范围则是阻带,这个范围,称为阻带纹波。中间的黑色部分是过度带。角频率称为通带边缘频率,角频率则被称为阻带起始频率。

       通常的滤波器的设计,都会指明这几个参数,最后设计的滤波器,必须满足这几个参数。当然,这里举得例子是低通滤波器的,高通或者带通,就与之相反了。

2.理想FIR低通滤波器

      首先,先由理想低通滤波器为出发点开始考虑。理想低通滤波器的频响如下所示


       这里的,表示截止频率。

       先由理想的滤波器出发,求其理想滤波器的单位冲击响应。得到了单位冲击响应,也就得到了滤波器的系数。这样,我们就设计出了一个理想的滤波器。这是一个完美的想法,那么开始动手吧,寻找他的单位冲击响应。运用离散时间的傅里叶逆变换,有如下的式子。

使用窗函数设计FIR滤波器_第1张图片

       由此,我们得到了一个单位冲击响应的表达式(sinc是辛格函数),到这我们就可以设计出一个理想的滤波器了吗?好吧,让我们再确认一遍。第一,这个式子是离散的。对于单位冲击响应,本来就应该是离散的,没有错,很好,我们距离理想滤波器又近了一步。第二,这个式子所求出的单位冲击响应的个数,很不幸!个数是无限的。到这里,我们基本可以确定了,理想滤波器是实现不了的。

       虽然理想滤波器是实现不了的,但是我们可以退一步,从无限的理想滤波器的单位冲击响应中,在选择一部分冲击响应,构成一个不太理想的,但又达到一定标准的滤波器。我们只能“将就”着使用这个不太理想的滤波器,那么接下来还有一个问题,我们要如何从无限的数列中选择出有限的一部分,从而达到我们的设计要求。

3.窗函数

       首先,我们先考虑最简单的情况。对于理想单位冲击响应而言,其形状大概和一个高斯分布很像(当然,只是很像,n=0时候,单位冲击响应的值最大,由两边慢慢减少。当然,可能也出现负值。)!所以,我们为了能使得滤波器的性能接近理想滤波器,那么,我们选择其最主要的部分,也就是,值较大的部分。其余部分则放弃。根据之前的叙述,我们可以使用如下式子表示。


      这个式子确实可以帮助我们选择一部分有限的数列。而这个式子,被称为矩形窗。可以看出,N越大,性能越街进理想滤波器。这里N称为窗函数的长度。

      这就是我们选定的窗口,然后我们把窗口函数加上,也就是加窗!其实也就一个乘法,如下所示。


  这样,也就完成了一个加窗。

  但是,在实际的实践过程中,很少用矩形窗的。其原因是,矩形窗的阻带衰减不够,仅仅只有21[dB]。于是,各种各样的窗口就被提出了。各有各的特点,在我们所学的初步的设计中,我们就仅仅看阻带衰减就够了。各种窗函数的性能如下。

================================================

      窗函数                       过渡带大小                       阻带衰减                               

================================================

  矩形窗                           1.8π/N                                  21[dB]

  汉宁窗                            6.2π/N                                 44[dB]

  汉明窗                            6.6π/N                                 53[dB]

布莱克曼窗                        11π/N                                 74[dB]


4.用窗函数实现一个FIR滤波器

       以上说了很多有关于窗函数的原理,现在来整理一下设计的步骤。

       1.根据设计的规格,参数要求,我们选择一个适合的窗函数。这里主要我们还是看阻带衰减,阻带衰减要大于给定的值。一般,若没有给定阻带衰减,我们则需要通过通带纹波和阻带纹波去求,如下。


      2.根据要求的通带边缘频率和阻带起始频率,计算过度区的大小,从而计算出窗函数的长度。

      3.最后,根据窗函数和理想滤波器的单位冲击响应,计算出我们所需要的滤波器的单位冲击响应。

      现在,我们来实战一下,假设我们需要设计如下滤波器。

    

       规格中,没有给定阻带衰减,我们只能自己计算。

   

       这里,阻带衰减为40.8[dB],我们选择的窗的阻带衰减不能比这个小,这里其实汉宁窗就可以做到。但我还是选择用汉明窗去做。然后,计算窗长度。


      

        窗长度有了,计算单位冲击响应吧。

  

       这样,我们就得到了一个FIR滤波器。下面是我们计算出来的这个滤波器的单位冲击响应。



    

       5.写在最后的话

       到此,我们“设计”出了一个滤波器,我们也顺利的得出了它的单位脉冲响应。

       但是,滤波器真的可以实现么?真的可以设计出这样一个滤波器么?

       我觉得要拿着这个单位脉冲响应结果,去实际计算一下,才能发现,这样的滤波器是实现不了的!拿教科书上的话来说,这个滤波器是非因果的!


        这个问题的解决方法,和窗函数的FIR设计代码的实现在下一节[数字信号处理]单位冲击响应的频响与FIR的实现代码(C语言)。

你可能感兴趣的:(VC++,C语言,C++语言)