看上去语法也不难,直接运算不就好了么?可是运算出来的结果自己却搞不懂,因为自己没有多少统计的知识,于是又去巴拉数学的材料,想去搞明白xcorr函数的原理或公式。最后还是去matlab论坛找到了自己想找的答案,这里就来分析下matlab的互相关函数xcorr。
matlab中的参数都是以数组的形式存储的,标量可以看作是一维数组。我们采用序列x = [1, 3, 5]作为实验对象,经过xcorr()函数运算,分析结果:
1. xcorr()
点击(此处)折叠或打开
- >> x = [1 3 5]
- x =
- 1 3 5
- >> [a,b] = xcorr(x)
- a =
- 5 18 35 18 5
- b =
- -2 -1 0 1 2
- >>
当b(1)=-2时,只有数据(1, 5)作差可以得到,即序号1和序号3的差,因此计算a(1)=1*5=5;
当b(2)=-1时,涉及到了序号对应的(3, 1)和序号(5, 3),所以计算a(2)=3*1+5*3=18;
当b(3)=0时,涉及到了序号对应的(1, 1), (3, 3)和(5, 5),因此计算a(3)=1*1+3*3+5*5=35;
当b(4)=1时,涉及到了序号对应的(3, 1)和(5, 3),计算a(4)=3*1+5*3=18;
当b(5)=2时,涉及到了序号对应的(5, 1)(后面的数据的序号减去前面数据的序号正好为2),计算a(5)=5*1=5
2. xcorr(x, 'unbiased')
参数'unbiased'的作用在于基于缺省参数时的计算结果,每个组的计算再除上该组的序号组数,比如b(1)时组数为1,记为N=1,则a(1)=1*5/N=5;b(2)时就是a(2)=18/N=18/2=9;类似等等;
点击(此处)折叠或打开
- >> [a, b] = xcorr(x, 'unbiased')
- a =
- 5.0000 9.0000 11.6667 9.0000 5.0000
- b =
- -2 -1 0 1 2
- >>
参数'biased'的作用在于缺省参数的基础上除以序列x的长度,即a(1)=5/3;比如:
点击(此处)折叠或打开
- >> [a, b] = xcorr(x, 'biased')
- a =
- 1.6667 6.0000 11.6667 6.0000 1.6667
- b =
- -2 -1 0 1 2
- >>
此时用于求序列x的自相关序列,其结果是针对'biased'的情况进行归一化,使得b=0时即中间的值a(3)=1,因此a(1)=5/11.6667,所有的分组数据在'biased'基础上都通过11.6667归一运算:
点击(此处)折叠或打开
- >> [a, b] = xcorr(x, 'coeff')
- a =
- 0.1429 0.5143 1.0000 0.5143 0.1429
- b =
- -2 -1 0 1 2
- >>
由于xcorr多用于工程上针对时间信号采样,但是计算时将采集到的数据一起送给matlab,因此matlab本身并不知道时间间隔,我们可以使用dt=0.1, t=b*dt,plot(t, a)进行作图,前半部分是超前,后半部分是滞后,如: