序列的相关性
如果有几个序列,表面上很难看出它们之间的关系,但是如果对它们进行统计分析,则会发现一定的规律性。序列的相关性表明了序列间的相关程度,跟卷积一样,相关性(Correlation)也是信号分析中不可或缺的手段。
1.相关性的定义
两个序列x(n)、y(n)的互相关函数定义如下:
如果x(n)跟y(n)是同一个,那么就称为自相关函数,其实与互相关是一样的:
可以发现,相关函数的定义与卷积非常像,只是后半部分变反了,事实上有如下关系:
这样就可以利用卷积的去计算序列的相关性了。与卷积不同,序列的相关函数没有交换律,这意味着x(n)与y(n)哪个在前哪个在后很重要。
互相关函数的计算式并不要求两个序列的长度一样,但是一般应用情况下,即便不一样也会将较短序列末尾补零,使两个序列长度一致。
2.互相关的计算
举个例子:
计算过程如下:
可以看到计算过程为:移位、相乘、相加。比卷积少了一个翻转。
使用卷积计算互相关过程如下,只需要将后一个序列翻转:
最终计算结果为:
结果越大的点,表示相关性越好,可以看到,当n=1时,两个序列是“最像的时刻”
再举个例子计算自相关
显然,当两个序列完移位至全重合时有最大值49,这就是说序列完全相同是最像
且可以发现,自相关是实偶对称的,并且输出数据长度满足N = N1+N2-1,与卷积一样。(一般补零也要让N1=N2)
3.相关性的matlab计算
x = [3,6,2];
y = [2,1,0];
r = xcorr(x,y)
结果为:
r =
0.0000 3.0000 12.0000 14.0000 4.0000
4.应用举例
相关性是用来测量两个信号的相关程度,相关函数计算出来的值越大,就表明信号越相关。现在有两个传感器测量某种数据,但是这两个传感器有时延,首先需要进行数据同步。
数据如下:
load sensorData
t1 = (0:length(s1)-1)/Fs;
t2 = (0:length(s2)-1)/Fs;
subplot(2,1,1)
plot(t1,s1)
title('s_1')
subplot(2,1,2)
plot(t2,s2)
title('s_2')
xlabel('Time (s)')
可以看到两种传感器测得的数据应该是基本一致的,只是有一个延时,可以用相关性找到这个延时。
[acor,lag] = xcorr(s2,s1); %acor是输出数据,lag是移位量 注意s1、s2位置
[~,I] = max(abs(acor)); %最大值出的移位量就代表着延时
lagDiff = lag(I)
timeDiff = lagDiff/Fs
figure(2)
plot(lag,acor)
lagDiff =
-350
timeDiff =
-0.0317
一定要想清楚计算相关的过程。s2是后一个序列,那就是将s2左移位直到s2最右边的数据与s1最左边的数据有重合位置开始算起,显然,s2最左边数据还没完全移到y轴上就已经产生了最大值(因为最大值就是两个信号最像),所以最大值所在点的索引值一定是负的,并且这个索引值就是两个信号的时延。
最后的结果表明s1信号比s2信号迟了0.0317秒,这个负号表示迟,若是正的则是早。
这就可将两个信号对齐同步:
s1al = s1(-lagDiff+1:end);
t1al = (0:length(s1al)-1)/Fs;
subplot(2,1,1)
plot(t1al,s1al)
title('s_1, aligned')
subplot(2,1,2)
plot(t2,s2)
title('s_2')
xlabel('Time (s)')
5.总结
序列的相关性表示了两个序列的相似程度,其计算方法与卷积类似,也可以使用快速卷积来计算序列的相关性。