簡體   English   中英

非常嘈雜的信號的 Scipy FFT 頻率分析

[英]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,你可以在轉換后切斷噪音。 它不會給出比過濾器更糟糕的結果。

您應該使用低通濾波器,它應該保持較大的周期性變化並首先平滑一些較高頻率的東西。 之后,然后可以進行FFT以獲得峰值。 這是通常用於這種確切類型的FIR 濾波器配方

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM