matlab中的互相关而不使用内置函数?

时间:2011-09-13 04:29:23

标签: matlab signal-processing cross-correlation

有人可以告诉我们如何在MATLAB中对两个语音信号(每个40,000个样本)进行互相关,而不使用内置函数xcorr和相关系数?

提前致谢。

3 个答案:

答案 0 :(得分:27)

您可以使用fft进行互相关。两个向量的互相关只是它们各自傅里叶变换的乘积,其中一个变换是共轭的。

实施例

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 :(得分:4)

如果有一个很好的理由为什么你不能使用inbuilt,你可以使用卷积代替。互相关只是一个没有反转的卷积,所以要“撤消”相关积分的反转,你可以先对你的一个信号应用一个额外的反转(这将在卷积中抵消)。

答案 2 :(得分:3)

好的yoda给出了一个很好的答案,但我认为无论如何我都提到这个以防万一。回到离散互相关的定义,您可以在不使用(太多)内置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语言或其他编译语言来尝试。