检测波浪中的图案


78

我正在尝试从心电图读取图像并检测其中的每个主要波(P波,QRS复波和T波)。现在,我可以读取图像并得到一个代表(4.2; 4.4; 4.9; 4.7; ...)的矢量,代表心电图中的值,这是问题的一半。我需要一种算法,该算法可以遍历此向量并检测何时每个波开始和结束。

这是其中一个图表的示例:

替代文字

如果它们始终具有相同的大小,则很容易,但是它不起作用,或者我知道心电图会产生多少波,但它也可以变化。有人有想法吗?

谢谢!

更新中

我要实现的示例:

鉴于浪潮

替代文字

我可以提取向量

[0; 0; 20; 20; 20; 19; 18; 17; 17; 17; 17; 17; 16; 16; 16; 16; 16; 16; 16; 17; 17; 18; 19; 20; 21; 22; 23; 23; 23; 25; 25; 23; 22; 20; 19; 17; 16; 16; 14; 13; 14; 13; 13; 12; 12; 12; 12; 12; 11; 11; 10; 12; 16; 22; 31; 38; 45; 51; 47; 41; 33; 26; 21; 17; 17; 16; 16; 15; 16; 17; 17; 18; 18; 17; 18; 18; 18; 18; 18; 18; 18; 17; 17; 18; 19; 18; 18; 19; 19; 19; 19; 20; 20; 19; 20; 22; 24; 24; 25; 26; 27; 28; 29; 30; 31; 31; 31; 32; 32; 32; 31; 29; 28; 26; 24; 22; 20; 20; 19; 18; 18; 17; 17; 16; 16; 15; 15; 16; 15; 15; 15; 15; 15; 15; 15; 15; 15; 14; 15; 16; 16; 16; 16; 16; 16; 16; 16; 16; 15; 16; 15; 15; 15; 16; 16; 16; 16; 16; 16; 16; 16; 15; 16; 16; 16; 16; 16; 15; 15; 15; 15; 15; 16; 16; 17; 18; 18; 19; 19; 19; 20; 21; 22; 22; 22; 22; 21; 20; 18; 17; 17; 15; 15; 14; 14; 13; 13; 14; 13; 13; 13; 12; 12; 12; 12; 13; 18; 23; 30; 38; 47; 51; 44; 39; 31; 24; 18; 16; 15; 15; 15; 15; 15; 15; 16; 16; 16; 17; 16; 16; 17; 17; 16; 17; 17; 17; 17; 18; 18; 18; 18; 19; 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 16; 16; 16; 17; 16; 16; 17; 17; 16; 17; 17; 17; 17; 18; 18; 18; 18; 19; 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 16; 16; 16; 17; 16; 16; 17; 17; 16; 17; 17; 17; 17; 18; 18; 18; 18; 19; 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 19; 20; 20; 20; 20; 21; 22; 22; 24; 25; 26; 27; 28; 29; 30; 31; 32; 33; 32; 33; 33; 33; 32; 30; 28; 26; 24; 23; 23; 22; 20; 19; 19; 18; 17; 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 17; 18; 17; 18; 18; 17; 18; 17; 18; 18; 17; 17; 17; 17; 16; 17; 17; 17; 18; 18; 17; 17; 18; 18; 18; 19; 18; 18; 17; 18; 18; 17; 17; 17; 17; 17; 18; 17; 17; 18; 17; 17; 17; 17; 17; 17; 17; 18; 17; 17; 18; 18; 18; 20; 20; 21; 21; 22; 23; 24; 23; 23; 21; 21; 20; 18; 18; 17; 16; 14; 13; 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;] 13; 13; 13; 13; 13; 13; 13; 13; 12; 12; 12; 16; 19; 28; 36; 47; 51; 46; 40; 32; 24; 20; 18; 16; 16; 16; 16; 15; 16; 16; 16; 17; 17; 17; 18; 17; 17; 18; 18; 18; 18; 19; 18; 18; 19; 20; 20; 20; 20; 20; 21; 21; 22; 22; 23; 25; 26; 27; 29; 29; 30; 31; 32; 33; 33; 33; 34; 35; 35; 35; 0; 0; 0; 0;]

