赞
踩
语音信号处理,常常用到相关系数。那么,已知序列(向量)x和序列(向量)y,长度为N。怎么使用公式计算它们的互相关系数呢?
首先要清楚,互相关函数和互相关系数是什么关系:一般认为,互相关函数的最大值是互相关系数。互相关函数是描述随机信号 X(t)、Y(t) 在任意两个不同时刻s,t的取值之间的相关程度的函数。我们计算它们最好的办法,就是从定义入手。
先介绍互相关函数
1、对于连续信号和离散信号都成立的定义式:
其中,E表示数学期望(特别地,对于数字信号来说,可以理解成序列的均值)。
2、当然,对于连续随机信号f(t)、g(t) ,也可以这样定义:
*表示取共轭(实部不变,虚部取相反数)。这个式子看看就行。
3、重点来了,对于离散信号,我们直接看MATLAB里的文档来理解!
crosscorr函数的文档里写了,互相关函数是这样定义的:
这里算的是协方差函数:
式1表示向量y1在 t 时刻的值,式2表示向量y2在 t+k 时刻的值,式3表示向量y2在 t 时刻的值,式4表示向量y1在 t-k 时刻的值。举例子说,假设y1和y2都是长度为N的向量,上式中T就用N代替,k用0,+-1,+-2,...,+-(N-1)代替。
仔细琢磨发现,辣么一大串公式算出来的,自变量范围是-(N-1)...,-2,-1,0,1,2,...N-1,一共2N-1个。正好对应输出序列的第1,2,3,4,...2N-1个值。也就是说,当k等于0时,对应的是输出序列的第N个值。MATLAB画一画,可以更好地理解(用了两个长得完全一样的信号求互相关):
但实际上,打开crosscorr函数发现并不是按那个公式算的,而是先算了fft,对应点相乘后,ifft得到结果。
这是为什么呢?请看这个定义!这是离散信号互相关的一般计算公式:
你会发现,这个公式和卷积的公式很像啊!具体区别可以看看这个10分钟的视频:郭宝龙主讲信号与系统:第32讲,相关与卷积的比较。简单说,就是卷积和相关函数的区别就是在滑动乘加之前,其中一个信号是否需要翻转。所以,f(t)和g(t) 做相关等于 f*(-t) 与 g(t) 做卷积。时域卷积等于频域相乘,所以crosscorr函数那样算的。
敲个代码验证一下上边的解释:
这里故意选了个两个相互之间有延迟的信号。crosscorr的最大值是我们一般说的相关系数,对应的横坐标是延迟量。用公式算的cor是延迟量等于0时的结果,并不是我们常说的相关系数,它仅仅代表当延迟为0时信号间的相关程度。
回答最开始的问题:
1、如果要求的两个信号延迟量正好等于0,可以用公式直接计算相关系数,而不需要求出相关函数的所有值。
- cor = sum( (x-mean(x)).*(y-mean(y)) ) / sqrt( sum((x-mean(x)).^2)*sum((y-mean(y)).^2) )
-
- 或者
-
- cor = sum(x.*y) / sqrt(sum(x.*x) * sum(y.*y))
2、如果要求的两个信号延迟量不为0,需要用crosscorr计算
- [c3,a3] = crosscorr(x,y,N-1);
- max(c3)
xcorr函数
xcorr函数里的crosscorr函数
注意!!!这个crosscorr函数和上边提到的crosscorr不是同一个函数。
scaleXcorr函数,coeff代表归一化系数
奇怪的是,xcorr和crosscorr算出的结果稍微有些不一样,但总体趋势一致,差的也不多。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。