序列的相关性

如果有几个序列,表面上很难看出它们之间的关系,但是如果对它们进行统计分析,则会发现一定的规律性。序列的相关性表明了序列间的相关程度,跟卷积一样,相关性(Correlation)也是信号分析中不可或缺的手段。

1.相关性的定义

两个序列x(n)、y(n)的互相关函数定义如下:
python 算两个序列相关性 两个序列的互相关函数_函数定义
如果x(n)跟y(n)是同一个,那么就称为自相关函数,其实与互相关是一样的:
python 算两个序列相关性 两个序列的互相关函数_卷积_02
可以发现,相关函数的定义与卷积非常像,只是后半部分变反了,事实上有如下关系:
python 算两个序列相关性 两个序列的互相关函数_统计分析_03
这样就可以利用卷积的去计算序列的相关性了。与卷积不同,序列的相关函数没有交换律,这意味着x(n)与y(n)哪个在前哪个在后很重要。

互相关函数的计算式并不要求两个序列的长度一样,但是一般应用情况下,即便不一样也会将较短序列末尾补零,使两个序列长度一致。

2.互相关的计算

举个例子:
python 算两个序列相关性 两个序列的互相关函数_卷积_04
计算过程如下:
python 算两个序列相关性 两个序列的互相关函数_卷积_05
可以看到计算过程为:移位、相乘、相加。比卷积少了一个翻转。

使用卷积计算互相关过程如下,只需要将后一个序列翻转:
python 算两个序列相关性 两个序列的互相关函数_卷积_06
最终计算结果为:
python 算两个序列相关性 两个序列的互相关函数_python 算两个序列相关性_07
结果越大的点,表示相关性越好,可以看到,当n=1时,两个序列是“最像的时刻

再举个例子计算自相关
python 算两个序列相关性 两个序列的互相关函数_卷积_08
显然,当两个序列完移位至全重合时有最大值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)')

python 算两个序列相关性 两个序列的互相关函数_函数定义_09

可以看到两种传感器测得的数据应该是基本一致的,只是有一个延时,可以用相关性找到这个延时。

[acor,lag] = xcorr(s2,s1); %acor是输出数据,lag是移位量 注意s1、s2位置

[~,I] = max(abs(acor)); %最大值出的移位量就代表着延时
lagDiff = lag(I)

timeDiff = lagDiff/Fs  
figure(2)
plot(lag,acor)

python 算两个序列相关性 两个序列的互相关函数_统计分析_10

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)')

python 算两个序列相关性 两个序列的互相关函数_卷积_11

5.总结

序列的相关性表示了两个序列的相似程度,其计算方法与卷积类似,也可以使用快速卷积来计算序列的相关性。