例如,我想检测

[19-37]中的P波

[51-64]中的QRS复合体

等等...


11
这是一个非常有趣的问题!
jonnii'2

14
这是我真正希望问题作业的时候!
caf 2010年

看我的编辑,我回复了您的编辑...
rook 2010年

1
这个问题是惊人的,我不得不回到我的计算机来更新我的解决方案。我希望你们喜欢:)
rook 2010年

我认识一个在这个领域工作过的人。在这里您可以找到他的出版物清单。如果我没记错的话,他使用隐马尔可夫模型对一组已知形状的训练波进行可靠的检测,但是您会在本文中找到更多详细信息。
Stefano Borini 2010年

Answers:


55

要做的第一件事是查看那里已经有什么。确实,这个特定的问题已经被大量研究。这是一些非常简单的方法的简要概述:link

我也必须回答另一个答案。我从事信号处理和音乐信息检索方面的研究。从表面上看,此问题的确与发作检测相似,但问题背景不同。这种类型的生物信号处理,即检测P,QRS和T阶段,可以利用特定时域特性的知识这些波形中每个波形的。实际上,MIR中的启动检测不是。(至少不可靠。)

动态时间扭曲是一种对QRS检测(但不一定对音符开始检测)有效的方法。当时域特性保持不变时,DTW可以很好地工作。这是使用DTW解决此问题的简短IEEE论文:link

这是一篇很棒的IEEE杂志文章,比较了许多方法:link。您会看到尝试了许多常见的信号处理模型。略读本文,然后尝试基本了解的内容。

编辑:浏览这些文章后,基于小波的方法对我来说似乎最直观。DTW也将很好地工作,并且存在DTW模块,但是小波方法对我来说似乎是最好的。有人通过利用信号的导数来回答。我的第一个链接研究的是1990年前的方法,但我怀疑它们不像更现代的方法那样健壮。

编辑:我会尽力给出一个简单的解决方案,当我得到机会,但原因为什么我觉得小波在这里适用的是因为他们在无论参数化各种形状的有效时间或幅度缩放。换句话说,如果您的信号具有相同的重复时间形状,但时标和振幅不同,则小波分析仍可以将这些形状识别为相似的(大致而言)。另请注意,我将过滤器库混入此类。类似的事情。


我知道它的要求很多,但我仍然会看到一个简单的解决方案。
迭戈

我很抱歉。我一直很忙 它又回到了我的待办事项清单上。
史蒂夫·乔阿

