我的数据不太嘈杂,我试图检测一种模式,在短时间内它逐渐增大然后减小(20个滴答声?每个会话应该大致相似,但不同会话之间可能略有不同)。这种模式通常成对发生,但并非总是如此。
因此,查看数据随时间变化的顶部图,我所遵循的模式是时间100和300。您可以看到数据大致稳定,然后逐渐增加和减少并稳定下来,然后过一段时间再增加,减少并稳定下来。
如您所见,在某些情况下,它会突然发生变化(550&800),或者在较长的一段时间内(700-800)它会增加然后减少,但是我只需要检测我的短模式即可。
我做了些什么:
我采用了最后10个值的方差,即中间图。当数据开始出现偏差时,它为我提供了一个相对好的主意,但方差忽略了正负号,因此我无法确定数据是增加还是减少,并且无法区分突然变化和逐渐变化。
因此,我决定取每个值与先前值之间的平方差,并保留符号。我使用平方来夸大差异,以使其与较小的变化更容易区分,并保留符号以帮助识别差异是何时增大然后减小。
我不能说
if diff[i] > diff[i-1] for 5 ticks, and then diff[i] < diff[i-1] for 5 ticks
是因为diff嘈杂,即使总的来说它正在减少,它的符号也会在130的中间变正。
我觉得有比尝试滤除噪声然后再应用上述if语句更好的方法。但是我正在绘制空白的atm。
以编程方式检测短暂但逐渐增加然后降低噪声数量的最佳方法是什么?
答案 0 :(得分:2)
似乎您知道您要查找的确切图案(长度固定的矩形)。在这种情况下,标准解决方案是使用matched filter,即计算噪声信号和时间反转模板信号之间的卷积以检测模板的存在。
答案 1 :(得分:0)
要过滤数据,我通常使用滚动平均值列表,如下所示:
L = []
max_points = 20
for point in data:
L.append(point)
while len(L) < max_points:
L.append(point)
continue
a = sum(L) / len(L)
# Do something to check for in the average
del(L[0]) # Deletes oldest point