8

xcorr組み込み関数と相関係数を使用せずに、MATLAB で 2 つの音声信号 (それぞれ 40,000 サンプル) の相互相関を行う方法を教えてください。

前もって感謝します。

4

3 に答える 3

31

を使用して相互相関を行うことができます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
于 2011-09-13T04:46:44.993 に答える
4

組み込みを使用できない正当な理由がある場合は、代わりに畳み込みを使用できます。相互相関は反転のない単純な畳み込みであるため、相関積分の反転を「元に戻す」には、最初に信号の 1 つに追加の反転を適用できます (畳み込みで相殺されます)。

于 2011-09-13T04:35:41.637 に答える
4

ヨーダは良い答えを出しましたが、念のためとにかくこれについて言及したと思いました。離散相互相関の定義に戻ると、(あまり) 組み込みの 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または他のコンパイル済み言語で試してみたいと思います.

于 2011-09-13T16:18:44.233 に答える