4
顶部链接现在已死:(
basickarl 2015年

抱歉。顶部的两个链接现已修复。
Steve Tjoa

第一个链接再次断开,但是我在这里找到。我想这是IEEE,因此应该保持发展。当然,如果存在成本障碍,那么有很多关于类似主题的论文
Asaaj

16

这个难题的一部分是“发作检测”,并且已经编写了许多复杂的算法来解决此问题。这里有更多关于发病的信息。

下一块是汉明距离。该算法允许您进行模糊比较,输入是2个数组,输出是2个数据集之间的整数“距离”或差。数字越小,2越相似。这非常接近您的需求,但并不完全正确。我继续对汉明距离算法进行了一些修改,以计算新的距离,它可能有一个名称,但我不知道它是什么。基本上,它求和数组中每个元素之间的绝对距离并返回总数。这是python中的代码。

import math

def absolute_distance(a1, a2, length):
       total_distance=0
       for x in range(0,length):
               total_distance+=math.fabs(a1[x]-a2[x])
       return total_distance

print(absolute_distance([1,3,9,10],[1,3,8,11],4))

该脚本输出2,这是这2个数组之间的距离。

现在将这些片段放在一起。您可以使用“开始检测”来找到数据集中所有波的开始。然后,您可以循环这些位置,将每个波与样本P波进行比较。如果您打了QRS综合大楼,距离将是最大的。如果您按下另一个P-Wave,该数字将不会为零,但会小得多。任何P波形和任何T波形之间的距离都将非常小,但是,如果进行以下假设,这将不是问题:

The distance between any p-wave and any other p-wave will be smaller than the distance between any p-wave and any t-wave.

该系列看起来像这样:pQtpQtpQt ... p波和t波彼此相邻,但是由于此序列是可预测的,因此更易于阅读。

另一方面,可能存在基于微积分的解决方案。但是在我看来,曲线拟合和积分使这个问题更加混乱。我写的距离函数会发现面积差,这减去两条曲线的积分非常相似。

可以牺牲开始计算,而一次只迭代1个点,从而执行O(n)距离计算,其中n是图中的点数。如果您具有所有这些距离计算的列表,并且知道那里有50个pQt序列,那么您将知道50个最短的距离,这些距离在p波的所有位置都不重叠答对了! 为了简单起见,这怎么样?但是,由于距离计算数量的增加,折衷是效率的损失。


更简单的技术(例如检测时域幅度的增加)通常会导致不正确的假阳性或假阴性数量过多。 那就是我所担心的。我曾在我的解决方案中提出过同样的建议(并非最优)。
Vivin Paliath '02

3
是的,您的算法很有趣,您的成功可能有限。如果没有完美的解决方案,这是一个非常复杂的问题。
rook 2010年

感谢您的回答迈克尔,我正在考虑中,我会尽快发布一些反馈!
Alaor

8

您可以使用互相关。取每个模式的模型样本,并将它们与信号相关联。您将在相关性很高的地方获得峰。我希望这种提取qrs和t波的技术能获得良好的结果。之后,您可以通过在qrs之前的相关信号上寻找峰值来提取p波。

互相关是一个非常容易实现的算法。基本上:

x is array with your signal of length Lx
y is an array containing a sample of the signal you want to recognize of length Ly
r is the resulting correlation

for (i=0; i<Lx - Ly; i++){
  r[i] = 0;
  for (j=0; j<Ly ; j++){
    r[i] += x[i+j]*y[j];
  }
}

并寻找r中的峰值(例如,超过阈值的值)


这是一个很好的尝试方法,因为波浪总是遵循一定的模式。但是对于这个问题,时间缩放和幅度缩放都可能会发生变化,因此最终,这种方法在所有对象上都不会很可靠。
Steve Tjoa'2

是的,这只是第一种方法。没有健壮性,但足够简单以进行编码尝试。模式匹配通常是最简单的技术,并且仍然可以提供一些结果。当然,小波肯定好得多。
nacmartin

7

我要做的第一件事就是简化数据。

无需分析绝对数据,而是分析从一个数据点到下一个数据点的变化量。

这是一个快速的班轮,它将;分离的数据作为输入,并输出该数据的增量。

perl -0x3b -ple'( $last, $_ ) = ( $_, $_-$last )' < test.in > test.out

在您提供的数据上运行它,这是输出:

0; 0; 20; 0; 0; -1; -1; -1; 0; 0; 0; 0; -1; 0; 0; 0; 0; 0; 1; 0; 1; 1; 1; 1; 1; 1; 0; 0; 2; 0; -2; -1; -2; -1; -2; -1; 0; -2; -1; 1; -1; 0;- 1; 0; 0; 0; 0; -1; 0; -1; 2; 4; 6; 9; 7; 7; 6; -4; -6; -8; -7; -5; -4; 0; -1; 0;- 1; 1; 1; 0; 1; 0; -1; 1; 0; 0; 0; 0; 0; 0; -1; 0; 1; 1; -1; 0; 1; 0; 0; 0 ; 1; 0; -1; 1; 2; 2; 0; 1; 1; 1; 1; 1; 1; 1; 0; 0; 1; 0; 0; -1; -2; -1; -2; -2; -2; -2 ; 0; -1; -1; 0; -1; 0; -1; 0; -1; 0; 1; -1; 0; 0; 0; 0; 0; 0; 0; -1; 1; 1; 0; 0; 0; 0; 0; 0; 0; 0; -1; 1; -1; 0; 0; 1; 0; 0; 0; 0; 0; 0; 0; -1; 1; 0; 0; 0; 0 ; -1; 0; 0; 0; 0; 1; 0; 1; 1; 0; 1; 0; 0; 1; 1; 1; 0; 0; 0; -1; -1; -2;- 1; 0; -2; 0; -1; 0; -1; 0; 1; -1; 0; 0; -1; 0; 0; 0; 1; 5; 5; 7; 8; 9; 4; -7; -5; -8 ; -7; -6; -2; -1; 0; 0; 0; 0; 0; 1; 0; 0; 1; -1; 0; 1; 0; -1; 1; 0; 0; 0 ; 1; 0; 0; 0; 1; 0; 1; 0; 0; 0; 1; 1; 0; 2; 1; 1; 1; 1; 1; 1; 1; 1; 1; -1; 1; 0; 0; -1; -2; -2; -2; -2; -1; 0; -1; -2; -1; 0; -1; -1; 0; 1; -1; 1; 0; -1; 1; -1; 1; 0; -1; 0; 0; 0; -1; 1; 0; 0; 1; 0; -1; 0; 1; 0; 0; 1; -1; 0; -1; 1; 0; -1; 0; 0 ; 0; 0; 1; -1; 0; 1; -1; 0; 0; 0; 0; 0; 0; 1; -1; 0; 1; 0; 0; 2; 0; 1; 0; 1; 1; 1; -1; 0; -2; 0; -1; -2; 0; -1; -1; -2; -1; 0; 0; 0; 0; 0; 0; 0; 0; -1; 0; 0; 4; 3; 9; 8; 11; 4; -5; -6; -8; -8; -4; -2; -2; 0; 0; 0; -1; 1; 0; 0; 1; 0; 0; 1; -1; 0; 1; 0; 0; 0; 1; -1; 0; 1; 1; 0; 0; 0; 0; 1; 0; 1; 0; 1; 2; 1; 1; 2; 0; 1 ; 1; 1; 1; 0; 0; 1; 1; 0; 0; -35; 0; 0; 0;

在上面的文本中插入了换行符,这些换行符最初并不出现在输出中。


完成此操作后,找到qrs复合体就变得很简单。

perl -F';' -ane'@F = map { abs($_) > 2 and $_ } @F; print join ";", @F'< test.out

;; 20 ;;;;;;;;;;;;;;;;;;; ;;; 4; 6; 9; 7; 7; 6; -4; -6; -8; -7; -5; -4;
;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;; ;;;;;;;; 5; 5; 7; 8; 9; 4; -7; -5; -8; -7; -6; -6
;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;; ;;;;;;;;; 4; 3; 9; 8; 11; 4; -5; -6; -8; -8; -4;
;;;;;;;;;;;;;;;;;;-;-35 ;;;

20-35从开始和结尾的原始数据的数据点产生0

要查找其他数据点,您将不得不依靠模式匹配。


如果看第一个p波,您可以清楚地看到一个模式。

0;0;0;0;0;0;1;0;1;1;1;1;1;1;0;0;2;0;-2;-1;-2;-1;-2;-1;0;-2;-1;1;-1;0;-1;0;0;0;0;
#           \________ up _______/   \________ down _________/

不过,要在第二个p波上看到图形并不容易。这是因为第二个被进一步分散

0;0;0;1;0;1;1;0;1;0;0;1;1;1;0;0;0;-1;-1;-2;-1;0;-2;0;-1;0;-1;0;1;-1;0;0;-1;0;0;0;
#     \________ up _______/       \________________ down ________________/

第三个P波比其他两个P波稍微不稳定。

0;0;0;0;0;1;-1;0;1;0;0;2;0;1;0;1;1;1;-1;0;-2;0;-1;-2;0;-1;-1;-2;-1;0;0;0;0;0;
#                \_______ up ______/  \__________ down __________/

您将以类似于p波的方式找到t波。主要区别是它们何时发生。


这应该是足够的信息,可以帮助您入门。

这两个单衬管仅作为示例,不建议日常使用。


我对此进行了编辑,以删除破坏页面的长行。:P
GManNickG'2

@GMan对我来说很好,您使用的是哪个浏览器?
布拉德·吉尔伯特

在Firefox 3.5中,该行将页面水平延伸。我认为这是一个已知的错误。
GManNickG'2

1
-1:我只看到解决问题的手动方法,用户可以通过简单地绘制数据并选择自己的起点来完成。
汉尼斯·奥夫雷恩(HannesOvrén)2010年

4

另外两个尖锐的峰谷也是qrs复合体吗?

我想不到的是,您需要做的是计算该图在每个点的斜率。然后,您还需要查看斜率变化的速度(二阶导数???)。如果您有一个突然的变化,那么您就知道自己已经达到了一个尖峰。当然,您希望限制对变化的检测,因此您可能想要执行类似“如果斜率在时间间隔T内X改变”之类的操作,这样就不会拾取图中的微小颠簸。

自从我做任何数学以来已经有一段时间了...这似乎是一个数学问题;)哦,我也没有进行任何信号分析:)。

