Hanning窗口值在Python和Matlab中不匹配

时间:2019-06-06 22:06:23

标签: python matlab numpy scipy signal-processing

我一直在研究低通滤波器,应该使用Hann窗口和一些自定义数字滤波器来过滤.wav文件。

我为Matlab编写了全部代码,今天我确实用Python编写了代码,但是当我开始比较python x Matlab中的hann函数的值时,它没有任何事情要做...

#python hanning
hanning(10)
# array([0., 0.11697778, 0.41317591, 0.75, 0.96984631, 0.96984631, 0.75, 0.41317591, 0.11697778, 0.])
%matlab hanning
hanning(10)
% ans =
%    0.0794
%    0.2923
%    0.5712
%    0.8274
%    0.9797
%    0.9797
%    0.8274
%    0.5712
%    0.2923
%    0.0794

2 个答案:

答案 0 :(得分:4)

TL; WR:

它们使用不同的定义。与Numpy的hanning等效的Matlab是hann,而不是hanning


Matlab 中,hanning(n)创建一个对称窗口。根据文件hanning.m中的代码,即使对于n,该窗口的前半部分也计算为

m = n/2;
w = .5*(1 - cos(2*pi*(1:m).'/(n+1)))

,然后整个窗口将以w = [w; w(end:-1:1)]的形式获得。除了数值精度问题(这可能是Matlab仅计算一半然后进行镜像的原因)之外,这等同于

w = .5*(1 - cos(2*pi*(1:n).'/(n+1)));

在{strong> Numpy 中,根据documentation,公式不同。在Matlab语法中,它对应于

w = .5*(1 - cos(2*pi*(0:n-1).'/(n-1)));

这是Matlab的documentation中所述的hann(n)

答案 1 :(得分:3)

scipy.signal中,不推荐使用功能hanning。要使用的函数是scipy.signal.hann

numpy.hanningscipy.signal.hann计算相同的窗口。 该函数在窗口末尾包含零值。要匹配您在问题中显示的Matlab函数的输出,请在scipy.signal.hann的参数中添加2,然后在末尾丢弃零:

In [1]: from scipy.signal import hann                                                                                                                                           

In [2]: hann(12)                                                                                                                                                                
Out[2]: 
array([0.        , 0.07937323, 0.29229249, 0.57115742, 0.82743037,
       0.97974649, 0.97974649, 0.82743037, 0.57115742, 0.29229249,
       0.07937323, 0.        ])

In [3]: hann(12)[1:-1]                                                                                                                                                          
Out[3]: 
array([0.07937323, 0.29229249, 0.57115742, 0.82743037, 0.97974649,
       0.97974649, 0.82743037, 0.57115742, 0.29229249, 0.07937323])