有人可以告诉如何在不使用内置函数xcorr
和相关系数的情况下在 MATLAB 中对两个语音信号(每个 40,000 个样本)进行互相关吗?
提前致谢。
有人可以告诉如何在不使用内置函数xcorr
和相关系数的情况下在 MATLAB 中对两个语音信号(每个 40,000 个样本)进行互相关吗?
提前致谢。
您可以使用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 函数(这应该是 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 或其他编译语言尝试它。