只是增加了一点。我也可以尝试信号平均。例如,平均最后3或4个数据点。我认为您也可以通过这种方式检测到突然的变化。


+1为有趣的算法。但是我认为这个问题有点复杂。
rook 2010年

是的,另外两个高峰和低谷是qrs复合体。该图像实际上具有3 p波,3 qrs络合物和3 t波。这是一种有趣的方法,但是如果没有函数,我看不到如何计算二阶导数。我想您是说要对值的更改评分,然后选择那些具有较高评分的更改,例如某事物的开始和结束,是吗?我将尝试一下,当我得到一些结果时,我会发表评论。感谢您的回答。
Alaor 2010年

是的,差不多。您正在对它进行评分,但是您可以通过计算斜率或查看幅度随时间变化的方式来实现。
Vivin Paliath '02

4

我不是这个特定问题的专家,但是我对更一般的知识不屑一顾:假设您知道QRS复合体(或其他功能之一,但在本示例中将使用QRS复合体)大约发生在长度为L的某个固定时间段内。我想知道是否可以将其视为分类问题,如下所示:

  1. 将信号分成长度为L的重叠窗口。每个窗口中都包含或不包含完整的QRS复合信号。
  2. 傅立叶变换每个窗口。您的功能是每个频率下的信号强度。
  3. 在一些手工注释的数据上训练决策树,支持向量机等。

