如何从 FFT 图中检查信号是否是周期性的?
信息处理
fft
自由度
周期性的
2022-02-15 11:22:09
2个回答
这回答了“测试问题”而不是直接回答标题
取决于问题想要什么。两种可能:
- “是”,因为“完整”DFT在两个域中都是周期性的
- “是”,因为“定期”是指持有一些, 并且对于有限序列中的整数个周期
案例 2 会abs(FFT)在其他所有 bin 中产生一个为零的值:
在你的情况下这显然是正确的(如果我们重复x更多次,我们会得到更多的零)
非“测试题”,简要
对于更现实的事情,一个简短的答案是
- 无法分辨
abs(FFT):abs抛出阶段,它决定了各种调制的实际位置,这是决定模式是否按顺序重复的关键信息。整数周期的情况是一个(不切实际的)例外。 - 单独的 FFT 太弱了:如果感兴趣的周期性序列中存在的任何调制也存在于其他地方,它将在 FFT 域中重叠并污染我们的读数。像 STFT 和 CWT 这样的时频方法更适合,因为它们可以解开调制及其相对位置。然后,我们将应用自相似性度量或模板匹配(如自相关)来确定某些模式是否重复。
- 无论我们做什么,如果没有额外的知识(例如系统的物理特性) ,我们就无法判断测量间隔之外是否有任何周期性
代码
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
x0 = np.random.randn(12)
x0f = rfft(x0)
x1 = np.hstack([x0, x0])
x1f = rfft(x1)
# it won't look same, I used my own plot library
plt.plot(np.abs(x0f)); plt.show()
plt.plot(np.abs(x1f)); plt.show()
如果您有 1000 个样本x并采用fft(我假设是 MATLAB),您会发现Xf.
这些样本的频率间隔等于采样率除以样本数,因此:df = fa / length(Xf). FFT 的常规排序是从 0 到采样率的一半,然后是采样率的 - 一半回到 0,因此总跨度是 - 到 +奈奎斯特速率。
使用此信息更新绘图上的轴:
df = fa / length(Xf);
stem((0 : 99) * df; abs(Xf(1 : 100)))
xlabel('Frequency (Hz)')
由于您只有一个数据样本,因此无法确定信号是否是周期性的。它可能在您测量它的地方之外有任何行为,无论是否定期。你可以做什么谈论你采样的数据中的频率内容,这确实是你在你的图中所拥有的。

