Matlab:从信号中分离数据样本

信息处理 matlab
2022-02-02 19:16:19

我有三个手臂代表的 EMG 信号的数据样本。在数据中,我有 1 个信号是平坦的,然后电压波动,然后再次变得平坦,每个代表显示三个脉冲。我想将三个代表与信号分开(将信号分成 3 部分)。我可以通过绘制信号然后放大并在电压变化波动之前和之后再次变平线之后找到索引来手动执行此操作。我想知道是否有一种自动化的方法可以做到这一点。某种贪心算法或内置的 Matlab 函数。有任何想法吗?

一个例子:

[12,-23,1,-2,-40,-45,80,85,14,-28,10,-22,-100,-105,80,85,14,-2,
 16,-2,-200,-45,305,85,1,-2,1,-2]

所以我想要:

1 [-40,-45,80,85]
2 [-100,-105,80,85]
3 [-200,-45,305,85]

通常,平线值从零开始变化。

1个回答

这有点 hacky,但它使用了三个模型,你必须找到一个“特征”脉冲,然后用这个“特征”脉冲获取一个标准化信号段的连续内积,给出一个介于 -1.0 和 1.0 之间的测量值。

图像中的红线是您的数据。黑线是这个标准化的度量。您必须对其进行完整性检查(在先前检测的 2 个样本内没有检测到?),但除了选择高于 0.8 的任何值之外,您应该可以检测到脉冲的开始。

在此处输入图像描述


下面的R代码

  #31201

  arm <- c(12,-23,1,-2,-40,-45,80,85,14,-28,10,-22,-100,-105,80,85,14,-2, 16,-2,-200,-45,305,85,1,-2,1,-2)

  #1 [-40,-45,80,85]
  #2 [-100,-105,80,85]
  #3 [-200,-45,305,85]
  rep1 <- c(-40,-45,80,85)
  rep2 <- c(-100,-105,80,85)
  rep3 <- c(-200,-45,305,85)

  repMat <- rep1 %*% t(rep1) + rep2 %*% t(rep2) + rep3 %*% t(rep3);
  mean1 <- (rep1+rep2+rep2)/3

  eigs <- eigen(repMat)

  plot(rep1, ylim=c(-350, 350), col="red", lwd=6, type="l")
  lines(rep2, col="green", lwd=4)
  lines(rep3, col="blue", lwd=2)
  lines(mean1)
  lines(eigs$vectors[,1]*sqrt(eigs$values[1]), col="purple", lwd=1)

  eigs$vectors[,1] %*% rep1

  similarity <- rep(0,length(arm))
  for (idx in seq(1,length(arm)-3))
  {
    patch <- arm[idx + seq(0,3)]
    patch <- patch / sqrt(sum(patch ^ 2))
    similarity[idx] <- (eigs$vectors[,1] %*% patch)
  }

  plot(similarity, type="l")
  lines(arm/max(arm), col="red")