(1)我们对心电信号进行40阶FIR带通滤波,通带为15~25Hz,大致为QRS波所在频段。关于滤波器的设计可以使用Matlab的Fdatool工具,得到相应的滤波器系数,然后套用filter内建函数完成滤波。以数据库的103号信号为例,滤波前后的波形示意如下:
[attach]193[/attach]
通过对比可以看到,滤波后P波,T波被明显削弱,体现了上一部分中预处理目的的第(1)点。
(2)对滤波后的波形“双斜率”预处理。所谓“双斜率”处理是参考自另一篇文献[3]。基本思想是分别在一个点的左右两侧的某个区间内寻找最大平均斜率与最小平均斜率,然后分别用左侧最大斜率减去右侧最小斜率,用右侧最大斜率减去左侧最小斜率,再求取两者中的最大者。过程有些复杂,但其实其基本动机就是利用QRS波两侧较陡的性质,只有QRS波这样的尖峰在经过上述处理时才会有很大的响应。在这里,我们设定这个寻找斜率的区间是左右两侧0.015s~0.060s处,此为经验参数。经过处理,可对比前后波形:
[attach]194[/attach]
可以看到,双斜率处理后,波形模式更为单一,体现了预处理目的的第(2)点。但是,波形出现了双峰现象,一定程度上不利于精准检测。因此,在双斜率处理后继续低通滤波(截止频率5Hz,经验参数),使得波形更光滑:
[attach]195[/attach]其中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的变量,双击打开:
[attach]226[/attach]
从左到右,第一列:记录编号,第二列:人工标记心拍数,第三列:算法正确检出心拍数,第四列:算法错检心拍数,第五列:算法漏检心拍数,第六列:Se,第七列:P+。看最后一行:
[attach]227[/attach]
可以看出算法共错检648个心拍,漏检380个心拍,总体Se达到了99.65%,P+达到了99.41%,汇总如下:
[attach]228[/attach]
在我的笔记本电脑上,该算法处理一条30min,采样率360Hz的记录需要14s左右。各项指标虽达不到顶尖,但也不算差,算是有一定的可用度了。接下来,我们将使用该算法将我们需要的心拍截取出来。
4.心拍截取这里其实有一个矛盾。无论我们的QRS波定位算法有多厉害,都很难100%将人工标注过的所有心拍定位准确,必然有错检和漏检。这就导致我们无法100%利用好人工标记的心拍。这里我们采用一个折衷的手段:忽略漏检的心拍,而错检和正确检出的心拍都截取出来。由于QRS定位算法的、性能已经够好了,所以截取出来的心拍绝大多数是正确检出的心拍,只有少部分为错检心拍。而我们接下来所要使用的机器/深度学习算法都具有一定的鲁棒性,较少的错检心拍数不会对结果产生太大影响。至于心拍的类型(标签),我们以距离该心拍最近的人工标记的类型为准。实际上,同一类型的心拍间变化非常大,并非只是示例的四个心拍那么简单,这也就是我们为什么后面要使用高大上的机器/深度学习算法来分辨。我们以.mat的形式将这四个变量保存(N_dat.mat,L_dat.mat,R_dat.mat,V_dat.mat),它们各自包含了一种类型的心拍,是我们接下来使用机器/深度学习算法要进行分类识别的目标。至此,我们所需要的识别对象已经成功准备好了。
本节内容很多,也很抽象。实际上,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.
欢迎光临 52matlab技术网站,matlab教程,matlab安装教程,matlab下载 (http://www.52matlab.com/) | Powered by Discuz! X3.2 |