繁体   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