4

我想在嘈杂的数据中找到一个步骤的位置。经过几次尝试后,我尝试使用边缘检测器或与匹配过滤器进行卷积以获得步骤的位置,但问题是两者都不准确,因为步骤会根据位置改变其形状。

例如,假设我的数据向量长度为​​ 1000 个元素,则步长在 200 像素附近为 30,在 700 像素附近为 70,类似于波包因色散而变宽的方式。有更多的属性会有所变化,所以一般的问题是,我怎样才能找到台阶的位置?匹配的过滤器仅限于特定的形状,并且会给出不准确的位置。边缘检测器对斜率很敏感,也会给出不准确的位置。您还知道哪些其他方法?我很乐意学习新的想法。

这是一个在没有噪音或其他特征的情况下改变 vs 位置的步骤示例 在此处输入图像描述

这是相同的步骤 + 噪音和一个附加功能(为了更好的可视化而被替换)。 在此处输入图像描述

4

1 回答 1

2

我会做一种对噪声不敏感的数值微分,并找到它的峰值(我手头没有 Matlab,所以这可能有错别字):

n = length(x); % x is the original data vector
m = 30; % smallest step width you expect
y = zeros(n - m, 1); % the "numerical derivative" of x
for i = 1 + m : n
   y(i - m) = x(i) - x(i - m);
end
figure; plot(y)
% now find the peaks of y using a sliding window and thresholding
% sliding window width should be the largest step width you expect

这种简单的方法过去对我有用。

另一种计算数值导数的方法是计算(抛物线)Savitzky-Golay 滤波器中间的斜率。您应该在滑动窗口中应用过滤器。同样,它的宽度应该是您期望的最小步长。SG滤波器的优点是(1)拟合抛物线的斜率计算容易,(2)导数不会有时间偏移。在应用通常的线性平滑滤波器后计算斜率将不起作用,因为这些滤波器会及时移动平滑信号,因此步长的时间也会发生偏移。

于 2013-07-13T01:25:24.323 回答