Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3041140
  • 博文数量: 167
  • 博客积分: 613
  • 博客等级: 中士
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-13 21:35
个人简介

人, 既无虎狼之爪牙,亦无狮象之力量,却能擒狼缚虎,驯狮猎象,无他,唯智慧耳。

文章分类
文章存档

2015年(19)

2014年(70)

2013年(54)

2012年(14)

2011年(10)

分类: 网络与安全

2014-07-07 16:09:26

     最近因为工作的关系需要使用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. x =

  3.      1 3 5

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

  5. a =

  6.      5 18 35 18 5


  7. b =

  8.     -2 -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. a =

  3.     5.0000 9.0000 11.6667 9.0000 5.0000


  4. b =

  5.     -2 -1 0 1 2

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

点击(此处)折叠或打开

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

  2. a =

  3.     1.6667 6.0000 11.6667 6.0000 1.6667


  4. b =

  5.     -2 -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. a =

  3.     0.1429 0.5143 1.0000 0.5143 0.1429


  4. b =

  5.     -2 -1 0 1 2

  6. >>

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





阅读(59971) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~