Python 如何将两个具有间隙和不同时基的时间序列关联起来?

Python 如何将两个具有间隙和不同时基的时间序列关联起来?,python,r,numpy,signal-processing,accelerometer,Python,R,Numpy,Signal Processing,Accelerometer,我有两个3D加速计数据的时间序列,它们有不同的时基(时钟开始于不同的时间,在采样时间内有一些非常轻微的蠕变),并且包含许多不同大小的间隙(由于与写入单独闪存设备相关的延迟) 我用的加速度计是最便宜的。我以最高增益运行加速计,因此数据具有显著的噪声地板 每个时间序列都有大约200万个数据点(以512个采样/秒的速度超过一小时),并包含大约500个感兴趣的事件,其中一个典型事件跨越100-150个采样(每个采样200-300毫秒)。其中许多事件都受到闪存写入期间数据中断的影响 因此,数据不是原始的,

我有两个3D加速计数据的时间序列,它们有不同的时基(时钟开始于不同的时间,在采样时间内有一些非常轻微的蠕变),并且包含许多不同大小的间隙(由于与写入单独闪存设备相关的延迟)

我用的加速度计是最便宜的。我以最高增益运行加速计,因此数据具有显著的噪声地板

每个时间序列都有大约200万个数据点(以512个采样/秒的速度超过一小时),并包含大约500个感兴趣的事件,其中一个典型事件跨越100-150个采样(每个采样200-300毫秒)。其中许多事件都受到闪存写入期间数据中断的影响

因此,数据不是原始的,甚至不是很漂亮。但我的眼球检查显示它清楚地包含了我感兴趣的信息。(如果需要,我可以发布绘图。)

加速计处于类似的环境中,但只是适度耦合,这意味着我可以通过眼睛判断每个加速计匹配的事件,但到目前为止,我在软件中这样做是不成功的。由于物理限制,设备也安装在不同的方向上,轴不匹配,但它们尽可能接近正交。例如,对于三轴加速度计A和B,+Ax映射到-By(上下),+Az映射到-Bx(左-右),而+Ay映射到-Bz(前-后)

我最初的目标是关联垂直轴上的冲击事件,尽管我最终希望a)自动发现轴映射,b)关联映射ACE上的活动,以及c)提取两个加速计之间的行为差异(如扭曲或弯曲)

times series数据的性质使得Python的numpy.correlate()无法使用。我也看过R的动物园套餐,但没有任何进展。我曾向信号分析的不同领域寻求帮助,但没有取得任何进展

有人知道我能做什么,或者我应该研究什么方法吗


2011年2月28日更新:添加了一些显示数据示例的图。

