在Python和Matlab中,汉宁窗口值不匹配
我一直在使用低通滤波器,它应该是使用Hann窗口和一些自定义数字滤波器过滤.wav文件 我为Matlab编写了全部代码,今天我确实用Python编写了它,但是当我开始比较Python x Matlab中hann函数的值时,它与 蟒蛇汉宁 汉宁10 数组[0,0.1169778,0.41317591,0.75,0.96984631,0.96984631,0.75,0.41317591,0.1169778,0] %汉宁 汉宁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计算相同的窗口。 函数包括窗口末尾的零值。要匹配问题中显示的Matlab函数的输出,请在scipy.signal.hann的参数中添加2,然后丢弃末端的零:在Python和Matlab中,汉宁窗口值不匹配,python,matlab,numpy,scipy,signal-processing,Python,Matlab,Numpy,Scipy,Signal Processing,我一直在使用低通滤波器,它应该是使用Hann窗口和一些自定义数字滤波器过滤.wav文件 我为Matlab编写了全部代码,今天我确实用Python编写了它,但是当我开始比较Python x Matlab中hann函数的值时,它与 蟒蛇汉宁 汉宁10 数组[0,0.1169778,0.41317591,0.75,0.96984631,0.96984631,0.75,0.41317591,0.1169778,0] %汉宁 汉宁10 %ans= % 0.0794 % 0.2923 %
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])
在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])
TL;西铁:
它们使用不同的定义。Matlab相当于Numpy的hanning是hann,而不是hanning
在Matlab中,hanningn创建了一个对称窗口。根据文件hanning.m中的代码,对于偶数n,此窗口的前半部分计算为
m = n/2;
w = .5*(1 - cos(2*pi*(1:m).'/(n+1)))
然后得到完整的窗口w=[w;wend:-1:1]。除了数值精度问题,这可能是Matlab只计算一半然后镜像它的原因,这相当于
w = .5*(1 - cos(2*pi*(1:n).'/(n+1)));
在Numpy,根据,公式是不同的。在Matlab语法中,它对应于
w = .5*(1 - cos(2*pi*(0:n-1).'/(n-1)));
这是Matlab的hannn,如its中所述。TL;西铁:
它们使用不同的定义。Matlab相当于Numpy的hanning是hann,而不是hanning
在Matlab中,hanningn创建了一个对称窗口。根据文件hanning.m中的代码,对于偶数n,此窗口的前半部分计算为
m = n/2;
w = .5*(1 - cos(2*pi*(1:m).'/(n+1)))
然后得到完整的窗口w=[w;wend:-1:1]。除了数值精度问题,这可能是Matlab只计算一半然后镜像它的原因,这相当于
w = .5*(1 - cos(2*pi*(1:n).'/(n+1)));
在Numpy,根据,公式是不同的。在Matlab语法中,它对应于
w = .5*(1 - cos(2*pi*(0:n-1).'/(n-1)));
这是Matlab的hannn,如its中所述。请用两种语言编写代码。Matlab信号处理工具箱中有hann和hamming。MATLAB没有汉宁函数。这是你自己编写的函数,还是从其他第三方来源获得的函数?事实上,你的MATLAB输出看起来像来自hamming,是你使用的吗?@Cris MATLAB是汉宁的,只是没有文档记录,而且可能deprecated@Luis:如果我在文档中找不到它,它就不存在了!:请用这两种语言编写代码。MATLAB信号处理工具箱中有hann和hamming。MATLAB没有汉宁函数。这是你自己编写的函数,还是从其他第三方来源获得的函数?事实上,你的MATLAB输出看起来像来自hamming,是你使用的吗?@Cris MATLAB是汉宁的,只是没有文档记录,而且可能deprecated@Luis:如果我在文档中找不到它,它就不存在了!:P