问题
A = [1 2 3 4] ,求A的自相关系数。
求解过程如下图:
求得结果为:[4 11 20 30 20 11 4]
自相关的结果为2N-1个,关于N对称。
理解matlab中的xcorr
1. 求两个序列的互相关
x = [1 2 3 4 5 6 7 8];
[r,lags] = xcorr(x);
求得:
r = [8 23 44 70 100 133 168 204 168 133 100 70 44 23 8]
lags = [-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7]
lags就是偏移量,默认从最小的偏移量开始,信号长度是8,往左偏移最多7位,往右偏移做多也是7位。也理解了为什么求出来的自相关结果的长度位15=2N-1。
2. 求给定偏移量不大于p的自相关函数
x = [1 2 3 4 5 6 7 8];
[r,lags] = xcorr(x, 4);
这里设定最大偏移量不大于4,考虑正负偏移和0,所以对于指定偏移范围的自相关计算,其结果为2p+1个。
lags = [-4 -3 -2 -1 0 1 2 3 4]
r 的计算如法炮制:
r = [70 100 133 168 204 168 133 100 70]
3. 计算无偏估计及其他
Matlab提供的xcorr提供了一个归一化选项:
在谱估计的时候,经常要用到自相关函数的有偏估计,下面求一个。
[r,lags] = xcorr(x, 4, 'biased');
按照上面的公式,N为信号长度,可以猜测r的结果为:
[70/8 100/8 133/8 168/8 204/8 168/8 133/8 100/8 70/8]
使用matlab计算:
>> xcorr(x, 4, 'biased')
ans =
列 1 至 8
8.7500 12.5000 16.6250 21.0000 25.5000 21.0000 16.6250 12.5000
列 9
8.7500
一模一样。
4. 互相关的例子
>> x = [1 2 3 4];
>> y = [1 4 9 16];
>> xcorr(x, y)
ans =
16.0000 41.0000 70.0000 100.0000 50.0000 19.0000 4.0000
K>>
怎么算的?跟上面一样,自行脑补。
5. 题外话
matlab的帮助文档写得非常好,比外面乱七八糟抄来抄去说不清的博客好太多了,还权威。
参考:xcorr 互相关
自相关的概念的理解也可以参考这个博文,个人认为写得挺好。
还有博主自己手写了一个求自相关函数的算法,并与matlab提供的xcorr做了对比:
MATLAB_XCORR_互相关函数的讨论
C++版本:
xcorr 自相关 c++实现