我有两个数据集,每个数据集包含对象的 x 和 y 位置数据。使用不同的传感器对数据进行采样。其中一组数据的采样频率为 125 Hz,另一组的采样频率为 500 Hz。我已将 125Hz 数据重新采样为 500Hz,并且希望对齐数据。第一张图显示了时间对齐之前的数据(插值125Hz->500Hz之后) 第二个显示了根据互相关计算出的时移之后的情况(x 顶部图,y 底部图):
原始数据:https://drive.google.com/drive/folders/1shiw8HZmcDydLYanR0nlvoy3iKYt7Ij9?usp=sharing
这就是我计算相关性和时移的方法。 (属于较大班级的一部分,所以我只是发布了内容 - 不介意,例如“i in range(3)”)
from scipy.signal import correlate
def cross_correlation(self):
cross_cor_vec = [
correlate(
self.tar500.iloc[:, i],
self.act125.iloc[:, i],
mode="full",
)
for i in range(3)
]
return cross_cor_vec
def get_time_shift(self):
cross_cor_vec = self.cross_correlation()
normalization_factors = [
np.sqrt(
np.sum(self.tar500.iloc[:, i] ** 2)
* np.sum(self.act125.iloc[:, i] ** 2)
)
for i in range(3)
]
correlation_coefficients = [
cross_cor_vec[i] / normalization_factors[i] for i in range(3)
]
# Find the max correlation among the correlation coefficients.
corr_dict = {
np.argmax(correlation_coefficients[i]): np.max(correlation_coefficients[i])
for i in range(3)
}
index_max_corr = max(zip(corr_dict.values(), corr_dict.keys()))[1]
time_shift = index_max_corr - len(self.act125.x - 1)
self.tar500.drop(
self.tar500.index[:time_shift], inplace=True
)
self.tar500.reset_index(drop=True, inplace=True)
self.tar500.drop(
self.tar500.index[len(self.act125) :], inplace=True
)
从图中可以看出,即使在互相关之后,仍然存在明显的时移。 我还针对动态时间扭曲检查了数据 - 从纯粹的视觉检查来看,它可以更好地对齐数据。
我在这里缺少什么?
尝试使用 scipy.signal 关联并使用 np.argmax() 进行时移
您的信号具有较大的直流偏移,因此您不会关联两个小正弦波段,而是关联大(负)基座上的两个小正弦波段。
为了获得所需的相关性,您需要去除直流分量。您通常会应用支持有限的高通滤波器,在开始/结束时切断过滤信号中混乱的部分,然后应用相关性。
不幸的是,您没有足够的信号来应用足够长的高通滤波器来通过感兴趣的部分。如果您无法在开始和结束时获得更多样本,那么您可以通过复制前几个/最后几个样本的平均值来扩展它。