Matlab 自相关检测 :自相关函数xcorr

原文: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()

点击(此处)折叠或打开

  1. >> x = [1 3 5]

  2. =

  3.      1 3 5

  4. >> [a,b] = xcorr(x)

  5. =

  6.      5 18 35 18 5


  7. =

  8.     --1 0 1 2

  9. >>
      也许你对这个结果感到困惑,不急,待我慢慢道来。计算时先进行b的计算,用序列x中的元素的序号互相做减法,可以得到的所有值的可能集合,按照从小到大顺序排列后就得到了b;然后分别根据序号的“差”的情况计算序列a:
     当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;类似等等;

点击(此处)折叠或打开

  1. >> [a, b] = xcorr(x, 'unbiased')

  2. =

  3.     5.0000 9.0000 11.6667 9.0000 5.0000


  4. =

  5.     --1 0 1 2

  6. >>
3. xcorr(x, 'biased')
     参数'biased'的作用在于缺省参数的基础上除以序列x的长度,即a(1)=5/3;比如:

点击(此处)折叠或打开

  1. >> [a, b] = xcorr(x, 'biased')

  2. =

  3.     1.6667 6.0000 11.6667 6.0000 1.6667


  4. =

  5.     --1 0 1 2

  6. >>
4. xcorr(x, 'coeff')
     此时用于求序列x的自相关序列,其结果是针对'biased'的情况进行归一化,使得b=0时即中间的值a(3)=1,因此a(1)=5/11.6667,所有的分组数据在'biased'基础上都通过11.6667归一运算:

点击(此处)折叠或打开

  1. >> [a, b] = xcorr(x, 'coeff')

  2. =

  3.     0.1429 0.5143 1.0000 0.5143 0.1429


  4. =

  5.     --1 0 1 2

  6. >>

      由于xcorr多用于工程上针对时间信号采样,但是计算时将采集到的数据一起送给matlab,因此matlab本身并不知道时间间隔,我们可以使用dt=0.1, t=b*dt,plot(t, a)进行作图,前半部分是超前,后半部分是滞后,如:
Matlab 自相关检测 :自相关函数xcorr_第1张图片

你可能感兴趣的:(Math)