可以看出双阈值可以很好地跟随信号变化,从而正确检出QRS波的位置。注意,这里检测的"正确"并非是指精准地落在QRS波的波峰或波谷中,尽管精确的人工标注往往就是在波峰或波谷上.美国EC38标准提供了一个评判标准:与人工标准差距在150ms内,即可认为定位成功.事实上,这个标准相当宽松,以至于现在的QRS波定位算法的准确率普遍在99%以上(以MIT-BIH数据库为测试数据), 而一些出色的算法甚至达到了99.9%以上.
以上原创算法已开源,放在本人的github上: DS_detect.m, 已封装为函数。以上的算法可能理解起来相当抽象,建议结合代码(有注释)体会。
3)算法评估
上一部分中曾说过,目前QRS波定位检测算法的“准确率”已经普遍在99%以上。但这么说其实不准确,因为衡量QRS波检测算法的指标并非我们印象中的准确率,而是有两个常用指标:敏感度(SE)和正预测率(P+),定义如下:
其中TP代表检测正确的心拍个数,FN代表漏检的心拍个数,FP代表错检的心拍个数。我们尝试对整个MIT-BIH数据库跑一遍,统计算法的性能参数。这一部分不是算法的核心,所以在这里不再讲具体的实现步骤,不过已经开源了测试代码S_test.m,为Matlab脚本文件。在运行之前注意数据库路径的设置。注意在代码的第164行,调用了上面的算法DS_detect。
DS_detect和DS_test最好在一个文件夹中,或者将这些文件放到Matlab可以检索到的目录中。以上都没有问题后,直接运行DS_test,等待其完成。当然也可以把DS_detect改为其他算法,只要搞清楚其输出哪个是QRS波的索引就可以。DS_test程序完成后,在工作空间中可以找到名为INFO的变量,双击打开:
从左到右,第一列:记录编号,第二列:人工标记心拍数,第三列:算法正确检出心拍数,第四列:算法错检心拍数,第五列:算法漏检心拍数,第六列:Se,第七列:P+。看最后一行:
可以看出算法共错检648个心拍,漏检380个心拍,总体Se达到了99.65%,P+达到了99.41%,汇总如下:
在我的笔记本电脑上,该算法处理一条30min,采样率360Hz的记录需要14s左右。各项指标虽达不到顶尖,但也不算差,算是有一定的可用度了。接下来,我们将使用该算法将我们需要的心拍截取出来。
4.心拍截取这里其实有一个矛盾。无论我们的QRS波定位算法有多厉害,都很难100%将人工标注过的所有心拍定位准确,必然有错检和漏检。这就导致我们无法100%利用好人工标记的心拍。这里我们采用一个折衷的手段:忽略漏检的心拍,而错检和正确检出的心拍都截取出来。由于QRS定位算法的、性能已经够好了,所以截取出来的心拍绝大多数是正确检出的心拍,只有少部分为错检心拍。而我们接下来所要使用的机器/深度学习算法都具有一定的鲁棒性,较少的错检心拍数不会对结果产生太大影响。至于心拍的类型(标签),我们以距离该心拍最近的人工标记的类型为准。
另外,我们截取心拍其实不是精确截取,即从P波起点到T波终点,而是采取一种较为粗略的手段:以QRS波的位置为基准,分别向前向后包括若干点,然后将这一段数据点截取出来作为心拍。如下图所示为什么不精确截取呢?是因为检测P波和T波及其起始点或终点非常困难,目前也没有一个性能足够好的算法满足应用需求。所以,大部分文献采用的是这种粗略截取的方法,只不过前后包括的点数有区别:
这里我们向左包含100个点,向右包含150个点,即截取的每个心拍长度为250个点(约0.7s)这一部分的实现代码也已开源:SegBeat.m 为脚本文件。同样,数据库路径,代码文件存放位置要正确。该代码与DS_test.m有类似之处,也调用了DS_detect算法进行QRS检测(第164行,同样也可以置换为其他QRS波定位算法)。至于其他实现细节,作为初学者可不必了解,因为确实很绕,并且也并非是我们的主线任务。运行完成后(时间可能会比较长),在工作空间可以找到4个变量,Nb,Lb,Rb,Vb,为我们接下来的目标类型心拍数据集合,分别为“正常(N)”,“左束支阻滞(LBBB)”,“右束支阻滞(RBBB)”,“室性早搏(PVC)”,示例如下(可能横坐标表示有些不准确,请忽略。。。。):
实际上,同一类型的心拍间变化非常大,并非只是示例的四个心拍那么简单,这也就是我们为什么后面要使用高大上的机器/深度学习算法来分辨。我们以.mat的形式将这四个变量保存(N_dat.mat,L_dat.mat,R_dat.mat,V_dat.mat),它们各自包含了一种类型的心拍,是我们接下来使用机器/深度学习算法要进行分类识别的目标。至此,我们所需要的识别对象已经成功准备好了。
5.小结本节内容很多,也很抽象。实际上,QRS波检测定位算法的设计很大程度都要靠经验,只不过个人认为有了上面说的几条原则的指导下,方向可以更明确。相关代码已经开源,大家可以结合代码来加深理解,多上手,多尝试.把目标心拍截取之后,我们接下来就可以进行机器/深度学习的应用了.
** 相关代码文件下载:https://github.com/Aiwiscal/ECG-ML-DL-Algorithm-Matlab
** 推荐文献:[1] Pan J, Tompkins W J. A real-time QRS detection algorithm[J]. IEEE transactions on biomedical engineering, 1985 (3): 230-236.
[2] Li C, Zheng C, Tai C. Detection of ECG characteristic points using wavelet transforms[J]. IEEE Transactions on Biomedical Engineering, 1995, 42(1): 21-28.
[3] Wang Y, Deepu C J, Lian Y. A computationally efficient QRS detection algorithm for wearable ECG sensors[C]//Engineering in Medicine and Biology Society, EMBC, 2011 Annual International Conference of the IEEE. IEEE, 2011: 5641-5644.