有人能告诉我如何在MATLAB中对两个语音信号进行交叉相关吗(每个信号都有40,000个样本),而不使用内置函数xcorr
和相关系数?
提前致谢。
有人能告诉我如何在MATLAB中对两个语音信号进行交叉相关吗(每个信号都有40,000个样本),而不使用内置函数xcorr
和相关系数?
提前致谢。
你可以使用 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
xcorr
,那么在什么情况下你认为可以使用内置函数呢?2+2
可以吗?plus(2,2)
呢?你应该解释一下为什么有这些限制。 - user616736虽然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或其他编译语言中进行。
如果你不能使用内置的方法,也可以使用卷积代替。交叉相关是卷积没有反转的简单形式,因此为了“撤销”相关积分的反转,你可以首先在其中一个信号上应用额外的反转(这将会在卷积中被抵消掉)。