需要更好的步数检测算法

信息处理 信号分析 时间序列
2022-01-19 10:05:25

我有一个包含很多步骤/跳跃的时间序列(此处的数据文件)。下面给出了一个情节。我想为这些方波特征中的每一个减去一个适当的值,以使它们回到信号的基线。中值滤波器非常适合连续去除少量异常值,但在这种情况下,我可能需要一种不同的方法,因为方波跳跃可以有不同的持续时间。我见过的一种常用方法是计算相邻样本的一阶差异,并寻找较大的差异来检测跳跃。我实现了这个方法,但问题是它经常失败,因为该方法的一个可调参数是一个阈值t为了检测跳跃,第一个差异必须交叉:

|xi+1xi|>t
如下图所示,我的跳跃通常大小不同,因此恒定阈值不是最佳方法。特别是,在某些情况下,有一个有趣的信号,即相邻样本可以发生很大的变化而不会发生跳跃!我用红色突出显示了这样一个区域。

时间序列

下面是红框区域的放大视图。您可以看到有一个方波跳跃,然后是一个有趣的信号。红色箭头描绘了一个位置,其中来自感兴趣信号的相邻样本之间的距离大于信号中的某些跳跃。因此,具有有限差分的恒定阈值方法对我不起作用。

有谁知道检测和减去方波跳跃以得到平滑变化的信号而没有跳跃的稳健程序?我确定这一定是一个已解决的问题,但我在网上搜索时运气不佳。

在此处输入图像描述

3个回答

这是一个有趣的问题。我已经下载了您的数据并编写了一个小程序来处理它。

缺少似乎与跳跃无关的数据点。

在我看来,最好的方法是寻找匹配的跳跃值并调整其间的值。第一步是测量从点到点的跳跃的 RMS 以测量典型的跳跃大小。接下来,我确定了超过 RMS 四倍的跳跃。

这些是结果:

跳跃 RMS = 1.270752

1262310195,-29.989300 下
1262310259, 30.380400 向上
1262310355,-7.228400 下
1262310364, 5.666300 向上
1262310438, 6.014400 向上
1262311415, 30.857000 向上
1262311626,-14.630000 下
1262311627,-15.643500 下
1262312656,-16.754800 下
1262312657, -10.732500 下
1262312859, 29.599500 向上
1262313801, 5.085400 向上
1262314529, 31.463000 向上
1262314694,-30.519800 下
1262316412,-29.813200 下
1262316483, 29.996800 向上
1262316604, -5.110200 下
1262316612, -5.084100 下
1262316614, 8.913200 向上
1262316618,-10.073700 下
1262316620, 10.929100 向上
1262316621, 6.930200 向上
1262316623, -5.136700 下
1262316624, 8.932800 向上
1262316625, -6.066600 下
1262316628, 17.934800 向上
1262316630, -7.129600 下
1262316631, -11.064500 下
1262316659, 6.889600 向上
1262316661,-5.111200 下
1262316663, -8.125000 下
1262316665, 11.254100 向上
1262316667, -9.666300 下
1262316668, 6.854200 向上
1262316680,-7.209700 下
1262316689, -7.270200 下
1262317545, 29.889600 向上
1262317785, -29.615400 下
1262318838,-17.595400 下
1262318839,-12.571100 下
1262319054, 29.935400 向上
1262319539,-17.311700 下
1262319540,-11.272300 下
1262319567, 30.747600 向上
1262320679, 30.134800 向上
1262320869,-30.649600 下
1262322664, -29.883400 下
1262322703, 30.569600 向上
1262323699, 29.895000 向上
1262323975,-29.298600 下
1262325018,-17.261100 下
1262325019,-11.246300 下
1262325269, 15.262600 向上
1262325270, 13.273800 向上
1262326865, 30.136500 向上
1262327071, -29.004400 下

看起来现在只是匹配上下波动的问题。有一个问题是,同一方向的一些跳跃似乎是相邻的,因此需要两个数据点才能进行跳跃。

另一个问题是当跳跃匹配时,数值完全一样,所以想出一个正确的校正移位公式是另一个难题。

不管怎样,给我发一封电子邮件到 protonmail dot com 的 cedron,我会发给你到目前为止的源代码,也许还需要进一步的时间。

赛德

我设法使用以下步骤为这个问题找到了一个相当可靠的解决方案:

  1. 使用二阶高斯滤波器对信号进行平滑和微分:
    y(t)=d2dt2Gσ(t)x(t)
  2. 在中搜索零交叉y(t)并记录它们的位置(一阶导数滤波器将在每个边缘/跳跃处显示峰值。二阶滤波器将在边缘/跳跃的位置处有零交叉)。
  3. 遍历检测到的零交叉i(即边缘位置)并推动幅度|xi+1xi|进入一个双端队列。我保持队列中所有元素的累积总和及时向后延伸某个最大量(dt_max)。如果下一个跳跃幅度|xi+1xi|在累积和的某个相对误差容限内,算法确定发生了完整的跳跃序列,导致返回到原始信号基线。
  4. 当找到完整的跳跃序列时,将为跳跃的每个部分计算偏移量,以使所有片段下降到信号基线。在处理它们时,它们会从双端队列的后面弹出。

这个过程并不完美,仍然会错过一些跳跃,但即使在存在明显噪音的情况下也能捕捉到其中的大部分。

这并不完全是一个答案,而是试图进一步说明我在使用第一个差异方法时遇到的问题。在下图中,我关注与原始问题相同的区域。我添加了一条绿色中值滤波曲线(7点居中窗口),加上红色中值滤波曲线的一阶差分曲线(xi+1xi)。最后在蓝色中,我绘制了一个恒定的“阈值”值±4确定一个步骤。 在此处输入图像描述

您可以看到,第一个差异曲线(红色)很好地识别了跨步跳跃,但在 30:00 左右,红色曲线也超过了阈值,而实际上那里没有跳跃。由于时间序列稍后出现以下情况,我无法再增加阈值: 在此处输入图像描述 在这里,您可以看到连续两个步骤特征,其第一个差异没有完全通过±4临界点。所以这些跳跃没有被正确识别。所以问题变成了如何在存在阶跃的情况下“增强”一阶差分信号,同时在非阶跃情况下减少它,如上图第一张图。我的一个想法是计算前 N 个样本的中值绝对偏差 (MAD),并将第一个差值与 MAD 进行比较,而不是使用恒定阈值。但我也没有让这种方法很好地工作,因为有时 MAD 非常小,即使是适度的一阶差分值也会导致误报。

带有中值滤波器和一阶差分值的更新数据文件在此处我将不胜感激任何想法!