【问题标题】:Create 2D hanning, hamming, blackman, gaussian window in NumPy在 NumPy 中创建 2D 汉宁、汉明、布莱克​​曼、高斯窗口
【发布时间】:2021-01-28 15:26:29
【问题描述】:

我有兴趣在 NumPy 中创建 2D 汉宁、汉明、布莱克​​曼等窗口。我知道 NumPy 中存在现成的函数,用于它的一维版本,例如 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

有什么建议可以将这些一维函数扩展到二维吗?

【问题讨论】:

    标签: numpy signal-processing fft dft


    【解决方案1】:

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

    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 版本时必须使用 window1d = np.abs(np.blackman(51)),因为否则,您最终会在最终的 2D 数组中得到小的负值,而您无法使用 sqrt

    免责声明:我不熟悉这些功能或它们通常的用例。但这些地块的形状似乎是有道理的。如果这些函数的用例在某个地方对实际值很重要,那么它可能会被关闭。

    【讨论】:

    • 谢谢,但取绝对值可能会改变它们的频谱。
    • 再说一次,不是信号处理方面的专家,但如果你用它来平滑,我认为按原样使用它应该可以工作。因为该函数似乎从零开始,并且弹出的唯一负值非常小(大约为 10^-17),而且它似乎也只是一个值。你确定不能忽略它吗?
    • 我同意你的观点,负值非常非常小,因此我认为可以忽略它们,尽管我的意图不是平滑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多