在NumPy中创建2D汉宁窗、海明窗、布莱克曼窗和高斯窗口。

5

我有兴趣在NumPy中创建2D的Hanning、Hamming、Blackman等窗口。我知道NumPy存在针对1D版本的现成函数,例如np.blackman(51)np.hamming(51)np.kaiser(51)np.hanning(51)等。

如何创建它们的2D版本?我不确定以下解决方案是否正确。

window1d = np.blackman(51)
window2d = np.sqrt(np.outer(window1d,window1d)) 

问题在于np.sqrt只接受正数值,而np.outer(window1d,window1d)肯定会有一些负数值。解决方案之一是放弃使用np.sqrt

有什么建议可以将这些1d函数扩展到2d吗?

1个回答

4

我觉得这看起来很合理。如果你想验证你正在做的事情是否合理,你可以尝试绘制出你正在创建的内容。

import numpy as np
import matplotlib.pyplot as plt


x = np.linspace(0, 1.5, 51)
y = np.linspace(0, 1.5, 51)

window1d = np.abs(np.blackman(51))
window2d = np.sqrt(np.outer(window1d,window1d))

X, Y = np.meshgrid(x, y)
Z = window2d

fig = plt.figure()
ax = plt.axes(projection='3d')
ax.contour3D(X, Y, Z, 50, cmap='viridis')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z');

plt.show()

这给出了 -

enter image description here

这似乎是1D图的二维推广,如下所示 -

enter image description here

然而,在最初创建1D版本时,我必须执行window1d = np.abs(np.blackman(51)),否则你最终将得到可变成小负值的2D数组,而无法进行sqrt

免责声明:我不熟悉函数或它们的常规使用情况。但是这些图的形状似乎是有意义的。如果这些函数的用例中实际值很重要,那么这可能会有所偏差。


谢谢,但取绝对值可能会改变它们的频谱。 - Mohit Lamba
1
虽然我不是信号处理方面的专家,但如果您要用它进行平滑处理,我认为直接使用应该可以。因为这个函数似乎从零开始,并且唯一出现的负值非常小(在10^-17的数量级),而且似乎只有一个值。您确定不能忽略它吗? - Ananda
我同意你的观点,负值非常非常小,因此我认为忽略它们是可以的,尽管我的意图不是为了平滑。 - Mohit Lamba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接