web-dev-qa-db-ja.com

組み込み関数を使用せずにmatlabで相互相関しますか?

組み込み関数xcorrと相関係数を使用せずに、MATLABで2つの音声信号(それぞれ40,000サンプル)の相互相関を行う方法を誰かに教えてもらえますか?

前もって感謝します。

8
jay

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

4
wim

さてヨーダは良い答えを出しましたが、念のためとにかくこれに言及すると思いました。離散相互相関の定義に戻ると、組み込みの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関数の結果と一致します。

PDATE:私の意見では、Matlabは大規模なデータセットのリアルタイムの相互相関を行うための適切なツールではないことを忘れてしまいました。むしろ、Cまたは他のコンパイル言語で試してみます。

3
Aabaz