xcorr
組み込み関数と相関係数を使用せずに、MATLAB で 2 つの音声信号 (それぞれ 40,000 サンプル) の相互相関を行う方法を教えてください。
前もって感謝します。
xcorr
組み込み関数と相関係数を使用せずに、MATLAB で 2 つの音声信号 (それぞれ 40,000 サンプル) の相互相関を行う方法を教えてください。
前もって感謝します。
を使用して相互相関を行うことができますfft
。2 つのベクトルの相互相関は、単純にそれぞれのフーリエ変換の積であり、変換の 1 つが共役になっています。
a=rand(5,1);
b=rand(5,1);
corrLength=length(a)+length(b)-1;
c=fftshift(ifft(fft(a,corrLength).*conj(fft(b,corrLength))));
結果の比較:
c =
0.3311
0.5992
1.1320
1.5853
1.5848
1.1745
0.8500
0.4727
0.0915
>> xcorr(a,b)
ans =
0.3311
0.5992
1.1320
1.5853
1.5848
1.1745
0.8500
0.4727
0.0915
組み込みを使用できない正当な理由がある場合は、代わりに畳み込みを使用できます。相互相関は反転のない単純な畳み込みであるため、相関積分の反転を「元に戻す」には、最初に信号の 1 つに追加の反転を適用できます (畳み込みで相殺されます)。
ヨーダは良い答えを出しましたが、念のためとにかくこれについて言及したと思いました。離散相互相関の定義に戻ると、(あまり) 組み込みの Matlab 関数を使用せずに計算できます (これは、Matlab で行うべきことですxcorr
)。もちろん、これをベクトル化しようとしなかったので、まだ改善の余地があります。
n=1000;
x1=rand(n,1);
x2=rand(n,1);
xc=zeros(2*n-1,1);
for i=1:2*n-1
if(i>n)
j1=1;
k1=2*n-i;
j2=i-n+1;
k2=n;
else
j1=n-i+1;
k1=n;
j2=1;
k2=i;
end
xc(i)=sum(conj(x1(j1:k1)).*x2(j2:k2));
end
xc=flipud(xc);
関数の結果と一致しxcorr
ます。
更新:私の意見では、Matlabは大規模なデータセットのリアルタイム相互相関を行うための適切なツールではないことに言及するのを忘れました.Cまたは他のコンパイル済み言語で試してみたいと思います.