3

一种很有可能产生良好结果的方法是曲线拟合:

  • 将连续波划分为间隔(最好使间隔边界位于qrs络合物的尖峰之间的一半左右)。一次只考虑一个间隔。
  • 定义一个模型函数,可用于近似心电图曲线的所有可能变化。这并不像初看起来那样困难。可以将模型函数构造为三个函数的总和,三个函数的参数分别为每个波的原点(t_),幅度(a_)和宽度(w_)。

       f_model(t) = a_p   *  f_p  ((t-t_p  )/w_p) + 
                    a_qrs *  f_qrs((t-t_qrs)/w_qrs) +
                    a_t   *  f_t  ((t-t_t  )/w_t)
    

    的功能f_p(t)f_qrs(t)f_t(t)一些简单的功能,可以是使用模型分别在三个波。

  • 使用拟合算法(例如Levenberg-Marquardt-Algorithm http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm)确定拟合参数a_p,t_p,w_p,a_qrs,t_qrs,w_qrs,a_t ,t_t,w_t为每个intervall的数据集。

    参数t_p,t_qrs和t_p是您感兴趣的参数。


3

这是一个很好的问题!我有几点想法:

动态时间规整在这里可能是一个有趣的工具。您将为三个类别建立“模板”,然后使用DTW可以查看模板和信号“块”之间的相关性(将信号分解为0.5秒位,即0-.5)。 1-.6 .2-.7 ...)。我曾使用加速度计数据进行过类似的步态分析,但效果很好。

