FIR滤波器设计中的窗函数

来源:互联网 发布:知乎如何回答最新问题 编辑:程序博客网 时间:2024/05/22 02:26

使用窗函数的作用在于减少频谱泄漏,由于在实际应用中,通常都是FIR滤波器,这就不能使滤波器的系数达到sinc函数上的无限大的抽样,从而实现在频域的方波形状的低通滤波,人们想到使用窗函数的方法对输入的采样点进行加窗处理。

常用的窗函数有汉宁窗,汉明窗,布莱克慢窗,凯泽窗等。它们的评价指标就在于过渡带宽度,通带纹波,主瓣与旁瓣比,阻带衰减。

如果不加窗的话,就相当于加一个矩形窗。

写这个文章的原由是要解释一个疑问,用matlab得到的窗函数序列和书本上以及实际程序代码里的都有出入。

这里就用汉宁窗来举例吧。

在matlab里输入hanning(8)回车得到的是:

>> hanning(8)

ans =

    0.1170
    0.4132
    0.7500
    0.9698
    0.9698
    0.7500
    0.4132
    0.1170

你会发现上下对称的结果。

关于窗函数的表达式,我在一本书上看到是这样的w(n)=0.5[1-cos(2*pi*n/(N-1))], n = 0,1,...N-1.这样计算出来的结果就是:

0.000000
0.188255
0.611260
0.950484
0.950484
0.611260
0.188255
0.000000

也是上下对称的,这就把第一个和最后一个都去掉了,因为等于0

而我在程序代码里看到的却是另一种表达式,即w(n)=0.5[1-cos(2*pi*n/N)], n = 0,1,...N-1.这样计算出来的结果就是:

0.000000
0.146447
0.500000
0.853553
1.000000
0.853553
0.500000
0.146447

这个结果的上下都不对称了。

问题来了,同一个问题有三个不同的答案,究竟它们谁错了,谁是对的,我考虑之后觉得他们都是对的,因为窗函数只是对输出的频谱的一种改善,当然这种改善也会付出代价,比如使频率分辨率降低。

那么matlab使用的是什么表达式呢,我猜出来的结果是w(n)=0.5[1-cos(2*pi*n/(N+1))], n = 1,2,...N.验证后果然如此。可能是因为matlab要去掉那个首尾计算出来的零值才这么做的吧。

在计算汉明窗的时候,matlab使用的表达式是和书上的一样的,都是w(n)=0.54 - 0.46*cos(2*pi*n/(N-1)), n = 0,1,...N-1.

0 0
原创粉丝点击