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

2024-09-30 16:26:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在一个低通滤波器,应该是过滤一个.wav文件使用汉恩窗口和一些自定义数字滤波器。在

我完成了Matlab的全部代码,今天我用Python编写了它,但是当我开始比较pythonxmatlab中hann函数的值时,它没有任何关系。。。在

#python hanning
hanning(10)
# array([0., 0.11697778, 0.41317591, 0.75, 0.96984631, 0.96984631, 0.75, 0.41317591, 0.11697778, 0.])
^{pr2}$

Tags: 文件函数代码关系数字arraywavmatlab
2条回答

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

numpy.hanning和{}计算相同的窗口。 函数包括窗口末尾的零值。要匹配您在问题中显示的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;WR:

它们使用不同的定义。Matlab相当于Numpy的hanninghann,而不是{}。在


在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只计算一半然后镜像的原因),这相当于

^{pr2}$

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

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

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

相关问题 更多 >