4

2 つの信号があります。それらを「a」と「b」と呼びましょう。それらは両方ともほぼ同一の信号です (同じ入力から記録され、同じ情報を含んでいます)。明らかに、それぞれにランダム ノイズがあります。

現在、相互相関を使用して時間シフトを計算していますが、まだ不適切な結果が得られています。

タイムシフトを計算するために使用しているコードは次のとおりです。

function [ diff ] = FindDiff( signal1, signal2 )
%FINDDIFF Finds the difference between two signals of equal frequency 
%after an appropritate time shift is applied
%   Calculates the time shift between two signals of equal frequency 
%   using cross correlation, shifts the second signal and subtracts the
%   shifted signal from the first signal. This difference is returned.
length = size(signal1);

if (length ~= size(signal2))
    error('Vectors must be equal size');
end

t = 1:length;
tx = (-length+1):length;
x = xcorr(signal1,signal2);
[mx,ix] = max(x);
lag = abs(tx(ix));
shifted_signal2 = timeshift(signal2,lag);
diff = signal1 - shifted_signal2;

end

function [ shifted ] = timeshift( input_signal, shift_amount )
input_size = size(input_signal);
shifted = (1:input_size)';
for i = 1:input_size
    if i <= shift_amount
        shifted(i) = 0;
    else
        shifted(i) = input_signal(i-shift_amount);
    end
end

end

plot(FindDiff(a,b));

ただし、関数の結果はランダム ノイズではなく周期波であるため、ラグはオフのままである必要があります。プロットの画像を投稿しますが、imgur は現在協力していません。

相互相関以外にラグを計算するより正確な方法はありますか、または相互相関の結果を改善する方法はありますか?

4

4 に答える 4

7

相互相関は通常、2つの信号間のタイムラグを決定する最も簡単な方法です。ピーク値の位置は、2つの信号が最も類似している時間オフセットを示します。

%// Normalize signals to zero mean and unit variance
s1 = (signal1 - mean(signal1)) / std(signal1);
s2 = (signal2 - mean(signal2)) / std(signal2);

%// Compute time lag between signals
c = xcorr(s1, s2);                       %// Cross correlation
lag = mod(find(c == max(c)), length(s2)) %// Find the position of the peak

結果にバイアスがかからないように、2つの信号を最初に同じエネルギーレベルに正規化する必要があることに注意してください。

ちなみに、diff変数の名前としては使用しないでください。同じ名前の組み込み関数がMATLABにすでに存在します。

于 2013-03-12T22:52:28.460 に答える
1

corr は vector 間の内積を求めます(v1, v2)。あなたの信号でうまくいかない場合は、差の二乗和(つまりabs(v1 - v2))を最小限に抑えようとします。

 signal = sin(1:100);
 signal1 = [zeros(1, 10) signal];
 signal2 = [signal zeros(1, 10)];

 for i = 1:length(signal1)
     signal1shifted = [signal1 zeros(1, i)];
     signal2shifted = [zeros(1, i) signal2];
     d2(i) = sum((signal1shifted - signal2shifted).^2);
 end

 [fval lag2] = min(d2);

 lag2

これは、FFT を使用して高速化できる相互計算よりも計算的に悪いです。私の知る限り、ユークリッド距離ではこれを行うことはできません。

アップデート。周期信号との相互相関に関する誤った考えを削除

于 2013-03-12T22:05:57.913 に答える
0

周波数領域でマッチドフィルタリングを試すことができます

function [corr_output] = pc_corr_processor (target_signal, ref_signal)
L = length(ref_signal);
N = length(target_signal);

matched_filter = flipud(ref_signal')';
matched_filter_Res = fft(matched_filter,N);
corr_fft = matched_filter_Res.*fft(target_signal);
corr_out = abs(ifft(corr_fft));

上記のcorr_outの整合フィルターmaximum-indexのピークは、ラグ量を示します。

于 2013-03-13T07:16:22.270 に答える