找到阶跃响应后的平均稳定值

时间:2011-07-02 18:53:19

标签: algorithm numpy signal-processing

我正在收集生物监测系统的数据。他们需要知道系统更改后平台的平均值,如下所示。

这是大约4分钟的数据,如图所示,事件和稳态响应之间存在相当滞后的时间。

enter image description here

这些值并不总是这个级别。他们希望我找到稳态响应的起始位置并在此期间平均值。我的老板是一名生物学家,他说可能存在过冲和随机波动...而且我可能需要使用z变换。不幸的是,他没有那么具体。

作为程序员,我觉得自己很有能力,但不确定找到这些价值观的最有效方法是什么。

非常感谢任何算法,见解或方法。感谢。

2 个答案:

答案 0 :(得分:2)

一种简单的方法可能是计算和跟踪移动平均值(即最后N个样本的平均值)。当平均值变化小于阈值时,您可以假设它是稳态。

诀窍在于适当选择N和阈值。您可能能够猜出合理的值,或者您可以使用多个事件的数据来训练系统。

这看起来像一个有趣的项目 - 祝你好运!

答案 1 :(得分:1)

通过分析一阶导数,您实际上可以获得良好的开端。如果一阶导数接近零,则考虑过程稳定。但请注意,这不是“银弹”类型的解决方案,一些令人讨厌的角落案例。

无论如何,基于上述,下面是一个简单的演示:

import numpy as np

# create first some artificial observations
obs= np.array([[0, 1, 1.5, 3.5, 4, 4.5, 7, 9.2, 10.5, 15],
               [1, 2, 6, 6.01, 5.5, 4, 4.7, 3.3, 3.7, 3.65]])
x= np.linspace(obs[0][0], obs[0][-1], 1e2)
y= np.interp(x, obs[0], obs[1])
# and add some noise to it
y+= 1e-3* np.random.randn(y.shape[0])

# now find steady state based on first derivative< abs(trh), but
# smooth the signal first by convolving it with suitable kernel
y_s= np.convolve(y, [.2, .6, .2])
d, trh= np.diff(y_s), .015
stable= (np.abs(d)< trh)[:-1]

# and inspect visually
from pylab import grid, plot, show
plot(x, y), plot(x, y_s[1: -1])
plot(x[stable], np.ones(stable.sum()), 's')
grid(True), show()

输出为(其中红点表示假定的稳态过程): enter image description here