使用numpy的傅里叶变换查找时间序列的最可能周期性?

时间:2017-06-28 12:59:29

标签: python numpy fft periodicity

假设我有一个时间序列t,有100个测量值,每个条目代表每天的测量值。我假设信号中有一些周期性 - 它可能每天,每周或每月重复。

将时间序列翻译成傅里叶域可能有助于找到这样的周期性?

我如何使用numpy的fft模块找到我的时间序列最有可能的时期?

3 个答案:

答案 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。