2017-12-02 129 views
0

嗨,我有一個相當嘈雜的FFT。如何申請我的代碼漢明窗口,以減少噪音。看看我的代碼:海明窗口,python 2.7

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),但仍不要沒有線索如何將其應用於我的代碼。有任何想法嗎?正如我所說你在第二張照片中看到了我需要的東西。 也許布萊克曼的窗戶也會很好的應用,但是還不知道如何添加它。

應用此:

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

給我說,它不會出現像我期望的圖表。

enter image description here

+0

它看起來像300不是實際的採樣率。我猜根據你的問題,所以使用你的實際採樣率(可能在900左右)。另外,請記住,Welch的方法通過犧牲頻率分辨率來計算功率譜的更平滑估計。 – bnaecker

回答

0

似乎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') 
1

好像你正試圖估算你的信號的功率譜。如果是這種情況,您可以使用類似scipy.signal.welch函數的函數,該函數通過計算來自重疊數據段的FFT來估計平滑頻譜。您可以直接傳遞方法window關鍵字參數,例如'hamming''blackman'

編輯:

將此應用於你的數據,你會做這樣的事情:

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

這將在這些頻率返還的頻率和功率。我在這裏假設300是你的採樣率(從你的問題中計算freq)。

+0

你能建議代碼的樣子嗎? – Hiddenguy

+0

@Hiddenguy你是什麼意思?您可以查看文檔以瞭解如何使用它的詳細信息。簡單地說,傳遞一個信號和採樣率,它將返回這些頻率的頻率和功率。 – bnaecker

+0

我向我的問題申請了兩個文檔的網頁,但我不知道如何將它們實現到我的代碼中。那麼你能幫忙嗎? – Hiddenguy