在NumPy中创建2D hanning、hamming、blackman和gaussian窗口
我对在NumPy中创建2D hanning、hamming、Blackman等窗口感兴趣。我知道NumPy中有现成的1D版本的函数,如在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
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的顺序),而且似乎只有一个值。你确定不能忽略它吗?我同意你的观点,负值非常小,因此我认为忽略它们是可以的,尽管我的意图不是平滑。