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

3

假设我有一个全是0的数组:

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个回答

4

1

作为一种分析技术,acf/pacf/ccf被用于识别时间依赖信号中的周期性,因此自相关图或偏自相关图的图形显示会显示出不同滞后下信号的自相似性(例如,如果你看到y轴上的值在滞后12时达到峰值,并且你的日期是以月为单位的,那么这就是年度周期性的证据)。

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

另一方面,如果你想识别信号中给定类型的连续(未中断)流,则“run-length encoding”可能是你想要的:

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

好的,但我实际上想要检测周期性。因此,如果我有 [0,0,0,1,0,0,0,1,0,0,0,1],采样率为 10Hz,我想要的结果是 2.5Hz...同样地,如果存在两个“信号”(例如[0,0,0,1,1,0,0,1,0,1,0,1],在第5、10等位置添加了另一个信号),我想要得到 2.5Hz 和 2Hz。不需要具体数值,只需要像直方图上的峰值或类似的东西... - rytis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接