我一直在研究低通滤波器,应该使用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
答案 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.hanning
和scipy.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])