5

我有一个分段常数信号,如下所示。我想检测步进转换的位置(标记为红色)。

我目前的做法:

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

我的问题:

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

谢谢

1 级图的原始、平滑、DWT 详细 Coeff

4

5 回答 5

4

将您的信号与高斯的一阶导数进行卷积以找到步长位置,类似于一维中的Canny 边缘检测。您可以通过多尺度方法来做到这一点,从“大”sigma(例如~10 像素)检测局部最大值,然后到较小的 sigma(~2 像素)以收敛到步骤所在的正确像素。

您可以在此处查看此方法的实现。

于 2013-10-31T21:22:38.557 回答
3

如果你的函数真的是分段常量,为什么不使用absdiff阈值相比的呢?

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
于 2013-10-31T19:06:47.773 回答
2

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

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

于 2014-05-25T22:43:24.280 回答
1

Total Variation Denoising 可以产生分段常数信号。然后,如上所述,“与阈值相比的差异绝对值”返回转换的位置。TVDN 存在非常有效的算法,可以在几毫秒内处理数百万个数据点:

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

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

https://github.com/qubit-ulm/ebs

于 2016-05-19T08:55:04.357 回答
0

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

尝试改用medfilt1()(中值过滤器),因为您有非常具体的级别。如果你知道你的高原有多长,你可以取一半/四分之一的高原长度。然后你会得到非常锋利的边缘。使用 Haar 小波或什至仅使用简单的微分应该可以检测到锐利边缘。

于 2013-11-14T14:49:49.357 回答