2

假设我有一个零数组:

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

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

4

2 回答 2

3

您是否考虑过使用自相关

于 2010-04-08T09:53:49.263 回答
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
于 2010-04-08T11:49:10.733 回答