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

Power spectral density of real accelerometer data shows outlier at 0 Hz

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

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

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

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

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

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

这是由于 signal.periodigram 默认执行的去趋势处理。

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

我生成了假数据,只是高斯噪声,y-offset 为 5,与您的数据相似。您可以从下图中看到去趋势删除了 zero-frequency 分量,而设置 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')