参考文章:《使用相关性对齐信号》
前言
在对数字时域信号进行操作时,有时需要在预处理的过程中,对自己的信号数据进行对齐操作,本文就用python实现该时域对齐操作,方便对时域信号进行下一步处理。
1、读取自己的信号数据:
我这里就用自己的信号数据来做演示:
(首先需要import的库有如下三个)
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
紧接着读取数据(因为我的信号数据有很多,这里读取其中两个信号s1、s2做演示)
data = pd.read_csv(r'C:\Users\xps\Desktop\radar\train_raw_data_las_2.csv')
data0 = data.values
s1 = data0[0]
s2 = data0[5]
s1 = list(s1)
s2 = list(s2)
plt.plot(range(len(s1)),s1,'r',label = 'x')
plt.plot(range(len(s2)),s2,'g',label = 'y')
plt.show()
两个信号画图如下,可以看出两个信号是不对齐的
2、读取两个信号之间的互相关数据
此处读取两个信号的互相关使用的是np里面的correlate函数,该函数和数字信号处理里面的卷积操作一样,即求两个信号s1和s2的卷积
具体操作如下:
c21 = np.correlate(s2,s1,mode='full')
t21 = np.argmax(c21)
c21为s1,s2两个信号的互相关
t21为互相关中最大值所在的索引:此处t21=518,可在下图横轴大致看出
c21画出的图如下:
3、根据互相关及其最大值索引对两个信号对齐:
原理大致解释如下:
对s1和s2求卷积时,是先将其中一个信号反转,再平移,计算二者重叠部分的和(具体可见信号课本求卷积的图示法)
互相关最大值处即是两个信号重叠最大的部分,其移动的间距即是我们在下面即将对其中一个信号移位的距离。
下面代码中的index即是s1和s2求得互相关最大值时的卷积移动间距
若index=0,则说明两个信号刚好对齐
若index>0,则说明s1信号领先s2信号index个距离
若index<0,则说明s2信号领先s1信号index个距离
此处咱们以s1信号为基准,让s2和s1对齐,对齐操作只需要对s2进行切片整合操作即可,如下代码所示
len_s = len(s1)
index = t21-len_s
if index > 0 :
tt1 = s2[index:]
tt2 = s2[0:index]
s2_0 = tt1 + tt2
else:
index = len_s + index
tt1 = s2[0:index]
tt2 = s2[index:]
s2_0 = tt2 + tt1
4、大功告成,画图看看
plt.subplot(211)
plt.plot(range(len(s1)),s1,'r',label='x')
plt.plot(range(len(s2)),s2,'g',label='y')
plt.subplot(212)
plt.plot(range(len(s1)),s1,'r',label='x')
plt.plot(range(len(s2_0)),s2_0,'g',label='y')
plt.show()
从下图可以看出,两个信号已经对齐,可以进行其他信号处理操作