使用窗函数的作用在于减少频谱泄漏,由于在实际应用中,通常都是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.