假设我有一个包含一百个测量值的时间序列 t,每个条目代表每天的测量值。我假设信号中存在一定的周期性——它可能每天、每周或每月重复一次。
将时间序列转换为傅立叶域可能有助于找到这样的周期性?
我如何使用 numpy 的 fft 模块为我的时间序列找到最可能的时期?
假设我有一个包含一百个测量值的时间序列 t,每个条目代表每天的测量值。我假设信号中存在一定的周期性——它可能每天、每周或每月重复一次。
将时间序列转换为傅立叶域可能有助于找到这样的周期性?
我如何使用 numpy 的 fft 模块为我的时间序列找到最可能的时期?
我的目标是回答我自己的问题。你可以在适当的地方纠正我。
假设我们的时间序列 tt = [2,1,0,1,2,3,2,1,0,1,2,3,2,1,0,1,2,3]
有 18 个测量值。一个相当简单的例子:周期的长度似乎很可能是六个时间单位。
将此时间序列带入频域会得出:
w = numpy.fft.fft(t)
print numpy.absolute(w)
array([27.000000, 0.000000, 0.000000, 12.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000, 3.000000, 0.000000, 0.000000,
0.000000, 0.000000, 0.000000, 12.000000, 0.000000, 0.000000])
我们忽略频率 0 并观察到索引 3 的值最大——这表明在我们的时间序列 t 内,信号重复了 3 次。因此,信号的长度——周期——将是 18/3 = 6。事实上:
numpy.fft.fftfreq(18)
array([ 0. , 0.055556, 0.111111, 0.166667, 0.222222, 0.277778,
0.333333, 0.388889, 0.444444, -0.5 , -0.444444, -0.388889,
-0.333333, -0.277778, -0.222222, -0.166667, -0.111111, -0.055556])
索引 3 处的频率正好是 1/6,即一个时间单位的频率是 1/6,这意味着信号在一个完整周期内占用六个时间单位。
请让我知道我的理解是否正确。
请注意,FFT 会发现正弦分解,这与周期性估计器不同(因为任何基本周期都可能完全从周期性信号的频谱中丢失。请参阅缺少的基本周期)
因此,您需要使用倒谱(使用复杂的倒谱分析等)对 FFT 结果进行后处理,或者使用谐波乘积谱估计器。
还有另一种不依赖傅立叶级数的方法。此方法可帮助您识别信号是否是周期性的。理想情况下,在这种情况下,时间序列应该是二进制的:
[0,1,0,0,0,1,1,0,0,0,1,0,0,1]
您首先计算连续峰值位置之间的距离分布。然后,您计算因子
-1<B<1:
B = (var - mean)/(var + mean)
当mean
var respectively the mean and the variance of the computed distribution. The closer
B to
-1 the more periodic the signal is. If
B` 接近 0 时,信号没有周期性,峰值在时间序列中随机分布。
有关更多信息,请查找关键字 Burstiness。