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.hanning
和 scipy.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 的 hanning
是 hann
,而不是 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 中所述。
我一直在研究低通滤波器,应该使用 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.hanning
和 scipy.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 的 hanning
是 hann
,而不是 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 中所述。