2013-10-31 33 views
5

我有一个如下所示的分段恒定信号。我想要检测步骤转换的位置(标记为红色)。分段恒定信号中的检测步骤

我目前的做法:

我目前正在执行检测不连续性的最后一步。但是,我无法获得准确的位置,并以许多错误检测结束。

我的问题:

  1. 这是正确的做法?
  2. 如果是的话,有人可以摆脱一些信息/算法用于最后一步吗?
  3. 请建议备用/更好的方法。

感谢

Original, Smoothed, DWT-detailed Coeff at level 1 plots

回答

4

卷积您的与高斯的第一导数找到步骤的位置,类似于Canny edge detection在1-d信号。你可以用多尺度的方法做到这一点,从一个“大”的西格玛(比如〜10个像素)开始检测局部最大值,然后到一个较小的西格玛(〜2像素),以便在步骤所在的右侧像素上会聚。

你可以看到这个方法的实现here

+0

下载链接对您发送的有趣链接不起作用,也许有人有副本? – Xavier

+0

它只是一个链接到原始文件:Canny,约翰。 “一种边缘检测的计算方法。” IEEE Transactions on pattern analysis and machine intelligence 6(1986):679-698。 https://scholar.google.com/scholar?cluster=6445737130860653197&hl=en&as_sdt=0,5 – bla

3

如果你的功能实在是分段不断,为什么不使用只是diffabs相比于阈值?

th = 0.1; 
x_steps = x(abs(diff(y)) > th) 

其中x与X轴的值的矢量,y是您的y轴数据,和th是阈值。

实施例:

>> x = [2 3 4 5 6 7 8 9]; 
>> y = [1 1 1 2 2 2 3 3]; 
>> th = 0.1; 
>> x_steps = x(abs(diff(y)) > th) 

x_steps = 

    4  7 
+0

信号是分段恒定的,但是这些步骤之间的转换不是清晰的(它的线性变化如图所示)。因此,考虑以前和当前值之间的差异不会产生预期结果。 –

+0

+1我很欣赏答案的简单性,虽然它可能会因通用的非逐步随机信号以及跨过渡的涟漪信号的逐步信号而失败。 – AstoundingJB

0

我认为,使用更清晰的低通滤波器平滑应该更好。

尝试使用medfilt1()(中值过滤器)代替,因为您具有非常具体的级别。如果你知道你的高原有多长时间,例如你可以占据高原长度的一半/四分之一。那么你会得到非常锋利的边缘。尖锐的边缘应该可以使用Haar小波检测,或者甚至仅使用简单的差异。

2

关于你的第3点:(请提出一个替代/更好的方法)

我建议使用波茨“过滤器”。这是一种变分方法,用于准确估计分段常量信号(类似于总变差最小化)。它可以被解释为自适应中值滤波。给定Potts估计值u,跳跃点是u的非零梯度点,即diff(u)= 0。(网上有Potts滤波器的免费Matlab实现) 参见http://en.wikipedia.org/wiki/Step_detection