假设我有一个零数组:
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
我想在结果数据上得到三个“尖峰”......
答案 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