【问题标题】:Hamming Window, python 2.7汉明窗口,python 2.7
【发布时间】:2017-12-02 22:16:34
【问题描述】:

您好,我有一个非常嘈杂的 FFT。如何应用到我的代码汉明窗口以减少噪音。看我的代码:

plt.subplot(212)
plt.title('Fast Fourier Transform')
plt.ylabel('Power [a.u.]')
plt.xlabel('Frequency Hz')
fft1 = (Bx[51:-14])
fft2 = (By[1:-14])

for dataset in [fft1]:
    dataset = np.asarray(dataset)
    psd = np.abs(np.fft.fft(dataset))**2.5
    freq = np.fft.fftfreq(dataset.size, float(300)/dataset.size)
    plt.semilogy(freq[freq>0], psd[freq>0]/dataset.size**2, color='r')

for dataset2 in [fft2]:
    dataset2 = np.asarray(dataset2)
    psd2 = np.abs(np.fft.fft(dataset2))**2.5
    freq2 = np.fft.fftfreq(dataset2.size, float(300)/dataset2.size)
    plt.semilogy(freq2[freq2>0], psd2[freq2>0]/dataset2.size**2, color='b')

什么是 plt.show()

我需要的是:

我见过 (https://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.signal.hamming.html) 和这个 (https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.hamming.html) 但仍然不知道如何将它应用到我的代码中。有任何想法吗?正如我所说,您在第二张图片中看到了我需要的东西。 也许布莱克曼窗口也可以很好地应用,但仍然不知道如何添加它。

应用这个:

freqs, psd = scipy.signal.welch(dataset, fs=300, window='hamming')

给我那个,它看起来不像我想要的图表。

【问题讨论】:

  • 看起来 300 不是实际的采样率。我是根据您的问题猜测的,因此请使用您的实际采样率(可能在 900 左右?)。此外,请记住,Welch 的方法通过牺牲频率分辨率来计算更平滑的功率谱估计。

标签: python python-2.7 numpy hamming-code hamming-window


【解决方案1】:

您似乎正在尝试估计信号的功率谱。如果是这种情况,您可以使用类似scipy.signal.welch 的函数,该函数通过计算重叠数据段的 FFT 来估计平滑频谱。您可以直接将window 关键字参数传递给该方法,例如'hamming''blackman'

编辑:

将此应用于您的数据,您将执行以下操作:

freqs, psd = scipy.signal.welch(dataset, fs=300, window='hamming')

这将返回这些频率的频率和功率。我在这里假设 300 是您的采样率(根据您在问题中对 freq 的计算)。

【讨论】:

  • @Hiddenguy 你是什么意思?您可以查看文档以获取有关如何使用它的详细信息。简而言之,将信号和采样率传递给它,它会返回这些频率的频率和功率。
  • 我将文档的两个网页应用于我的问题,但我不知道如何将它们实现到我的代码中。那你能帮忙吗?
  • 使用 Welch 毫无意义,因为结果总是会出错。我认为我的方法是正确的,我只需要从图表中消除那么多噪音。
  • @Hiddenguy 结果并非“总是会出错”。韦尔奇的方法实际上是为您要解决的问题创建。您可能没有使用正确的采样率,并且您可能需要使用各种关键字参数来获得所需的结果。您也可以尝试直接平滑您在问题中计算的功率谱,但与 Welch 的方法相比,这将是次优的。如果你走那条路,你就没有正确计算功率。应该是np.square(np.abs(np.fft.fft(signal)))。您使用 2.5 作为指数,它应该是 2.0。
【解决方案2】:

看来welch方法是正确的,所以我想到了我的问题,这就是答案。

   # Loop for FFT data
    for dataset in [fft1]:
        dataset = np.asarray(dataset)
        freqs, psd = welch(dataset, fs=266336/300, window='hamming', nperseg=8192)
        plt.semilogy(freqs, psd/dataset.size**2, color='r')

    for dataset2 in [fft2]:
        dataset2 = np.asarray(dataset2)
        freqs2, psd2 = welch(dataset2, fs=266336/300, window='hamming', nperseg=8192)
        plt.semilogy(freqs2, psd2/dataset2.size**2, color='b')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多