Hanning window 值在 Python 和 Matlab 中不匹配

Hanning window values doesnt match in Python and Matlab

我一直在研究低通滤波器,应该使用 Hann window 和一些自定义数字滤波器来过滤 .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

scipy.signal 中,函数 hanning 已弃用。要使用的函数是 scipy.signal.hann.

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

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])

TL;WR:

他们使用不同的定义。 Matlab 等同于 Numpy 的 hanninghann,而不是 hanning.


Matlab 中,hanning(n) 创建一个对称的 window。根据文件 hanning.m 中的代码,对于 n,此 window 的前半部分计算为

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

然后得到完整的window作为w = [w; w(end:-1:1)]。除了数值精度问题(这可能是 Matlab 只计算一半然后镜像它的原因),这相当于

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

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

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

这是 Matlab 的 hann(n),如其 documentation 中所述。