检测信号相对于本地活动的跳跃

时间:2013-03-10 18:31:08

标签: matlab

在Matlab中,是否可以在不使用for循环的情况下测量整个信号的信号局部变化?即,我可以实现以下内容:

window_length = <something>
for n = 1:(length_of_signal - window_length/2)
    global_variance(n) = var(my_signal(1:window_length))
end

采用矢量化格式?

3 个答案:

答案 0 :(得分:1)

如果您有图像处理工具箱,则可以使用STDFILT

global_std = stdfilt(my_signal(:),ones(window_length,1));

% square to get the variance
global_variance = global_std.^2;

答案 1 :(得分:0)

您可以创建一个2D数组,其中每行都移动一个w.r.t.到上面的行,并且行数等于窗口宽度;然后计算方差是微不足道的。这不需要任何工具箱。不确定它是否比for循环快得多:

longSignal = repmat(mySignal(:), [1 window_length+1]);
longSignal = reshape(longSignal(1:((length_of_signal+1)*window_length)), [length_of_signal+1, window_length])';
global_variance = sum(longSignal.*longSignal, 2);
global_variance = global_variance(1:length_of_signal-window_length));

请注意,第二列相对于上一列向下移动了一次 - 这意味着当我们拥有要在行中操作的数据块时,所以我采用了转置。之后,sum运算符将对第一个维度求和,从而为您提供包含所需结果的行向量。但是,有一些数据包装正在进行中,因此我们必须限制“好”值的数量。

我现在没有matlab方便(我在家),所以我无法测试上面的内容 - 但我认为一般的想法应该有用。它是矢量化的 - 我不能保证它很快......

答案 2 :(得分:0)

检查Matlab Central的"moving window standard deviation" function。你的代码是:

movingstd(my_signal, window_length, 'forward').^2

还有moving variance代码,但它似乎已被破坏。

我们的想法是使用filter功能。