9

假设我有一个包含一百个测量值的时间序列 t,每个条目代表每天的测量值。我假设信号中存在一定的周期性——它可能每天、每周或每月重复一次。

将时间序列转换为傅立叶域可能有助于找到这样的周期性?

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

4

3 回答 3

6

我的目标是回答我自己的问题。你可以在适当的地方纠正我。

假设我们的时间序列 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,这意味着信号在一个完整周期内占用六个时间单位。

请让我知道我的理解是否正确。

于 2017-06-28T14:59:43.340 回答
1

请注意,FFT 会发现正弦分解,这与周期性估计器不同(因为任何基本周期都可能完全从周期性信号的频谱中丢失。请参阅缺少的基本周期)

因此,您需要使用倒谱(使用复杂的倒谱分析等)对 FFT 结果进行后处理,或者使用谐波乘积谱估计器。

于 2017-06-29T19:39:25.853 回答
1

还有另一种不依赖傅立叶级数的方法。此方法可帮助您识别信号是否是周期性的。理想情况下,在这种情况下,时间序列应该是二进制的:

[0,1,0,0,0,1,1,0,0,0,1,0,0,1]

您首先计算连续峰值位置之间的距离分布。然后,您计算因子

-1<B<1:

B = (var - mean)/(var + mean)

meanvar respectively the mean and the variance of the computed distribution. The closerB to-1 the more periodic the signal is. IfB` 接近 0 时,信号没有周期性,峰值在时间序列中随机分布。

有关更多信息,请查找关键字 Burstiness。

于 2019-12-02T16:15:34.417 回答