原文:http://blog.chinaunix.net/uid-26275986-id-4342906.html
最近因为工作的关系需要使用matlab作为数据统计的工具,其中一个关键是使用其自相关函数获得数据的估计。自己只在本科时候马马虎虎地学习了一点matlab,这次仗着有C/C++的基础迅速地过了一遍自己需要的matlab的语法,原来这门语言很像脚本啊,同Python一样都是弱类型的,语法也不严格。了解了语法大概后,立刻在Help?文档中查找xcorr函数,其介绍如下:
看上去语法也不难,直接运算不就好了么?可是运算出来的结果自己却搞不懂,因为自己没有多少统计的知识,于是又去巴拉数学的材料,想去搞明白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)进行作图,前半部分是超前,后半部分是滞后,如:
![](https://i-blog.csdnimg.cn/blog_migrate/b188260170212ff576cc08453755032a.jpeg)