3

forMatlab では、ループを使用せずに信号全体にわたって信号の局所的な変動を測定することは可能ですか? つまり、次のことを実装できますか。

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

ベクトル化された形式で?

4

3 に答える 3

1

If you have the image processing toolbox, you can use STDFILT:

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

% square to get the variance
global_variance = global_std.^2;
于 2013-03-10T19:44:30.710 に答える
0

各行が上の行に1つシフトされ、行数がウィンドウ幅に等しい2D配列を作成できます。その場合、分散の計算は簡単です。これにはツールボックスは必要ありません。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));

2番目の列は、上の列に対して1つ下にシフトされていることに注意してください。これは、操作するデータのブロックが行にある場合、転置を行うことを意味します。その後、sum演算子は最初の次元を合計します。これにより、必要な結果を含む行ベクトルが得られます。ただし、データのラッピングが少し行われているため、「適切な」値の数に制限する必要があります。

現在、MATLABが手元にないので(家にいます)、上記をテストできませんでしたが、一般的な考え方はうまくいくと思います。それはベクトル化されています-私はそれが速いことを保証することはできません...

于 2013-03-10T19:59:15.760 に答える
0

MatlabCentralの「移動ウィンドウの標準偏差」機能を確認してください。コードは次のようになります。

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

移動する分散コードもありますが、壊れているようです。

アイデアはfilter関数を使用することです。

于 2013-03-10T20:02:51.213 に答える