【问题标题】:Cross-correlation in matlab without using the inbuilt function?不使用内置函数的matlab中的互相关?
【发布时间】:2011-11-15 20:15:59
【问题描述】:

谁能告诉如何在不使用内置函数xcorr 和相关系数的情况下在 MATLAB 中对两个语音信号(每个 40,000 个样本)进行互相关?

提前致谢。

【问题讨论】:

标签: matlab signal-processing cross-correlation


【解决方案1】:

如果有充分的理由说明您不能使用内置函数,则可以使用卷积代替。互相关只是没有反转的卷积,因此要“撤消”相关积分的反转,您可以首先对您的一个信号应用额外的反转(这将在卷积中抵消)。

【讨论】:

    【解决方案2】:

    您可以使用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
    

    【讨论】:

    • 我不能使用任何 matlab 内置函数。你能给我推荐点别的吗?
    • 您应该在问题中说明这一点。您最初只是不允许xcorr。您认为在什么时候可以使用内置函数?是否允许2+2plus(2,2) 怎么样?你应该解释为什么你有这些限制
    • 我很抱歉含糊其辞。由于我在每个 40,000 个样本的两个信号之间进行互相关,这会在处理整个 40,000 个样本的实时应用程序中产生一些延迟所以,我正在寻找其他东西,比如处理样本块而不是处理所有样本一次。我试图做卷积,但做不到。
    • 好吧,您需要做的就是将数据分解成更小的数据块并使用上述数据。你不需要不同的技术。对于大样本量,FFT 方法将比xcorr 快得多。如果我在我的机器上对ab 使用 40,000 个样本执行上述操作,大约需要 0.7 秒。如果我简单地将它减半(即 20,000 个)样本,它只需要 0.04 秒,并且对于 10,000 个样本来说几乎是瞬间的 0.006 秒。
    • @yoda:不要填充信号,而是使用 FFT 函数的第二个参数
    【解决方案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 或其他编译语言中尝试它。 p>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 2021-05-04
      • 2011-09-11
      • 1970-01-01
      相关资源
      最近更新 更多