[英]Scipy FFT Frequency Analysis of very noisy signal
我有噪聲數據,我想為其計算頻率和幅度。 每 1/100 秒收集一次樣品。 從趨勢來看,我相信頻率是 ~ 0.3
當我使用numpy
fft
模塊時,我最終得到了非常高的頻率(36.32 /秒),這顯然是不正確的。 我嘗試使用pandas
rolling_mean
過濾數據以在 fft 之前去除噪音,但這也不起作用。
import pandas as pd
from numpy import fft
import numpy as np
import matplotlib.pyplot as plt
Moisture_mean_x = pd.read_excel("signal.xlsx", header = None)
Moisture_mean_x = pd.rolling_mean(Moisture_mean_x, 10) # doesn't helps
Moisture_mean_x = Moisture_mean_x.dropna()
Moisture_mean_x = Moisture_mean_x -Moisture_mean_x.mean()
frate = 100. #/sec
Hn = fft.fft(Moisture_mean_x)
freqs = fft.fftfreq(len(Hn), 1/frate)
idx = np.argmax(np.abs(Hn))
freq_in_hertz = freqs[idx]
有人可以指導我如何解決這個問題嗎?
你是對的,有什么不對。 需要明確地向 pandas 詢問第零列:
Hn = np.fft.fft(Moisture_mean_x[0])
否則會發生一些錯誤,您可以通過 FFT 結果不對稱的事實看出這一點,實際輸入應該是這種情況。
似乎@tillsten已經回答了您的問題,但這里有一些額外的確認。 第一個圖是您的數據(零均值,我將其更改為 csv)。 第二個是功率譜密度,您可以看到峰值為 ~0.3 Hz 的脂肪量。 我“放大”了第三幅圖,看看是否有第二個隱藏頻率接近主頻率。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
x = pd.read_csv("signal.csv")
x = np.array(x, dtype=float)[:,0]
x = x - np.mean(x)
fs = 1e2
f, Pxx = signal.welch(x, fs, nperseg=1024)
f_res, Pxx_res = signal.welch(x, fs, nperseg=2048)
plt.subplot(3,1,1)
plt.plot(x)
plt.subplot(3,1,2)
plt.plot(f, Pxx)
plt.xlim([0, 1])
plt.xlabel('frequency [Hz]')
plt.ylabel('PSD')
plt.subplot(3,1,3)
plt.plot(f_res, Pxx_res)
plt.xlim([0, 1])
plt.xlabel('frequency [Hz]')
plt.ylabel('PSD')
plt.show()
Hn = fft.fft(x)
freqs = fft.fftfreq(len(Hn), 1/fs)
idx = np.argmax(np.abs(Hn))
freq_in_hertz = freqs[idx]
print 'Main freq:', freq_in_hertz
print 'RMS amp:', np.sqrt(Pxx.max())
這打印:
Main freq: 0.32012805122
RMS amp: 0.0556044913489
FFT 是一個濾波器組。 只要看看幅度峰值只在FFT結果(而不是整個結果向量)預期的頻率范圍內,而其他大部分頻譜基本上將被過濾掉。
沒有必要預先對信號進行濾波,因為 FFT是一個濾波器。 只需跳過與您知道包含大量噪聲的頻率相對應的 FFT 部分 - 將它們歸零,或以其他方式排除它們。
我希望這可以幫助你。
https://scipy-cookbook.readthedocs.io/items/ButterworthBandpass.html
在應用 FFT 之前,您應該只過濾預期頻率附近的頻帶並提高信噪比。
編輯:
Mark Ransom 給出了一個更聰明的答案,如果你必須做 FFT,你可以在轉換后切斷噪音。 它不會給出比過濾器更糟糕的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.