如何对齐/同步两个信号?


21

我正在做一些研究,但是一直停留在分析阶段(应该更多地关注我的统计讲座)。

我收集了两个同时发生的信号:对体积进行积分的流速和对胸部扩张的改变。我想比较这些信号,最终希望从胸部扩张信号中得出体积。但是首先我必须对齐/同步我的数据。

由于记录不是在同一时间开始,并且胸部扩展被捕获的时间更长,因此我需要在胸部扩展数据集中找到与我的体数据相对应的数据,并衡量它们的对齐程度。如果两个信号不是完全同时启动,或者不是在不同比例和不同分辨率的数据之间启动,我不太确定该如何处理。

我已经附上了这两个信号的示例(https://docs.google.com/spreadsheet/ccc?key=0As4oZTKp4RZ3dFRKaktYWEhZLXlFbFVKNmllbGVXNHc),请告诉我是否还有其他信息。


我不太了解这个问题,也不能确定是否解决了这个问题,但是一种同步信号的方法称为“注册”,它是功能数据分析的子集。Ramsey和Silverman的FDA书中讨论了此主题。基本思想是观察到的信号可能会“扭曲”(例如,如果我们对人们咀嚼方式的机制感兴趣,但是我们掌握了人们以不同速度咀嚼的数据-在这种情况下,时间轴会“扭曲”),并且配准尝试以通用的“不变形”规模定义基础信号。
2012年

1
您已经收集了所有数据吗?这是一名飞行员吗?如果您刚开始使用,我会考虑从皮带上分离出信号,并将其用作触发(甚至只是标记时间戳)流量记录。通常,采集系统具有辅助端口或触发端口的此功能。我敢肯定,有一些方法可以像Macro所建议的那样仅使用您的数据来区分它,但是添加此额外步骤将消除很多猜测。
jonsca 2012年

1
我认为,您只想估计固定的延迟。你可以使用所列出这里交叉关联:stats.stackexchange.com/questions/16121/...
thias

1
您可能想在dsp.SE上问这个问题,他们也考虑信号同步。
Dilip Sarwate'7

1
@Thias是正确的,但似乎应该重新采样第一个系列,以便它们具有相同的间隔。
ub

Answers:


24

该问题询问如何确定以规则但不同的时间间隔对一个时间序列(“扩展”)滞后于另一个时间序列(“体积”)的数量。

如图所示,在这种情况下,两个系列都表现出合理的连续行为。这意味着(1)可能需要很少或不需要初始平滑,并且(2)重采样可以像线性或二次插值一样简单。由于平滑度,二次方可能会稍好一些。 重新采样后,通过最大化互相关来找到滞后,如线程所示,对于两个偏移采样数据系列,它们之间的偏移的最佳估计是什么?


为了说明,我们可以使用问题中提供的数据,R用于伪代码。让我们从基本功能,互相关和重采样开始:

cor.cross <- function(x0, y0, i=0) {
  #
  # Sample autocorrelation at (integral) lag `i`:
  # Positive `i` compares future values of `x` to present values of `y`';
  # negative `i` compares past values of `x` to present values of `y`.
  #
  if (i < 0) {x<-y0; y<-x0; i<- -i}
  else {x<-x0; y<-y0}
  n <- length(x)
  cor(x[(i+1):n], y[1:(n-i)], use="complete.obs")
}

这是一个粗略的算法:基于FFT的计算会更快。但是对于这些数据(涉及约4000个值)来说已经足够了。

resample <- function(x,t) {
  #
  # Resample time series `x`, assumed to have unit time intervals, at time `t`.
  # Uses quadratic interpolation.
  #
  n <- length(x)
  if (n < 3) stop("First argument to resample is too short; need 3 elements.")
  i <- median(c(2, floor(t+1/2), n-1)) # Clamp `i` to the range 2..n-1
  u <- t-i
  x[i-1]*u*(u-1)/2 - x[i]*(u+1)*(u-1) + x[i+1]*u*(u+1)/2
}

我将数据下载为以逗号分隔的CSV文件,并剥离了其标题。(标头给R带来了一些我不希望诊断的问题。)

data <- read.table("f:/temp/a.csv", header=FALSE, sep=",", 
                    col.names=c("Sample","Time32Hz","Expansion","Time100Hz","Volume"))

注意: 此解决方案假定每个系列的数据均按时间顺序排列,且两个之间都没有间隔。 这样,它就可以将值中的索引用作时间的代理,并通过时间采样频率缩放这些索引,以将其转换为时间。

事实证明,这些仪器中的一个或两个都随时间漂移一些。最好在继续操作之前消除这种趋势。另外,由于结尾处的音量信号逐渐变细,因此我们应将其剪切掉。

n.clip <- 350      # Number of terminal volume values to eliminate
n <- length(data$Volume) - n.clip
indexes <- 1:n
v <- residuals(lm(data$Volume[indexes] ~ indexes))
expansion <- residuals(lm(data$Expansion[indexes] ~ indexes)

我对频率较低的序列进行重新采样,以便从结果中获得最高精度。

e.frequency <- 32  # Herz
v.frequency <- 100 # Herz
e <- sapply(1:length(v), function(t) resample(expansion, e.frequency*t/v.frequency))

现在可以计算互相关了-为了提高效率,我们只搜索一个合理的滞后窗口-并且可以确定找到最大值的滞后。

lag.max <- 5       # Seconds
lag.min <- -2      # Seconds (use 0 if expansion must lag volume)
time.range <- (lag.min*v.frequency):(lag.max*v.frequency)
data.cor <- sapply(time.range, function(i) cor.cross(e, v, i))
i <- time.range[which.max(data.cor)]
print(paste("Expansion lags volume by", i / v.frequency, "seconds."))

输出告诉我们,扩展使音量滞后1.85秒。(如果未裁剪最后3.5秒的数据,则输出将为1.84秒。)

最好以几种方式检查所有内容,最好是目视检查。首先,互相关函数

plot(time.range * (1/v.frequency), data.cor, type="l", lwd=2,
     xlab="Lag (seconds)", ylab="Correlation")
points(i * (1/v.frequency), max(data.cor), col="Red", cex=2.5)

互相关图

接下来,让我们及时记录这两个系列,并将它们绘制在相同的轴上

normalize <- function(x) {
  #
  # Normalize vector `x` to the range 0..1.
  #
  x.max <- max(x); x.min <- min(x); dx <- x.max - x.min
  if (dx==0) dx <- 1
  (x-x.min) / dx
}
times <- (1:(n-i))* (1/v.frequency)
plot(times, normalize(e)[(i+1):n], type="l", lwd=2, 
     xlab="Time of volume measurement, seconds", ylab="Normalized values (volume is red)")
lines(times, normalize(v)[1:(n-i)], col="Red", lwd=2)

注册地块

看起来不错! 不过,我们可以通过散点图更好地了解注册质量。我会根据时间改变颜色以显示进度。

colors <- hsv(1:(n-i)/(n-i+1), .8, .8)
plot(e[(i+1):n], v[1:(n-i)], col=colors, cex = 0.7,
     xlab="Expansion (lagged)", ylab="Volume")

散点图

我们正在寻找沿着一条线来回追踪的点:变化的点反映了体积扩展的时间滞后响应中的非线性。尽管有一些变化,但它们很小。然而,这些变化如何随时间变化可能具有某些生理意义。关于统计的奇妙之处,尤其是其探索性和可视性方面,在于它如何趋向于产生好的问题想法以及有用的答案。


1
天哪,你真了不起。互相关正好是我在想的(我知道必须有个名字),但是您的答案/解释超出了我的想象。非常感谢!
person157 2012年

我现在没有时间进行充分的解释,但是“数字食谱”书中出现了一个不错的说明。例如,请参见C中的数字食谱中的第13.2章“使用FFT进行相关和自相关” 。您也可以研究R的acf功能。
ub

r的新手,请好心:组合图(倒数第二个图)中使用的“规范化”功能对我不起作用,自发布此答案以来,此功能是否有更新?
CmKndy 2015年

1
@CmKndy我也刚接触R过,当我发布此答案时,只是忘记提供该函数的定义。原来是这样的:normalize <- function(x) { x.max <- max(x); x.min <- min(x); dx <- x.max - x.min; if (dx==0) dx <- 1; (x-x.min) / dx }
呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜永远十五将住着对着

太好了,谢谢@whuber。如果您
刚接触
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.