听起来您想最小化一对值的函数(Ax'+By)+(Az'+Bx)+(Ay'+Bz):即时间偏移:t0和时间比例因子:tr。其中Ax'=tr*(Ax+t0)等

import numpy
from scipy.ndimage import gaussian_filter
"""
sig1 and sig 2 are assumed to be large, 1D numpy arrays
sig1 is sampled at times t1, sig2 is sampled at times t2
t_start, t_end, is your desired sampling interval
t_len is your desired number of measurements
"""

t = numpy.linspace(t_start, t_end, t_len)
sig1 = numpy.interp(t, t1, sig1)
sig2 = numpy.interp(t, t2, sig2)
#Now sig1 and sig2 are sampled at the same points.

"""
Rectify and smooth, so 'peaks' will stand out.
This makes big assumptions about your data;
these assumptions seem true-ish based on your plots.
"""
sigma = 10 #Tune this parameter to get the right smoothing
sig1, sig2 = abs(sig1), abs(sig2)
sig1, sig2 = gaussian_filter(sig1, sigma), gaussian_filter(sig2, sigma)

"""
Now sig1 and sig2 should look smoothly varying, with humps at each 'event'.
Hopefully we can search a small range of shifts to find the maximum of the 
cross-correlation. This assumes your data are *nearly* lined up already.
"""
max_xc = 0
best_shift = 0
for shift in range(-10, 10): #Tune this search range
    xc = (numpy.roll(sig1, shift) * sig2).sum()
    if xc > max_xc:
        max_xc = xc
        best_shift = shift
print 'Best shift:', best_shift
"""
If best_shift is at the edges of your search range,
you should expand the search range.
"""
我将研究SciPy的二元函数。我会在“间隙”上使用一个或临时将数据归零(例如Ax和By)(假设间隙可以通过编程确定)

为了使过程更有效,从a和B的粗采样开始,但在
fmin
(或您选择的任何优化器)中设置与采样相称的精度。然后继续逐步细化完整数据集的采样窗口,直到窗口变窄且未向下采样

编辑-匹配轴


关于试图识别哪个轴与给定轴共线,而不知道数据的特征的问题,我可以指向一个类似的问题。查看后文中概述的方法或任何其他方法,以帮助识别类似的波形。

如果数据包含未知大小的间隙,并且在每个时间序列中都不同,那么我将放弃尝试关联整个序列,而是尝试在每个时间序列上交叉关联短窗口对,假设重叠窗口的长度是典型事件的两倍(300个样本长)。在所有可能的情况下找到潜在的高互相关匹配,然后对潜在匹配施加顺序约束,以获得匹配窗口的序列


从那以后,你就有了更容易分析的小问题。

这不是一个技术性的答案,但它可能会帮助你想出一个:

  • 将绘图转换为图像,并将其粘贴到一个像样的图像程序中,如gimp或photoshop
  • 当有间隙时,将绘图分解为离散图像
  • 将第一系列绘图放在水平线上
  • 将第二个系列放在其正下方的水平线上
  • 直观地识别第一个相关事件
  • 如果两个事件没有垂直排列:
    • 在该行中,选择最左边的实例和右边的所有对象
    • 把那些东西拖到右边,直到它们排成一行
这就是音频编辑器的工作原理,所以如果你把它转换成一个简单的音频格式,比如一个未压缩的WAV文件,你可以直接用Audacity之类的东西来操作它。(当然,这听起来很可怕,但你可以很容易地移动数据图。)


实际上,audacity也有一种叫做nyquist的脚本语言,因此如果您不需要该程序来检测相关性(或者您至少愿意暂时推迟该步骤)您可能会使用audacity的标记和nyquist的一些组合来自动对齐,并在标记相关点后以您选择的格式导出干净的数据。

我的猜测是,您必须手动构建一个偏移表来对齐序列之间的“匹配”。下面是获得这些匹配的一个示例。其想法是将数据左右移动,直到对齐,然后调整比例,直到“匹配”。试试看

library(rpanel)

#Generate the x1 and x2 data
n1 <- rnorm(500)
n2 <- rnorm(200)
x1 <- c(n1, rep(0,100), n2, rep(0,150))
x2 <- c(rep(0,50), 2*n1, rep(0,150), 3*n2, rep(0,50))

#Build the panel function that will draw/update the graph
lvm.draw <- function(panel) {
       plot(x=(1:length(panel$dat3))+panel$off, y=panel$dat3, ylim=panel$dat1, xlab="", ylab="y", main=paste("Alignment Graph   Offset = ", panel$off, "   Scale = ", panel$sca, sep=""), typ="l")
       lines(x=1:length(panel$dat3), y=panel$sca*panel$dat4, col="red")
       grid()
       panel
}

#Build the panel
xlimdat <- c(1, length(x1))
ylimdat <- c(-5, 5)
panel <- rp.control(title = "Eye-Ball-It", dat1=ylimdat, dat2=xlimdat, dat3=x1, dat4=x2, off=100, sca=1.0, size=c(300, 160))
rp.slider(panel, var=off, from=-500, to=500, action=lvm.draw, title="Offset", pos=c(5, 5, 290, 70), showvalue=TRUE)
rp.slider(panel, var=sca, from=0, to=2, action=lvm.draw, title="Scale", pos=c(5, 70, 290, 90), showvalue=TRUE)
库(rpanel)
#生成x1和x2数据

n1我对你的问题的解释是:给定两个非常长、嘈杂的时间序列,找出一个偏移量,该偏移量与一个信号中的大“凸起”匹配,与另一个信号中的大凸起匹配

我的建议是:对数据进行插值,使其均匀分布,校正并平滑数据(假设快速振荡的相位是无趣的),并进行一次一点的互相关(假设一个小的偏移将排列数据)

听起来我