我想在嘈杂的数据中找到一个步骤的位置.经过几次尝试后,我尝试使用边缘检测器或者使用匹配滤波器进行卷积以获得步骤的位置,这个问题既不准确,因为步骤将其形状改变为位置函数.
例如,给定我的数据向量是1000个元素长,步长宽度将是围绕像素数200的30和围绕像素数700的70,类似于波包由于色散而变宽的方式.有一些属性会有所改变,所以一般的问题是,如何找到步骤的位置?匹配滤波器仅限于特定形状,并且将给出不准确的位置.边缘检测器对斜率敏感,并且还会给出不准确的位置.你还知道其他什么方法?我很乐意学习新的想法.
以下是在没有噪音或其他功能的情况下更改与位置的步骤示例
这里有相同的步骤噪音和一个额外的功能(为了更好的可视化而移位).
最佳答案 我会做一种噪声不敏感的数值微分,并找到它的峰值(我手头没有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 filter中间的斜率.您应该在滑动窗口中应用滤波器.同样,它的宽度应该是您期望的最小步宽. SG滤波器的优点是:(1)计算拟合抛物线的斜率很容易,(2)导数中没有时间偏移.在应用通常的线性平滑滤波器之后计算斜率将不起作用,因为这些滤波器及时地平滑平滑后的信号,因此步长的定时也将被移位.