检测分段常数信号中的步骤

时间:2013-10-31 19:04:23

标签: matlab signal-processing

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

我目前的做法:

我目前正在实施检测不连续性的最后一步。然而,我无法获得精确的位置,并以许多错误检测结束。

我的问题:

  1. 这是正确的方法吗?
  2. 如果是,有人可以提供一些信息/算法用于最后一步吗?
  3. 请建议替代/更好的方法。
  4. 由于

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

5 个答案:

答案 0 :(得分:4)

用高斯的一阶导数卷积你的信号以找到阶跃位置,类似于1-D中的Canny edge detection。您可以采用多尺度方法,从大型" sigma(比如~10像素)检测局部最大值,然后检测到较小的sigma(~2像素),以收敛到步骤所在的右侧像素。

您可以看到此方法的实施here

答案 1 :(得分:3)

如果您的函数真的是分段常量,为什么不使用abs diff与阈值进行比较?

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

答案 2 :(得分:2)

关于你的观点3 :(请建议替代/更好的方法)

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

答案 3 :(得分:0)

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

尝试使用medfilt1()(中位数过滤器),因为你有非常具体的水平。如果你知道你的高原有多长,你就可以获得高原长度的一半/四分之一。然后你会得到非常锋利的边缘。应使用Haar小波或甚至仅使用简单的微分来检测锐边。

答案 4 :(得分:0)

总变差去噪可以产生分段恒定信号。然后,如上所述," diff的abs与阈值相比"返回转换的位置。 TVDN存在非常有效的算法,可以在几毫秒内处理数百万个数据点:

@StevenAlmeroth's answer

这里是一个使用python和matlab接口的变分方法的实现,它也使用TVDN:

http://www.gipsa-lab.grenoble-inp.fr/~laurent.condat/download/condat_fast_tv.c