代码之家  ›  专栏  ›  技术社区  ›  Hiddenguy

汉明窗口,python 2.7

  •  1
  • Hiddenguy  · 技术社区  · 7 年前

    嗨,我有一个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()是 enter image description here

    我需要的是: enter image description here

    我看到了( 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 )但仍然不知道如何将其应用到我的代码中。有什么想法吗?正如我所说,你在第二张图片中看到了我需要的。 也许Blackman窗口也可以很好地应用,但仍然不知道如何添加它。

    应用此项:

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

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

    enter image description here

    2 回复  |  直到 7 年前
        1
  •  4
  •   bnaecker    7 年前

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

    编辑:

    将其应用到数据中,您可以执行以下操作:

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

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

        2
  •  0
  •   Hiddenguy    6 年前

    韦尔奇方法似乎是正确的,所以我思考了我的问题,下面是答案。

       # 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')
    
    推荐文章