另一个选择是组合的信号处理/机器学习算法。再次将信号分解为“块”。再次制作“模板”(每个类需要十几个左右),对每个块/模板进行FFT,然后使用朴素贝叶斯分类器(或另一个ML分类器,但是NB应该将其切开)为每个分类你的三个班。我还在步态数据上进行了尝试,能够获得高达98%的精度,并可以使用相对复杂的信号进行召回。让我知道这是如何工作的,这是一个非常令人兴奋的问题。


1

小波变换”可能是一个相关关键字。我曾经参加过一个人的演讲,该人使用这种技术在嘈杂的心电图中检测不同的心跳相位。

就我有限的理解而言,它有点像傅立叶变换,但是使用(按比例)心跳形脉冲的(缩放)副本。


1

小波已被证明是在峰值为“不同大小”的此类数据中定位峰值的最佳工具-小波的缩放属性使其成为此类多尺度峰检测的理想工具。这看起来像是非平稳信号,因此使用DFT并不是某些人建议的正确工具,但是如果这是一个探索性项目,则可以考虑使用信号频谱(本质上使用FFT的自相关FFT估算)信号。)

是一篇很棒的论文,回顾了几种峰检测方法-这将是一个很好的起点。

保罗



0

我尚未仔细阅读彼此的答案,但已对其进行了扫描,我发现没有人建议查看傅立叶变换来分割这些波。

对我来说,似乎是谐波分析在数学中的明确应用。我可能会缺少一些微妙的观点。

离散傅立叶变换系数给你不同的正弦组件,使您的离散时间信号,这基本上是你的问题陈述了您要查找的振幅和相位。

我可能在这里错过了一些东西...


您在这里应用谐波分析是正确的,但是问题的特殊性使得特定方法(例如小波分析)比仅检查幅度响应的常规方法更好地工作。对于这个问题,相对相位偏移很重要
史蒂夫·乔阿

0

首先,任何给定图中都可能缺少标准心电图波的各个组成部分。这样的情节通常是异常的,通常表示某种问题,但是不能保证它们在那里。

其次,认识到它们既是科学也是艺术,尤其是在出现问题的情况下。

我的方法可能是尝试训练神经网络来识别组件。您将为它提供前30秒的数据,将其标准化后,最低点为0,最高点为1.0,它将有11个输出。不是异常评级的输出将是最近10秒钟的权重。0.0表示从现在起-10秒,而1.0表示现在。输出为:

  1. 最近的P波开始的地方
  2. 最近的P波结束的地方
  3. 最近的P波的异常等级,其中一个极端“不存在”。
  4. 最近的QRS复合体开始的地方
  5. 最近的QRS复数的Q部分变成R部分。
  6. 最近的QRS复数的R部分变成S部分。
  7. 最近的QRS综合大楼在哪里结束。
  8. 最新QRS复合体的异常等级,其中一个极端“不存在”。
  9. 最近的T波开始的地方。
  10. 最近的T波结束的地方。
  11. 最近的T波的异常等级,其中一个极端“不存在”。

我可能会与人们建议的其他一些分析方法再次进行核对,或者将这些其他类型的分析与神经网络的输出一起使用来为您提供答案。

当然,对神经网络的这种详细描述不应被视为规定性的。我敢肯定我不一定会选择最佳输出,例如,我只是提出了一些关于它们可能是什么的想法。

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.