相关系数与相关函数

语音信号处理,常常用到相关系数。那么,已知序列(向量)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)代替。

仔细琢磨发现,辣么一大串公式算出来的r_{y1y2}(k),自变量范围是-(N-1)...,-2,-1,0,1,2,...N-1,一共2N-1个。正好对应输出序列r_{y1y2}(k)的第1,2,3,4,...2N-1个值。也就是说,当k等于0时,c_{y1y2}(0)对应的是输出序列r_{y1y2}(k)的第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函数的部分代码

xcorr函数

xcorr函数里的crosscorr函数

xcorr函数里的crosscorr函数

注意!!!这个crosscorr函数和上边提到的crosscorr不是同一个函数。

scaleXcorr函数,coeff代表归一化系数scaleXcorr函数,coeff代表归一化系数

奇怪的是,xcorr和crosscorr算出的结果稍微有些不一样,但总体趋势一致,差的也不多。

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值