过滤嘈杂的一维时间序列

问题描述

我有一个嘈杂的 1-Dimensional 时间序列,我想对其进行过滤以获得包含的“信号”。所讨论的时间序列是时间戳的集合,每个时间戳对应于某个“检测”的时间。 理想情况下,这些时间戳仅记录在某个已知周期发出脉冲的仪器的“信号”。然而,绝大多数数据点都是噪声。

我想过滤掉噪音,以便获得对应于“真实”检测(或接近它)的时间戳子序列。我不关心算法效率或这样做所花费的时间。同样,信号具有已知周期,而且,信号在我将要查看的数据部分的整个持续时间内都存在。但是,可能存在少量“遗漏”检测。

我们可以假设时钟精度和准确度。

我对 2-D 时间序列的过滤有点熟悉,但是我不确定如何处理这种特定情况。

解决方法

您能选出至少一个您确定正确的时间戳吗?因为那样你就可以重建一个无噪声的时间序列,比如:(伪代码)

timeseries = array(requisite_length)
for i from 0 to requisite_length:
    timeseries[i] = initial + i*period

如果你不确定,那会有点复杂。您基本上需要找到一个初始时间戳,该时间戳可以最大化落在该周期内的后续时间戳的数量。您或许可以这样做:

counts = array(length(timeseries)):
for i from 0 to length(timeseries):
    for j from i to length(timeseries):
        if floor(timeseries[j] - timeseries[i]) % period  == 0 OR ceil(timeseries[j] - timeseries[i]) % period  == 0:
            counts[i] += 1
start_idx = argmax(counts)

filtered_timeseries = array(counts[start_idx])
j = 0
for i from start_idx to length(timeseries):
    if floor(timeseries[i] - timeseries[start_idx]) % period  == 0 OR ceil(timeseries[i] - timeseries[start_idx]) % period  == 0:
        filtered_timeseries[j] = timeseries[i]
        j += 1

此代码段主要计算从每个可能的起点开始的整个周期数内落在 1 秒内(假设时间戳本身以秒为单位)的点数。然后循环遍历原始时间序列并将其计数的每个点复制到新的过滤时间序列中。你说你不关心运行时间,这很好,因为这是 O(n^2)。