在NumPy中创建2D hanning、hamming、blackman和gaussian窗口

在NumPy中创建2D hanning、hamming、blackman和gaussian窗口,numpy,signal-processing,fft,dft,Numpy,Signal Processing,Fft,Dft,我对在NumPy中创建2D hanning、hamming、Blackman等窗口感兴趣。我知道NumPy中有现成的1D版本的函数,如np.blackman(51),np.hamming(51),np.kaiser(51),np.hanning(51),等等 如何创建它们的二维版本?我不确定以下解决方案是否正确 window1d = np.blackman(51) window2d = np.sqrt(np.outer(window1d,window1d)) ---编辑 问题是np.sqrt

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

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

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

问题是
np.sqrt
只期望正值,而
np.outer(window1d,window1d)
肯定会有一些负值。一种解决方案是放弃
np.sqrt


关于如何将这些一维函数扩展到二维函数,有什么建议吗?

,我觉得很合理。如果您想验证您所做的是明智的,您可以尝试绘制您正在创建的内容

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()
这给-

这看起来像1d绘图的2d泛化,看起来像-

但是,在最初创建1d版本时,我必须执行
window1d=np.abs(np.blackman(51))
,因为否则,最终的2D数组中会出现小的负值,而不能采用
sqrt


免责声明:我不熟悉这些函数或它们的常用用例。但这些情节的形状似乎有道理。如果这些函数的使用情况是实际值很重要,则可能会关闭。

谢谢,但获取绝对值可能会改变它们的频谱。同样,不是信号处理专家,但如果您将其用于平滑,我认为按原样使用它应该会起作用。因为函数似乎从零开始,弹出的唯一负值非常小(以10^-17的顺序),而且似乎只有一个值。你确定不能忽略它吗?我同意你的观点,负值非常小,因此我认为忽略它们是可以的,尽管我的意图不是平滑。