python - 实际加速度计数据的功率谱密度显示 0 Hz 处的异常值

标签 python scipy signal-processing fft

我以大约 50 Hz 的频率(每 0.02 秒一次,正如 Android 所允许的那样...)收集加速度计数据

这是 10 秒数据窗口的幅度图,我想在其上估计功率谱密度:

Magnitudes of accelerometer data

像这样应用 scipy.signal.periodogram 之后

fs = 50
f, Pxx_den = signal.periodogram(x, fs)
plt.semilogy(f, Pxx_den)
plt.show()

我得到了以下图表,显示了 0 Hz 的大纲: enter image description here

这个大纲是预期的吗?我想为机器学习算法提供 3 个最高的 PSD,但大纲为 0 让我觉得出了点问题。或者事实并非如此?应用 FFT 还会导致 0 Hz 处的高振幅。

最佳答案

这是由于 signal.periodigram 默认执行的去趋势化操作。

去趋势是从数据中删除常数项或线性项(通常),默认为常数去趋势。这有效地减去了估计 PSD 的每个数据部分的平均值。减去均值相当于从频谱中去除直流或零频分量。

我生成了假数据,只是高斯噪声,y 偏移为 5,与您的数据类似。您可以从下图中看到,去趋势删除了零频分量,而设置 detrend=False 则保留了它。但是请记住,去除趋势实际上可能很有用。您可能关心也可能不关心,这取决于您感兴趣的分析类型。

from scipy import signal
import numpy as np
import matplotlib.pyplot as plt

x = np.random.randn(1000,) * 2.0 + 5.0 # White noise data, with y-offset
fs = 50.0
f, detrended_psd = signal.periodogram(x, fs)
_, psd = signal.periodogram(x, fs, detrend=False)
fig, ax = plt.subplots()
ax.semilogy(f, detrended_psd, linewidth=3.0, label='Detrended')
ax.semilogy(f, psd, linewidth=1.0, label='Not detrended')
fig.tight_layout()
ax.set_xlabel('Frequency (Hz)')
ax.set_ylabel('PSD')

enter image description here

关于python - 实际加速度计数据的功率谱密度显示 0 Hz 处的异常值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56827434/

相关文章:

python - 如何检测用户是否是第一次使用我的文件?

python - 如果坐标对不在列表中,则从数据框中删除

audio - 用于音频信号处理的滤波器?

Android如何检测烟雾报警器的声音

python - 绘制 scikit-learn (sklearn) SVM 决策边界/曲面

python - PySide:为什么在另一个 QmainWIndow(Main) 中触发 QAction 时 QMainWindow flask 并消失

Python:将带有参数的函数传递给函数

python - Scipy.ode "Error test failed repeatedly"

python - 删除包含少于 (N) 个像素的点

Python Pandas 移动平均滞后