检测数据流中的周期性重复

时间:2010-04-08 09:44:58

标签: math numpy fft

假设我有一个零数组:

a = numpy.zeros(1000)

然后我介绍一些重复的'事件':

a[range(0, 1000, 30)] = 1

问题是,如何检测那里的“信号”?因为如果我进行“常规”FFT,它远非理想信号,我无法清楚地指出我的“真实”信号在哪里:

f = abs(numpy.fft.rfft(a))

有没有一种方法能够在一定程度上确定地检测这些重复?特别是如果我混入的很少,例如:

a[range(0, 1000, 30)] = 1
a[range(0, 1000, 110)] = 1
a[range(0, 1000, 48)] = 1

我想在结果数据上得到三个“尖峰”......

2 个答案:

答案 0 :(得分:3)

您是否考虑过使用autocorrelation

答案 1 :(得分:0)

作为分析技术,使用acf / pacf / ccf 为了识别与时间相关的信号的周期性,因此相关图,acf或pacf的图形显示,在信号中显示作为不同滞后的函数的自相似性。 (例如,如果您看到y轴上的值在滞后12处达到峰值,并且如果您的日期是以月为单位,那么这就是年度周期性的证据。)

要计算并绘制“相似度”与滞后,如果您不想自己滚动,我不知道原生的Numpy / Scipy选项;我也找不到'时间序列'scikit中的一个(Scipy'Scikits中的一个库,特定于域的模块,不包括在标准Scipy发行版中),但值得再次检查。另一种选择是将Python绑定安装到R(RPy2,在SourceForge上可用),这将允许您访问相关的R函数,包括“ acf ”,它将通过传入来计算和绘制相关图你的时间序列和调用函数。

另一方面,如果您想在信号中识别给定类型的连续(不间断)流,那么“游程编码”可能就是您想要的:

import numpy as NP
signal = NP.array([3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,7,7,7,7,7,4,4,1,1,1,1,1,1,1])
px, = NP.where(NP.ediff1d(signal) != 0)
px = NP.r_[(0, px+1, [len(signal)])]
# collect the run-lengths for each unique item in the signal
rx = [ (m, n, signal[m]) for (m, n) in zip(px[:-1], px[1:]) ]

# returns [(0, 9, 3), (9, 19, 0), (19, 24, 7), (24, 26, 4), (26, 33, 1)]
# so w/r/t first 3-tuple: '3' occurs continuously in the half-open interval 0 and 9, and so forth