1

大きなウィンドウの合計を生成し、実行中の小さなウィンドウの合計で割ってエネルギー比を取得する簡単なコードを作成しようとしています。

私のコードはMATLABで次のようになります

S           = data1;
[nt,ntraces] = size(S);

!Create sliding windows for First Break Picking:

!define a window length
!for large Window
nl = 300            
!for small running Window
ns = 50 
! tolerance/Fudge Factor
beta = 0.0000



for i_slide = 1:nt-nl
for i_large = i_slide:(i_slide+nl)
    large_window(i_large) = sum(S(i_large).^2)';


    for i_small = i_slide+ns:i_slide+nl
        small_window(i_small) = sum(S(i_small).^2)';
    end

end

ER(i_slide) = small_window/(large_window + beta);
end

私が抱えている問題は、実行中の小さなウィンドウが正しくインデックス付けされておらず、最大スライドで大きなウィンドウ全体の長さに沿って合計が実行されていないことです。

この問題を克服する方法はありますか?

4

1 に答える 1

0

一般に、あなたが実際に解決しようとしている問題は、一般的な 2 次元 (または 1 次元?) 畳​​み込みのようです。これを行うには、MATLAB の conv または conv2 関数 (または、画像処理ツールボックスがある場合は filter または imfilter) を使用できます。2 次元の畳み込み関数を作成する必要がある場合、2 つの畳み込みを行い、比率を取る関数を作成しようとはしません。代わりに、単純な畳み込み関数 my_conv を作成して 2 回実行し、比率を取得します。たとえば、次のように書こうとしています:

output = my_double_conv(data,smallFilt,bigFilt); %this does ratios

一般的には良い考えではないと思います。そうしないでください。行う

output = my_conv(data,smallFilt) ./ my_conv(data,bigFilt);

my_double_convですべてを 2 回インデックス化する必要がないため、速度が向上する場合がありますが、計算上の問題が問題である場合は、最初から独自の畳み込みを作成するべきではありません。代わりに、FFT 畳み込みまたは積分画像畳み込みを使用する必要があります (例: http://hebb.mit.edu/courses/9.29/2004/readings/c13-1.pdfまたはhttp://en.wikipedia.org/ wiki/Summed_area_table )

とはいえ、あなたのコードにはいくつかの問題があります。MATLAB デバッガーでデバッグを試みましたか?

たとえば、 i_small はスカラー インデックスであるため、これは明らかに間違っています。

for i_small = i_slide+ns:i_slide+nl
    small_window(i_small) = sum(S(i_small).^2)';
end

i_small はスカラーになるため、その合計は何にも「合計」されません...

欲しいですか:

small_window= S(i_slide+ns:i_slide+nl);
small_window_sum = sum(small_window.^2);

また、次のような要素単位の行列演算についても注意してください。

small_window/(large_window + ベータ);

small_window と large_window がスカラーである場合、次のことが必要です。

small_window./(large_window + ベータ); %「.」に注意してください

于 2012-10-23T00:59:40.727 に答える