Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

2 つの単純信号の整列

この例では、相互相関を使用して信号を整列させる方法を説明します。最も一般的なケースでは信号は異なる長さをもっており、適切に同期させるには、長さと xcorr への引数を入力する順序を考慮しなければなりません。

前後のゼロの数と、一方が他方より遅れていることを除いて同一の 2 つの信号について考えます。

sz = 30;
sg = randn(1,randi(8)+3);
s1 = [zeros(1,randi(sz)-1) sg zeros(1,randi(sz)-1)];
s2 = [zeros(1,randi(sz)-1) sg zeros(1,randi(sz)-1)];

mx = max(numel(s1),numel(s2));

subplot(2,1,1)
stem(s1)
xlim([0 mx+1])

subplot(2,1,2)
stem(s2,'*')
xlim([0 mx+1])

要素がゼロであるかどうかに関係なく、要素の数の多さによって、2 つの信号のうちどちらが他方より長いかを決定します。

if numel(s1) > numel(s2)
    slong = s1;
    sshort = s2;
else
    slong = s2;
    sshort = s1;
end

2 つの信号の相互相関を計算します。長い方の信号を 1 番目の引数、短い方の信号を 2 番目の引数として使用して xcorr を実行します。結果をプロットします。

[acor,lag] = xcorr(slong,sshort);

[acormax,I] = max(abs(acor));
lagDiff = lag(I)
lagDiff = 15
figure
stem(lag,acor)
hold on
plot(lagDiff,acormax,'*')
hold off

信号を揃えます。検出するまで "より長く待つ" 必要があると言う意味で、遅れている信号をもう一方に比べて "より長い" と考えます。

  • lagDiff が正の場合は、lagDiff+1 から最後までの信号の要素を考慮して長い信号を "短く" します。

  • lagDiff が負の場合は、-lagDiff+1 から最後までの信号の要素を考慮して短い信号を "長く" します。

MATLAB® は 1 ベースのインデックスを使用するため、ラグ差には 1 を追加しなければなりません。

if lagDiff > 0
    sorig = sshort;
    salign = slong(lagDiff+1:end);
else
    sorig = slong;
    salign = sshort(-lagDiff+1:end);
end

整列した信号をプロットします。

subplot(2,1,1)
stem(sorig)
xlim([0 mx+1])

subplot(2,1,2)
stem(salign,'*')
xlim([0 mx+1])

相互相関演算は反対称であり、xcorr は短い信号の "最後" にゼロを追加することによって異なる長さの信号を処理するため、この方法が機能します。この解釈により、手作業で信号をパディングしなくても、MATLAB® の end 演算子を使用して簡単に信号を整列できるようになります。

関数 alignsignals を呼び出して、信号を一度に整列させることもできます。

[x1,x2] = alignsignals(s1,s2);

subplot(2,1,1)
stem(x1)
xlim([0 mx+1])

subplot(2,1,2)
stem(x2,'*')
xlim([0 mx+1])

参考

|