我有一个分段恒定信号如下所示。我想检测步骤转换的位置(用红色标记)。
我目前的做法:
我目前正在实施检测不连续性的最后一步。然而,我无法获得精确的位置,并以许多错误检测结束。
我的问题:
由于
答案 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存在非常有效的算法,可以在几毫秒内处理数百万个数据点:
这里是一个使用python和matlab接口的变分方法的实现,它也使用TVDN:
http://www.gipsa-lab.grenoble-inp.fr/~laurent.condat/download/condat_fast_tv.c