我收集的加速度计数据的频率约为50 Hz(每0.02秒,正如Android所允许的那样...)
这是数据的10秒窗口的幅度图,我想在该窗口上估算功率谱密度:
像这样应用scipy.signal.periodogram
fs = 50
f, Pxx_den = signal.periodogram(x, fs)
plt.semilogy(f, Pxx_den)
plt.show()
该大纲工具是预期的吗?我想用3个最高的PSD来提供机器学习算法,但轮廓线为0会使我认为出现了问题。还是不是这样? FFT的应用还会导致0 Hz处的高幅度。
答案 0 :(得分:4)
这是由于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')