假设我有一个时间序列t,有100个测量值,每个条目代表每天的测量值。我假设信号中有一些周期性 - 它可能每天,每周或每月重复。
将时间序列翻译成傅里叶域可能有助于找到这样的周期性?
我如何使用numpy的fft模块找到我的时间序列最有可能的时期?
答案 0 :(得分:2)
我的目标是回答我自己的问题。你可以在适当的地方纠正我。
假设我们的时间序列t是t = [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,这意味着信号在整个周期内需要六个时间单位。
如果我的理解是正确的,请告诉我。
答案 1 :(得分:0)
注意,FFT会发现正弦分解,这与周期性估计不同(因为周期信号的频谱中任何基本周期都可以完全丢失。参见missing fundamental)
因此,您需要使用倒谱(使用复数倒谱分析等)对FFT结果进行后处理,或者使用谐波产品谱估算器。
答案 2 :(得分:0)
还有另一种不依赖于傅立叶级数的方法。这种方法可以帮助您 识别信号是否为周期性。理想情况下,在这种情况下,时间序列应为二进制:
[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。