基于GPU的并行心电信号分析方法

申请号 CN201580000415.1 申请日 2015-06-23 公开(公告)号 CN105899268A 公开(公告)日 2016-08-24
申请人 中国科学院深圳先进技术研究院; 发明人 李烨; 樊小毛; 项福如; 蔡云鹏; 苗芬;
摘要 本 发明 提供了一种基于GPU的并行心电 信号 分析方法,所述方法包括:通过长间期伪差剔除和短间期伪差剔除对心 电信号 进行滤波处理;通过R波 位置 提取、QRS波群起止位置提取及QRS波群宽度提取对滤波处理后的所述心电信号进行QRS检波;通过创建模板对QRS检波后的所述心电信号进行异常 波形 分类;其中,所述长间期伪差剔除、所述短间期伪差剔除、所述R波位置提取、所述QRS波群宽度提取及所述创建模板中至少有一个通过GPU设备端的多个线程并行执行,所述线程通过其唯一对应的索引号读取并处理其所对应的数据。本发明通过在GPU上并行执行心电信号分析中的一个或多个步骤提高心电信号分析的速度。
权利要求

1.一种基于GPU的并行心电信号分析方法,其特征在于,所述方法包括:
通过长间期伪差剔除和短间期伪差剔除对心电信号进行滤波处理;
通过R波位置提取、QRS波群起止位置提取及QRS波群宽度提取对滤波处理后的所述心电信号进行QRS检波;
通过创建模板对QRS检波后的所述心电信号进行异常波形分类;
其中,所述长间期伪差剔除、所述短间期伪差剔除、所述R波位置提取、所述QRS波群宽度提取及所述创建模板中至少有一个通过GPU设备端的多个线程并行执行,所述线程通过其唯一对应的索引号读取并处理其所对应的数据。
2.如权利要求1所述的基于GPU的并行心电信号分析方法,其特征在于,所述长间期伪差剔除通过多个所述线程并行执行,包括:
声明所述GPU设备端的变量并为其分配相应显存,将所述心电信号从主机端拷贝至所述GPU设备端的全局内存;
根据长间期伪差剔除的间期对所述心电信号进行分段,每个所述线程调用所述GPU设备端的kernel函数,根据所述索引号从所述全局内存读取所述线程对应的一段心电信号,计算该段心电信号的标准差,根据所述索引号将所述标准差存储至所述全局内存中一第一标准差序列;
剔除标准差不在一设定阈值范围内的所述段心电信号;
所述线程调用所述GPU设备端的规约求和kernel函数,计算经过剔除后剩余的所有该段心电信号的标准差的和值;
根据所述和值求均值,并根据所述均值生成第一阈值范围;
每个所述线程重新调用所述kernel函数,根据所述索引号读取并判断经过剔除后剩余的所述段心电信号的标准差是否在所述第一阈值范围内,根据所述索引号将判断结果存储至所述全局内存中一第一噪声序列;
每个所述线程根据所述索引号从所述第一噪声序列依次读取所述判断结果及与其相邻的前一个判断结果和后一个判断结果,如果所述前一个判断结果和所述后一个判断结果均为标准差不在所述第一阈值范围内,则将表示是噪声的第一标记根据所述索引号存储至所述第一噪声序列中,反之,则将表示不是噪声的第二标记根据所述索引号存储至所述第一噪声序列中,生成长间期伪差剔除结果;
将所述长间期伪差剔除结果从所述GPU设备端拷贝至所述主机端。
3.如权利要求2所述的基于GPU的并行心电信号分析方法,其特征在于,所述线程的数量 每个所述线程对应处理的心电信号的采样点个数为f*T,其中,L为从所述主机端拷贝的心电信号的采样点序列长度,f为心电信号的采样频率,T为所述长间期伪差剔除的间期。
4.如权利要求2所述的基于GPU的并行心电信号分析方法,其特征在于,
所述标准差 其中, 其中,pj是所述段心电信号中第j个
采样点处的心电信号,j为整数,j≥0,f为心电信号的采样频率,T为所述长间期伪差剔除的间期。
5.如权利要求2所述的基于GPU的并行心电信号分析方法,其特征在于,所述第一阈值范围的上限和所述第一阈值范围的下限分别为所述均值的3倍和所述均值的1/3.5倍。
6.如权利要求2所述的基于GPU的并行心电信号分析方法,其特征在于,所述设定阈值范围为[0.5,3]。
7.如权利要求1所述的基于GPU的并行心电信号分析方法,其特征在于,所述短间期伪差剔除通过多个所述线程并行执行,包括:
声明所述GPU设备端的变量并为其分配相应显存,将所述长间期伪差剔除后的心电信号从主机端拷贝至所述GPU设备端的全局内存;
根据短间期伪差剔除的间期T1对所述心电信号进行分段,每个所述线程调用所述GPU设备端的kernel函数,根据所述索引号读取一段心电信号,计算公式 的值,根据所述索引号将所述公式的值存储至所述全局内存中一第二噪声序列,其中,sum是所有所述段心电信号中心电信号的平方和;
修改所述线程的数量及其对应处理的心电信号的采样点个数,每个修改后的线程重新调用kernel函数,根据所述修改后的线程的索引号读取其唯一对应的所述长间期伪差剔除的结果的第一噪声序列中的一个标记值,并通过一第三标记标出显示是噪声的所述标记值所对应段的心电信号;
根据所述第三标记串行筛除显示是噪声的所述标记值所对应段的心电信号;
所述修改后的线程调用所述GPU设备端中的规约求和kernel函数,计算经过筛除后剩余的所有心电信号的和值;
根据所述和值求得均值,根据所述均值生成一第二阈值范围;
再次修改所述线程的数量及其对应处理的心电信号的数量,再次修改后的所述线程再次重新调用kernel函数,根据再次修改后的所述线程的索引号从所述第二噪声序列读取并剔除每个不在所述第二阈值范围内的所述公式的值,生成短间期伪差剔除结果;
将所述短间期伪差剔除结果从所述GPU设备端拷贝至所述主机端。
8.如权利要求7所述的基于GPU的并行心电信号分析方法,其特征在于,还包括:
每个所述线程处理的心电信号的采样点个数为f*T1,所述线程的数量为
其中,L为从所述主机端拷贝的心电信号的采样点序列长度,f为心电信号的采样点频率;
设定ThreadsPerBlock个所述线程对应一个线程,每个所述线程块对应的心电信号的采样点个数为DataPerBlock=f*T*ThreadsPerBlock,所述线程块的数量为BlockNum=(L+DataPerBlock-1)/DataPerBlock。
9.如权利要求7所述的基于GPU的并行心电信号分析方法,其特征在于,还包括:
修改后的线程的数量 其中,L为从所述主机端拷贝的心电信号的采样点序列长度,f为心电信号的采样频率,T为所述长间期伪差剔除的间期,DataPerBlock1个修改后的线程对应一个线程块,所述线程块的数量为BlockNum1=(L1+DataPerBlock1-1)/DataPerBlock1,其中,L1为所有所述长间期伪差剔除的结果的第一噪声序列的长度。
10.如权利要求6所述的基于GPU的并行心电信号分析方法,其特征在于,还包括:
再次修改后的线程的数量为 每个所述再次修改后的线程对应处理一个所述公式的值,设定ThreadsPerBlock2个所述再次修改后的线程对应一个线程块,所述线程块的数量BlockNum2=(n+ThreadsPerBlock2-1)/ThreadsPerBlock2,L为从所述主机端拷贝的心电信号的采样点序列长度。
11.如权利要求1所述的基于GPU的并行心电信号分析方法,其特征在于,所述R波位置提取通过多个所述线程并行执行,包括:
声明所述GPU设备端的变量并为其分配相应显存,将滤波处理后的所述心电信号从主机端的内存拷贝到所述GPU设备端的全局内存;
每个所述线程调用kernel函数,根据其索引号对应从滤波处理后的所述心电信号中读取一个待检波心电信号;
所述线程根据设定窗口大小w和一设定梯度,对读取的所述待检波心电信号及其后紧邻的w-1个待检波心电信号进行不同程度的腐蚀运算,将腐蚀运算后的读取的所述待检波心电信号及所述w-1个待检波心电信号中的最小值根据所述索引号存储至所述全局内存中的一第一临时序列,w为整数,w≥2;
每个所述线程根据所述索引号从所述第一临时序列中读取一个所述最小值;
根据所述设定窗口大小w和所述设定梯度,对读取的所述最小值及其后紧邻的w-1个所述最小值进行不同程度的膨胀运算,并根据所述索引号将膨胀运算后的读取的所述最小值及其后紧邻的w-1个所述最小值中的最大值存储至所述全局内存中的一第二临时序列;
根据所述索引号读取并计算所述待检波心电信号和所述最大值的差值,并将所述差值存储至所述全局内存中的一第三临时序列;
所述线程调用规约求和kernel函数计算所述第三临时序列中的所有所述差值的和值;
根据所述和值求均值;
将所述均值从所述GPU设备端拷贝至所述主机端。
12.如权利要求11所述的基于GPU的并行心电信号分析方法,其特征在于,所述方法还包括:
将腐蚀运算后的读取的所述待检波心电信号及所述w-1个待检波心电信号中的最小值存储至一寄存器中;
从所述寄存器中读取的所述最小值,从所述全局内存中读取所述w-1个所述最小值。
13.如权利要求11所述的基于GPU的并行心电信号分析方法,其特征在于,所述设定窗口大小w=5,所述设定梯度为k[w]={0,50,100,50,0}。
14.如权利要求11所述的基于GPU的并行心电信号分析方法,其特征在于,所述线程的数量等于从所述主机端拷贝的所述心电信号的采样点序列长度L3,设定ThreadsPerBlock3个所述线程对应一个线程块,所述线程块的数量BlockNum3=(L3+ThreadsPerBlock3-1)/ThreadsPerBlock3。
15.如权利要求1所述的基于GPU的并行心电信号分析方法,其特征在于,所述QRS波群宽度提取通过多个所述线程并行执行,包括:
声明所述GPU设备端的变量并为其分配相应显存,将QRS波群起止位置提取的结果从主机端拷贝到所述GPU设备端的全局内存;
所述线程调用所述GPU设备端的kernel函数,根据其索引号读取所述QRS波群起止位置提取的结果中的起始位置和终止位置,计算所述起始位置和终止位置的差值,根据所述索引号将所述差值存储至所述全局内存,生成QRS波群宽度提取的结果;
将所述QRS波群宽度提取的结果从所述GPU设备端拷贝至所述主机端。
16.如权利要求15所述的基于GPU的并行心电信号分析方法,其特征在于,在主机端根据峰值群确定法获得QRS波群的所述起始位置和所述终止位置。
17.如权利要求1所述的基于GPU的并行心电信号分析方法,其特征在于,所述创建模板通过多个所述线程并行执行,包括:
声明所述GPU设备端的变量并为其分配相应显存,将R波位置提取的结果从主机端拷贝到所述GPU设备端的全局内存;
所述线程调用kernel函数,根据其索引号读取所述R波位置提取的结果中的RR间期,根据一设定准则获取每个所述RR间期的标识符,并根据所述索引号将所述标识符存储至所述全局内存中,生成创建模板的结果;
将所述创建模板的结果从所述GPU设备端拷贝到所述主机端。
18.如权利要求17所述的基于GPU的并行心电信号分析方法,其特征在于,所述设定准则包括:
如果与第i个RR间期RRlist[i]相邻的第i+1个RR间期RRlist[i+1]不在区间(0.6*RRlist[i],1.5*RRlist[i])内,则所述RR间期数据RRlist[i]的标识符为-1,其中,i为整数,i≥0;
如果所述RR间期RRlist[i+1]在区间(0.6*RRlist[i],1.5*RRlist[i])内,及所述RR间期RRlist[i]不在区间(0.8*RRmean,1.3*RRmean)内,则所述RR间期RRlist[i]的标识符为
0,其中,RRmean为所有所述RR间期的平均值;
如果所述RR间期RRlist[i+1]在区间(0.6*RRlist[i],1.5*RRlist[i])内,及所述RR间期RRlist[i]在区间(0.8*RRmean,1.3*RRmean)内,则所述RR间期RRlist[i]的标识符为1。

说明书全文

基于GPU的并行心电信号分析方法

技术领域

[0001] 本发明涉及生物医学工程技术领域,尤其涉及一种基于GPU的并行心电信号分析方法。

背景技术

[0002] 随着生物信息技术的发展,越来越多的可穿戴健康医疗产品通过对人体心电信号的采集和分析,可为人们提供个性化的健康医疗服务,使得人们无需前往专的医疗机构就可以了解自身的健康状况。
[0003] 因此,对心电数据的自动化分析逐渐成为当下生物医学领域的研究热点。目前,大部分心电数据自动化分析技术都是针对以医院为基本单位所收集的心电数据,这样所面对的心电数据规模是相当有限的。但是,家庭健康平台的服务对象是中小型甚至是大型城市的家庭用户,每天会有成千上万用户上传长程和短程心电数据。
[0004] 目前,健康云平台使用的是串行心电数据分析算法,可以实现对短程心电数据的实时分析及实时反馈,但对于长程心电信号数据的分析仍然会耗费大量时间,严重影响了用户的体验。例如,当前家庭健康云平台对24小时的长程心电数据,从上传到反馈分析结果,平均响应时间为35秒,耗时较长。
[0005] 国内外相关研究人员正积极尝试从不同度来加速心电数据的分析和处理过程。虽然在心电数据并行处理方面已有很多有意义研究成果,但是这些研究成果仅仅是针对心电数据分析提出了粗粒度的处理流程,还难以解决当前所遇到的问题。

发明内容

[0006] 本发明提供一种基于GPU的并行心电信号分析方法,以解决上述一项或多项缺失。
[0007] 本发明提供一种基于GPU的并行心电信号分析方法,所述方法包括:通过长间期伪差剔除和短间期伪差剔除对心电信号进行滤波处理;通过R波位置提取、QRS波群起止位置提取及QRS波群宽度提取对滤波处理后的所述心电信号进行QRS检波;通过创建模板对QRS检波后的所述心电信号进行异常波形分类;其中,所述长间期伪差剔除、所述短间期伪差剔除、所述R波位置提取、所述QRS波群宽度提取及所述创建模板中至少有一个通过GPU设备端的多个线程并行执行,所述线程通过其唯一对应的索引号读取并处理其所对应的数据。
[0008] 一个实施例中,所述长间期伪差剔除通过多个所述线程并行执行,所述方法包括:声明所述GPU设备端的变量并为其分配相应显存,将所述心电信号从主机端拷贝至所述GPU设备端的全局内存;根据长间期伪差剔除的间期对所述心电信号进行分段,每个所述线程调用所述GPU设备端的kernel函数,根据所述索引号从所述全局内存读取所述线程对应的一段心电信号,计算该段心电信号的标准差,根据所述索引号将所述标准差存储至所述全局内存中一第一标准差序列;剔除标准差不在一设定阈值范围内的所述段心电信号;所述线程调用所述GPU设备端的规约求和kernel函数,计算经过剔除后剩余的所有该段心电信号的标准差的和值;根据所述和值求均值,并根据所述均值生成第一阈值范围;每个所述线程重新调用所述kernel函数,根据所述索引号读取并判断经过剔除后剩余的所述段心电信号的标准差是否在所述第一阈值范围内,根据所述索引号将判断结果存储至所述全局内存中一第一噪声序列;每个所述线程根据所述索引号从所述第一噪声序列依次读取所述判断结果及与其相邻的前一个判断结果和后一个判断结果,如果所述前一个判断结果和所述后一个判断结果均为标准差不在所述第一阈值范围内,则将表示是噪声的第一标记根据所述索引号存储至所述第一噪声序列中,反之,则将表示不是噪声的第二标记根据所述索引号存储至所述第一噪声序列中,生成长间期伪差剔除结果;将所述长间期伪差剔除结果从所述GPU设备端拷贝至所述主机端。
[0009] 一个实施例中,所述线程的数量 每个所述线程对应处理的心电信号的采样点个数为f*T,其中,L为从所述主机端拷贝的心电信号的采样点序列长度,f为心电信号的采样频率,T为所述长间期伪差剔除的间期。
[0010] 一个实施例中,所述标准差 其中, 其中,pj是所述段心电信号中第j个采样点处的心电信号,j为整数,j≥0,f为心电信号的采样频率,T为所述长间期伪差剔除的间期。
[0011] 一个实施例中,所述第一阈值范围的上限和所述第一阈值范围的下限分别为所述均值的3倍和所述均值的1/3.5倍。
[0012] 一个实施例中,所述设定阈值范围为[0.5,3]。
[0013] 一个实施例中,所述短间期伪差剔除通过多个所述线程并行执行,所述方法包括:声明所述GPU设备端的变量并为其分配相应显存,将所述长间期伪差剔除后的心电信号从主机端拷贝至所述GPU设备端的全局内存;根据短间期伪差剔除的间期T1对所述心电信号进行分段,每个所述线程调用所述GPU设备端的kernel函数,根据所述索引号读取一段心电信号,计算公式 的值,根据所述索引号将所述公式的值存储至所述全局内存中一第二噪声序列,其中,sum是所有所述段心电信号中心电信号的平方和;修改所述线程的数量及其对应处理的心电信号的采样点个数,每个修改后的线程重新调用kernel函数,根据所述修改后的线程的索引号读取其唯一对应的所述长间期伪差剔除的结果的第一噪声序列中的一个标记值,并通过一第三标记标出显示是噪声的所述标记值所对应段的心电信号;根据所述第三标记串行筛除显示是噪声的所述标记值所对应段的心电信号;所述修改后的线程调用所述GPU设备端中的规约求和kernel函数,计算经过筛除后剩余的所有心电信号的和值;根据所述和值求得均值,根据所述均值生成一第二阈值范围;再次修改所述线程的数量及其对应处理的心电信号的数量,再次修改后的所述线程再次重新调用kernel函数,根据再次修改后的所述线程的索引号从所述第二噪声序列读取并剔除每个不在所述第二阈值范围内的所述公式的值,生成短间期伪差剔除结果;将所述短间期伪差剔除结果从所述GPU设备端拷贝至所述主机端。
[0014] 一个实施例中,还包括:每个所述线程处理的心电信号的采样点个数为f*T1,所述线程的数量为 其中,L为从所述主机端拷贝的心电信号的采样点序列长度,f为心电信号的采样点频率;设定ThreadsPerBlock个所述线程对应一个线程,每个所述线程块对应的心电信号的采样点个数为DataPerBlock=f*T*ThreadsPerBlock,所述线程块的数量为BlockNum=(L+DataPerBlock-1)/DataPerBlock。
[0015] 一个实施例中,还包括:修改后的线程的数量 其中,L为从所述主机端拷贝的心电信号的采样点序列长度,f为心电信号的采样频率,T为所述长间期伪差剔除的间期,DataPerBlock1个修改后的线程对应一个线程块,所述线程块的数量为BlockNum1=(L1+DataPerBlock1-1)/DataPerBlock1,其中,L1为所有所述长间期伪差剔除的结果的第一噪声序列的长度。
[0016] 一个实施例中,所述方法还包括:再次修改后的线程的数量为 每个所述再次修改后的线程对应处理一个所述公式的值,设定ThreadsPerBlock2个所述再次修改后的线程对应一个线程块,所述线程块的数量BlockNum2=(n+ThreadsPerBlock2-1)/ThreadsPerBlock2,L为从所述主机端拷贝的心电信号的采样点序列长度。
[0017] 一个实施例中,所述R波位置提取通过多个所述线程并行执行,所述方法包括:声明所述GPU设备端的变量并为其分配相应显存,将滤波处理后的所述心电信号从主机端的内存拷贝到所述GPU设备端的全局内存;每个所述线程调用kernel函数,根据其索引号对应从滤波处理后的所述心电信号中读取一个待检波心电信号;所述线程根据设定窗口大小w和一设定梯度,对读取的所述待检波心电信号及其后紧邻的w-1个待检波心电信号进行不同程度的腐蚀运算,将腐蚀运算后的读取的所述待检波心电信号及所述w-1个待检波心电信号中的最小值根据所述索引号存储至所述全局内存中的一第一临时序列,w为整数,w≥2;每个所述线程根据所述索引号从所述第一临时序列中读取一个所述最小值;根据所述设定窗口大小w和所述设定梯度,对读取的所述最小值及其后紧邻的w-1个所述最小值进行不同程度的膨胀运算,并根据所述索引号将膨胀运算后的读取的所述最小值及其后紧邻的w-
1个所述最小值中的最大值存储至所述全局内存中的一第二临时序列;根据所述索引号读取并计算所述待检波心电信号和所述最大值的差值,并将所述差值存储至所述全局内存中的一第三临时序列;所述线程调用规约求和kernel函数计算所述第三临时序列中的所有所述差值的和值;根据所述和值求均值;将所述均值从所述GPU设备端拷贝至所述主机端。
[0018] 一个实施例中,所述方法还包括:将腐蚀运算后的读取的所述待检波心电信号及所述w-1个待检波心电信号中的最小值存储至一寄存器中;从所述寄存器中读取的所述最小值,从所述全局内存中读取所述w-1个所述最小值。
[0019] 一个实施例中,所述设定窗口大小w=5,所述设定梯度为k[w]={0,50,100,50,0}。
[0020] 一个实施例中,所述线程的数量等于从所述主机端拷贝的所述心电信号的采样点序列长度L3,设定ThreadsPerBlock3个所述线程对应一个线程块,所述线程块的数量BlockNum3=(L3+ThreadsPerBlock3-1)/ThreadsPerBlock3。
[0021] 一个实施例中,所述QRS波群宽度提取通过多个所述线程并行执行,所述方法包括:声明所述GPU设备端的变量并为其分配相应显存,将QRS波群起止位置提取的结果从主机端拷贝到所述GPU设备端的全局内存;所述线程调用所述GPU设备端的kernel函数,根据其索引号读取所述QRS波群起止位置提取的结果中的起始位置和终止位置,计算所述起始位置和终止位置的差值,根据所述索引号将所述差值存储至所述全局内存,生成QRS波群宽度提取的结果;将所述QRS波群宽度提取的结果从所述GPU设备端拷贝至所述主机端。
[0022] 一个实施例中,在主机端根据峰值群确定法获得QRS波群的所述起始位置和所述终止位置。
[0023] 一个实施例中,所述创建模板通过多个所述线程并行执行,所述方法包括:声明所述GPU设备端的变量并为其分配相应显存,将R波位置提取的结果从主机端拷贝到所述GPU设备端的全局内存;所述线程调用kernel函数,根据其索引号读取所述R波位置提取的结果中的RR间期,根据一设定准则获取每个所述RR间期的标识符,并根据所述索引号将所述标识符存储至所述全局内存中,生成创建模板的结果;将所述创建模板的结果从所述GPU设备端拷贝到所述主机端。
[0024] 一个实施例中,所述设定准则包括:如果与第i个RR间期RRlist[i]相邻的第i+1个RR间期RRlist[i+1]不在区间(0.6*RRlist[i],1.5*RRlist[i])内,则所述RR间期数据RRlist[i]的标识符为-1,其中,i为整数,i≥0;如果所述RR间期RRlist[i+1]在区间(0.6*RRlist[i],1.5*RRlist[i])内,及所述RR间期RRlist[i]不在区间(0.8*RRmean,1.3*RRmean)内,则所述RR间期RRlist[i]的标识符为0,其中,RRmean为所有所述RR间期的平均值;如果所述RR间期RRlist[i+1]在区间(0.6*RRlist[i],1.5*RRlist[i])内,及所述RR间期RRlist[i]在区间(0.8*RRmean,1.3*RRmean)内,则所述RR间期RRlist[i]的标识符为1。
[0025] 本发明实施例的基于GPU的并行心电信号数据分析方法通过将心电信号分析过程中的一个或多个步骤在GPU上并行执行,可以显著提高心电信号的分析速度。
[0026] 本发明设计的基于GPU的并行心电分析方法在心电分析的各个阶段取得了几倍至几十倍的加速,心电分析总耗时获得了相对于普通工作站式服务器17倍的加速比。通过在家庭健康云平台的GPU服务器上部署该并行算法,可以满足现阶段对大规模长程心电信号数据快速分析的需求。附图说明
[0027] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
[0028] 图1是现有串行心电信号分析方法的流程示意图;
[0029] 图2是本发明实施例的基于GPU的并行心电信号分析方法;
[0030] 图3是本发明实施例中的长间期伪差剔除串行执行算法的流程示意图;
[0031] 图4是本发明实施例中的长间期伪差剔除并行执行算法的流程示意图;
[0032] 图5是本发明一实施例中长间期伪差剔除并行执行算法的流程示意图;
[0033] 图6是本发明实施例中的短间期伪差剔除串行执行算法的流程示意图;
[0034] 图7是本发明实施例中的短间期伪差剔除的并行执行算法的流程示意图;
[0035] 图8是本发明一实施例中的短间期伪差剔除的并行执行算法的流程示意图;
[0036] 图9是本发明实施例中的R波位置提取串行执行算法的流程示意图;
[0037] 图10是本发明实施例的R波位置提取的并行执行算法的流程示意图;
[0038] 图11是本发明一实施例的R波位置提取的并行执行算法的流程示意图;
[0039] 图12是本发明实施例中的QRS波群宽度提取的串行执行算法的流程示意图;
[0040] 图13是本发明实施例中的QRS波群宽度提取的并行执行算法的流程示意图;
[0041] 图14是本发明实施例中的创建模板的并行执行算法的流程示意图。

具体实施方式

[0042] 为使本发明实施例的目的、技术方案和优点更加清楚明白,下面结合附图对本发明实施例做进一步详细说明。在此,本发明的示意性实施例及其说明用于解释本发明,但并不作为对本发明的限定。
[0043] 图1是现有串行心电信号分析方法的流程示意图,如图1所示,在滤波处理101过程中,现有技术采用长间期伪差剔除算法、短间期伪差剔除算法及简单整系数梳状滤波器对心电信号进行滤波处理,从而剔除包括工频干扰、基线漂移、肌电干扰的伪差干扰,以消除人体和信号采集仪器等外界环境产生的噪声影响。上述三种用于滤波处理101的算法均为串行算法,而且伪差剔除在特征提取和波形分类的阶段也都有使用,所以上述三种算法明显降低了心电信号处理的速度。
[0044] 通过对包含上述三种串行算法的滤波处理过程进行分析,发明人发现:每种算法占滤波处理阶段耗时的1/3;全通网络简单整系数梳状滤波器在对数据进行滤波处理的过程中,数据的前后依赖关系非常强,这与CUDA(Compute Unified Device Architecture,统一计算设备架构)编程模型下并行计算的单指令多数据原则(SIMD)相违背,所以该算法不适合并行进行;长间期伪差剔除算法和短间期伪差剔除算法在对数据进行滤波处理的过程中,数据的关联性较弱,可以进行并行处理。
[0045] 因此,若在对心电信号进行滤波处理时,长间期伪差剔除算法及/或短间期伪差剔除算法采用并行执行方法可以节省1/3或2/3的滤波处理阶段的耗时。
[0046] 如图1所示,现有技术中,采用串行算法进行QRS检测102中的R波位置提取和QRS波群起止位置提取两个处理过程。若可设计出R波位置提取和QRS波群起止位置提取并行执行的算法,可进一步提高心电信号分析的速度。
[0047] 再如图1所示,现有技术中,通过串行算法标识QRS波群来进行异常波形分类103。若可设计出并行算法标识QRS波群,则可获得更快的心电信号分析速度。
[0048] 为了解决现有技术中存在的问题,本发明实施例提供了一种基于GPU的并行心电信号分析方法。如图2所示,本发明实施例的并行心电信号分析方法包括步骤:
[0049] S201:通过长间期伪差剔除和短间期伪差剔除对心电信号进行滤波处理。
[0050] S202:通过R波位置提取、QRS波群起止位置提取及QRS波群宽度提取对滤波处理后的所述心电信号进行QRS检波。
[0051] S203:通过创建模板对QRS检波后的所述心电信号进行异常波形分类。
[0052] 其中,上述长间期伪差剔除、上述短间期伪差剔除、上述R波位置提取、上述QRS波群宽度提取及上述创建模板中至少有一个通过GPU设备端的多个线程并行执行,该线程通过其唯一对应的索引号读取并处理其所对应的数据。
[0053] 本发明实施例的并行心电信号分析方法,通过对长间期伪差剔除算法、短间期伪差剔除算法、R波位置提取、QRS波群宽度提取及创建模板中的至少一个在GPU上并行执行,可在某种程度上加快心电信号的分析速度。
[0054] 一个实施例中,长间期伪差剔除可以采用串行算法执行。在长间期伪差剔除的过程中,会产生一个噪声序列noiselist[length],噪声序列数组长度为:
[0055] length=ecgnum÷T,
[0056] 其中,ecgnum表示原始心电信号数据的数组长度,T表示长间期伪差剔除的间期,如果某段数据被判断为噪声,则在噪声序列相应位置写入1,反之写入0。图3是本发明实施例中的长间期伪差剔除串行执行算法的流程示意图。如图3所示,长间期伪差剔除串行执行算法包括步骤:
[0057] S301:初始化心电信号的段标识符K=0。
[0058] S302:从原始心电信号中依次读取心电信号数据。
[0059] S303:当读入f*T个心电信号数据点时,根据标准差公式M计算每段心电信号数据集的标准差,并将段标识符K加1:
[0060]
[0061] 其中,f为心电信号的采样频率,pj表示每段心电信号数据集中的第j个采样数据点,j为正整数,j≥0。
[0062] S304:重复S302和S303步骤,直到所有心电信号数据都被处理。
[0063] S305:根据经验阈值范围[0.5,30]判断每段心电信号数据集的标准差是否在该经验阈值范围以内,并计算在该经验阈值范围内的心电信号数据集的标准差的均值temp_M。
[0064] S306:根据均值temp_M计算得到新的阈值上限temp_h和阈值下限temp_l,进而得到一个新的阈值范围,其中,
[0065] temp_h=temp_M*3,
[0066] temp_l=temp_M÷3.5,temp_l≥0.6。
[0067] S307:根据步骤S306得到的新的阈值范围判断心电信号噪声段,即如果该段心电信号数据集的标准差在该新的阈值范围以内则不是噪声段,记作noiselist[i]=0,反之,则判断为噪声段,记作noiselist[i]=1。
[0068] S308:重新遍历,如果某段心电信号数据的前后两段心电信号数据都是噪声段,则将该段心电信号数据也判断为噪声段。
[0069] S309:长间期伪差剔除结束。
[0070] 通过对长间期伪差剔除串行算法的分析,发明人发现,在长间期伪差判断流程中有四个循环体,而在CUDA的架构中,线程是以单指令多数据的方式组织的,所以循环体适合进行并行化改进。
[0071] 在调用内核kernel函数时,指定线程块和块内线程资源的数量,线程块的数量BlockNum可以依据原始心电数据的长度和给定的每个线程块中的线程数量ThreadsPerBlock按照下面的公式(1)和公式(2)计算得到:
[0072] DataPerBlo ck=f*T*ThreadsPer Block   (1)
[0073] BlockNum=(ecgnum+DataPerBlo ck-1)/DataPerBlo ck   (2)
[0074] 在长间期伪差判断过程中,第一个循环是一个嵌套循环,其实现的功能是,按照内循环规定的子数据集的数量,计算整个数据集中每个子数据集的标准差。基于该循环的特点,将该循环进行并行化改进,可以使一个线程计算一个子数据集的标准差,多个线程同时无通信地并行执行。
[0075] 第二个循环实现的功能是,依据经验阈值剔除部分数据,并计算剩余数据的均值。将该循环进行并行化改进,可采用CPU串行执行的方式,生成一个新的数组,然后调用归约求和的内核kernel函数,计算该新的数组中的数据的和。
[0076] 第三个循环实现的功能是判断第一个循环产生的结果集m_noise所对应的数据集是否是噪声。其具体实现过程是,每次从结果集m_noise中读取一个值,然后将该值与上述经验阈值比较,并以此判断该值所对应的数据是否是噪声。针对这种情形,将该循环进行并行化改进,可启动length个线程,使每个线程仅与结果集m_noise中的一个值对应,从而每个线程按照其线程索引号可以从m_noise中读取一个相应的值。然后将根据线程索引号读取的值和设定阈值比较,并按该线程索引号将比较结果写入数组noiselist中。
[0077] 第四个循环是对第三个循环产生的噪声序列进行再确认。该循环所依据的判断准则是“如果一个子数据集的前后两个数据集均被判断为噪声,那么该段数据集也为噪声”。在功能的实现过程中,每次从数组noiselist中读取一个数据值,并读取与该数据值相邻的前后两个数据值,然后依据上述判断准则修改该数据值。将该循环进行并行化改进,可启动length个线程,使得每个线程的索引号仅与数组noiselist中的一个值对应,如此一来,线程就可以按照其索引号从数组noiselist中读取其所对应的值以及与该值前后相邻的值,然后根据所读取的值进行相应的运算。
[0078] 由于改进后的第四个循环是并行执行的,所以需要考虑所读取的前后相邻的值是否是脏数据。
[0079] 为了便于分析,可将线程的索引号所对应的值记为a,与a相邻的前后值分别记为font和back,与font相邻的前一个值记为b,与back相邻的后一个值记为c。依据上述第四个循环执行的准则“如果一个子数据集的前后两个数据集均被判断为噪声,那么该段数据集也为噪声”,可以知道写入操作的发生需要两个必备条件:第一,只针对值为0的数据;第二,该值的前后相邻值必须为1。基于这两个条件,假设font或back值在被其对应的线程读取后,其中一个值被修改,则font或back值必须为0,且b和a的值为1,或者a和c的值为1。换言之,无论font和back中的哪一个是心脏数据,a的值必须为1,很显然,这不会影响线程对a值的处理,所以即使发生读取心脏数据的情况,也不会对a值的最终结果误判。
[0080] 因此,第四个循环在并行执行过程中不会出现读取心脏数据的情况。
[0081] 图4是本发明实施例中的长间期伪差剔除并行执行算法的流程示意图。如图4所示,所述长间期伪差剔除通过多个所述线程并行执行,包括:
[0082] S401:声明所述GPU设备端的变量并为其分配相应显存,将所述心电信号从主机端拷贝至所述GPU设备端的全局内存。
[0083] S402:根据长间期伪差剔除的间期对所述心电信号进行分段,每个所述线程调用所述GPU设备端的kernel函数,根据所述索引号从所述全局内存读取所述线程对应的一段心电信号,计算该段心电信号的标准差,根据所述索引号将所述标准差存储至所述全局内存中一第一标准差序列。
[0084] S403:剔除标准差不在一设定阈值范围内的所述段心电信号。
[0085] S404:所述线程调用所述GPU设备端的规约求和kernel函数,计算经过剔除后剩余的所有该段心电信号的标准差的和值。
[0086] S405:根据所述和值求均值,并根据所述均值生成第一阈值范围。
[0087] S406:每个所述线程重新调用所述kernel函数,根据所述索引号读取并判断经过剔除后剩余的所述段心电信号的标准差是否在所述第一阈值范围内,根据所述索引号将判断结果存储至所述全局内存中一第一噪声序列。
[0088] S407:每个所述线程根据所述索引号从所述第一噪声序列依次读取所述判断结果及与其相邻的前一个判断结果和后一个判断结果,如果所述前一个判断结果和所述后一个判断结果均为标准差不在所述第一阈值范围内,则将表示是噪声的第一标记根据所述索引号存储至所述第一噪声序列中,反之,则将表示不是噪声的第二标记根据所述索引号存储至所述第一噪声序列中,生成长间期伪差剔除结果。
[0089] S408:将所述长间期伪差剔除结果从所述GPU设备端拷贝至所述主机端。
[0090] 在上述步骤S401中,线程的数量可为:
[0091]
[0092] 每个线程对应处理的心电信号的采样点个数可为f*T,其中,L为从主机端拷贝的心电信号的采样点序列长度,f为心电信号的采样频率,T为长间期伪差剔除的间期。
[0093] 在上述步骤S402中,标准差可采用步骤S303中的标准差计算公式进行计算,标准差:
[0094]
[0095] 其中,pj是所述段心电信号中第j个采样点处的心电信号,j为整数,j≥0,f为心电信号的采样频率,T为所述长间期伪差剔除的间期。
[0096] 上述步骤S403中,该设定阈值的范围可为[0.5,3]。上述步骤S405中,第一阈值范围的上限和第一阈值范围的下限分别该步骤中所得均值的3倍和1/3.5倍。
[0097] 上述步骤S407中,长间期伪差剔除结果可以包括心电信号数据、噪声/非噪声标记、标准差数据。
[0098] 图5是本发明一实施例中长间期伪差剔除并行执行算法的流程示意图。如图5所示,长间期伪差剔除并行执行算法包括步骤:
[0099] S501:声明设备端变量,并为之分配相应的显存,然后将kernel函数运行中所需要的心电信号数据从主机端拷贝到设备端。
[0100] S502:设原始心电信号数据的长度为L,启动 个线程,即每个线程处理一个包含f*T个心电信号数据的数据集。
[0101] S503:每个线程调用kernel函数,首先从全局内存中读取属于该段的心电信号数据,并计算该段心电信号数据的标准差M;然后根据线程的索引号gid将计算结果写入全局内存,即st_d[gid]=M。
[0102] S504:同步线程,直到所有线程均完成了步骤S503的运算。
[0103] S505:根据经验阈值范围[0.5,30]判断每段心电信号数据集的标准差是否在上述经验阈值范围内,并以此剔除明显有噪声的心电信号数据段。
[0104] S506:调用规约求和kernel函数,计算剩余数据的和值。
[0105] S507:依据步骤S506中得到的和值求均值temp_M;然后再根据均值temp_M计算得到新的阈值上限和阈值下限。
[0106] S508:每个线程调用新的kernel函数,首先按照各自的索引号gid从全局内存中读取相应的标准差,并根据步骤S507产生的阈值上限和阈值下限确定该标准差对应的数据段是否是噪声段。并将结果写入全局内存noiselist[gid],然后同步线程操作。
[0107] S509:每个线程再从全局内存中读取noiselist[gid-1]和noiselist[gid+1],执行判断“如果某段心电信号数据的前后两段心电信号数据都是噪声段,则将该段心电信号数据也判断为噪声段”,并将结果写入noiselist[gid]。
[0108] S510:将内核kernel函数返回的相关数据从设备端拷贝到主机端,释放无用的设备端变量,回收设备端显存和主机端内存。
[0109] 本发明实施例中,长间期伪差剔除算法通过在GPU设备端并行执行,可以显著降低滤波处理阶段的耗时。
[0110] 一个实施例中,短间期伪差剔除算法可以采用串行算法。短间期伪差剔除可在长间期伪差剔除和梳状滤波器滤波后对心电信号进行伪差剔除处理。主要是依据长间期伪差剔除产生的噪声标记数组noiselist,从心电信号数据中没有被标记为噪声的数据段中,剔除更小间期T1的噪声,间期T1的选取依赖于长间期伪差剔除的间期T,即T可以是T1的倍数,例如长间期伪差剔除的间期T的值为5,短间期伪差剔除的间期T1的值为1,即分别表示5秒间期和1秒间期伪差。在短间期伪差剔除过程中产生的噪声序列记为noise[length],数组长度length=ecgnum/T1。
[0111] 图6是本发明实施例中的短间期伪差剔除串行执行算法的流程示意图。如图6所示,短间期伪差剔除串行执行算法包括步骤:
[0112] S601:初始化环境变量。
[0113] S602:依次从长间期伪差剔除结果中的噪声序列noiselist中读数据noiselist[i]。
[0114] S603:如果数据noiselist[i]=1,即表示ecglist[i*T*f]~ecglist[(i+1)*T*f-1]的原始心电信号数据已经被标记为噪声段,那么在数组temp_noise中依次写入T/T1个0,即不对该噪声段所对应的心电信号数据做短间期伪差剔除处理。
[0115] S604:如果数据noiselist[i]=0,从数据noiselist[i]在数组ecglist中所对应的下标i*T*f开始依次读取数据,并计算公式Si,j的值,并将Si,j值写入temp_noise[i*T/T1+j]中:
[0116]
[0117] 其中, T是T1的整数倍,pn是第n个心电信号数据的值。
[0118] S605:重复步骤S602、S603、S604,直到噪声序列noiselist中的数据全部读完。
[0119] S606:对新得到的噪声序列temp_noise,求其中所有大于零的值的均值temp_S,并由此得到新的阈值范围(0,5*temp_S]。
[0120] S607:根据步骤S606中所得到的新的阈值范围进行判断,如果数据temp_noise[i]在该新的阈值范围内,则数据temp_noise[i]对应的心电信号数据不是噪声,即noise[i]=0,反之,则判断为噪声,noise[i]=1;返回新的噪声序列noise;重复该步骤直到数组temp_noise中的所有数据被读完。
[0121] S608:短间期伪差剔除算法结束。
[0122] 通过对短间期伪差剔除串行算法分析,发明人发现,短间期伪差剔除算法一共有三个大循环。
[0123] 第一个循环的功能是对长间期伪差剔除结果中的非噪声段数据进行更短间期的伪差剔除。具体可分为两个部分:第一,从长间期伪差剔除后产生的噪声序列中筛选出非噪声段数据;第二,对非噪声段数据以更小的间期T1分段进行计算。但是,在对上述第一个循环进行并行执行改进时,可不按照上述两个部分的串行顺序执行。可首先对所有原始心电信号数据按照间期T1进行分段计算,即启动相应数量的线程资源,每个线程处理的数据集大小为f*T1,并将计算的结果按照线程的索引号写入显存。然后,启动线程资源,线程的数量与长间期伪差剔除结果中的噪声序列长度相等,每个线程按照其索引号与长间期伪差剔除所得到的噪声序列中的数据一一对应。再依据噪声序列中的数据对上一步计算的结果进行矫正。
[0124] 第二个循环的功能是计算第一个循环计算得到的结果序列中所有大于0的数据的均值。在进行并行化设计的时,首先串行筛选大于0的数据,并将大于零的数据写入新的临时数组中,然后调用归约求和内核函数,计算该临时数组中的数据的和,从而得到所有大于零的数据的均值。
[0125] 第三个循环的功能是根据前两个循环的计算结果得到新的噪声序列,对它的并行设计是启动相应数量的线程资源,每个线程按照其索引号判断该索引号对应的数据是否为噪声,并将结果写入全局显存。
[0126] 图7是本发明实施例中的短间期伪差剔除的并行执行算法的流程示意图。如图7所示,短间期伪差剔除的并行执行算法包括步骤。
[0127] S701:声明所述GPU设备端的变量并为其分配相应显存,将所述长间期伪差剔除后的心电信号从主机端拷贝至所述GPU设备端的全局内存。
[0128] S702:根据短间期伪差剔除的间期T1对所述心电信号进行分段,每个所述线程调用所述GPU设备端的kernel函数,根据所述索引号读取一段心电信号,计算公式S的值,根据所述索引号将所述公式的值存储至所述全局内存中一第二噪声序列,其中,公式S为:
[0129]
[0130] 其中,sum是所有所述段心电信号中心电信号的平方和。
[0131] S703:修改所述线程的数量及其对应处理的心电信号的采样点个数,每个修改后的线程重新调用kernel函数,根据所述修改后的线程的索引号读取其唯一对应的所述长间期伪差剔除的结果的第一噪声序列中的一个标记值,并通过一第三标记标出显示是噪声的所述标记值所对应段的心电信号。
[0132] S704:根据所述第三标记串行筛除显示是噪声的所述标记值所对应段的心电信号。
[0133] S705:所述修改后的线程调用所述GPU设备端中的规约求和kernel函数,计算经过筛除后剩余的所有心电信号的和值。
[0134] S706:根据所述和值求得均值,根据所述均值生成一第二阈值范围。
[0135] S707:再次修改所述线程的数量及其对应处理的心电信号的数量,再次修改后的所述线程再次重新调用kernel函数,根据再次修改后的所述线程的索引号从所述第二噪声序列读取并剔除每个不在所述第二阈值范围内的所述公式的值,生成短间期伪差剔除结果。
[0136] S708:将所述短间期伪差剔除结果从所述GPU设备端拷贝至所述主机端。
[0137] 在上述步骤S702中,先对根据短间期伪差剔除的间期对心电信号进行分段,再对心电信号并行进行短间期伪差剔除,可以简化并行程序的复杂度,减少了编程实现的工作量。
[0138] 在上述步骤S702中,每个所述线程处理的心电信号的采样点个数可为f*T1,所述线程的数量可为 其中,L为从所述主机端拷贝的心电信号的采样点序列长度,f为心电信号的采样点频率。可设定ThreadsPerBlock个所述线程对应一个线程块,每个所述线程块对应的心电信号的采样点个数可由上述公式(1)得到,即可以是:
[0139] DataPerBlock=f*T*ThreadsPerBlock,
[0140] 线程块的数量可由上述公式(2)得到,即可以是:
[0141] BlockNum=(L+DataPerBlock-1)/DataPerBlock。
[0142] 在上述步骤S703中,修改后的线程的数量可为 其中,L为从所述主机端拷贝的心电信号的采样点序列长度,f为心电信号的采样频率,T为所述长间期伪差剔除的间期,可使DataPerBlock1个修改后的线程对应一个线程块,线程块的数量可根据上述公式(2)计算得到,可以是:
[0143] BlockNum1=(L1+DataPerBlock1-1)/DataPerBlock1,
[0144] 其中,L1为所有所述长间期伪差剔除的结果的第一噪声序列的长度。
[0145] 在上述步骤S707中,再次修改后的线程的数量可为 每个再次修改后的线程可对应处理一个所述公式的值,可设定ThreadsPerBlock2个所述再次修改后的线程对应一个线程块,所述线程块的数量可根据上述公式(2)计算得到,可以是:
[0146] BlockNum2=(n+ThreadsPerBlock2-1)/ThreadsPerBlock2,
[0147] L为从所述主机端拷贝的心电信号的采样点序列长度。短间期伪差剔除结果可以包括心电数据、噪声/非噪声标记、S的值。
[0148] 本发明实施例中,短间期伪差剔除算法采用并行执行算法,可以减小滤波阶段的耗时,提高心电信号分析的速度。
[0149] 本发明实施例中,R波位置提取采用的算法可为数学形态学变算法,具体地,是数学形态学变换算法中腐蚀和膨胀运算,即首先对数据进行腐蚀运算,然后在对腐蚀运算后的数据进行膨胀运算。本发明实施例可利用串行算法进行腐蚀运算。在腐蚀运算过程中,将腐蚀窗口的大小设为5,滑动步率设为1。每次从心电信号数据ecglist中读取一个数据,以及与该数据相邻的后续四个数据。然后,对读取的五个数据分别进行不同程度的腐蚀运算,并得到其中的最小值,将该最小值写入临时数组f0中。膨胀运算可在腐蚀运算后得到的临时数组f0的基础上进行的。在膨胀运算的过程中,膨胀窗口的大小同样可设为5,滑动步率可为1。每次从数组f0中读取一个数据,及与其相邻的后续四个数据。然后,对读取的五个数据做不同程度的膨胀运算,得到其中的最大值,将该最大值写入临时数组f1中。
[0150] 图8是本发明一实施例中的短间期伪差剔除的并行执行算法的流程示意图。如图8所示,短间期伪差剔除的并行执行算法包括步骤:
[0151] S801:声明设备端所需变量,并为之分配相应的显存,然后将内核函数所需相关数据从主机端拷贝到设备端。
[0152] S802:定义线程块中线程的数量ThreadsPerBlock和每个线程处理的数据量DataPerThread=f*T1,然后依据上述公式(1)和公式(2),计算得到需要启动的线程块的数量,启动kernel_1函数,每个线程按照其索引号gid从心电数据中读取下标为gid*f*T1至(gid+1)*f*T1-1之间的数据,并依据公式 将计算的结果写入临时数组noise中线程索引号gid对应的下标的位置,其中sum是该线程对应的数据集中的数据的平方和。
[0153] S803:修改线程块中线程的数量ThreadsPerBlock,以及每个线程处理的数据量DataPerThread,以及数据总量 (相关变量在长间期伪差剔除中已定义,这里的n为长间期伪差剔除所产生的噪声数组的长度),依据上述公式(1)、(2)计算得到线程块的数量,启动kernel_2函数,由于线程的数量等于长间期伪差剔除中产生的噪声数组noiselist的长度,即在kernel_2中,每个线程按照线程索引号可以唯一对应noiselist中的一个数据,所以kernel_2中每个线程按照线程索引号从noiselist读取相应的数据,如果noiselist[gid]=1,则将数组noise中下标为gid*T到(gid+1)*T-1值置零。
[0154] S804:串行将数组noise中的零值筛除,并产生一个新的无零值的临时数组temp_noise,调用规约求和kernel函数计算临时数组的均值。
[0155] S805:根据临时数组的均值,得到新的阈值范围。
[0156] S806:修改每个线程块的线程数量ThreadsPerBlock,依据数组noise的长度计算得到需要启动的线程块的数量BlockNum,调用kernel_3函数,每个线程从全局内存中读取noise[gid],并与S805步骤产生的阈值范围比较,判断是否噪声,最后生成短间期伪差序列noiselist_2。
[0157] S807:将相关数据从设备端拷贝到主机端,释放无用的设备端变量,回收设备端显存和主机端内存。
[0158] 一个实施例中,R波位置提取算法采用串行算法。图9是本发明实施例中的R波位置提取串行执行算法的流程示意图。如图9所示,R波位置提取串行执行算法包括步骤:
[0159] S901:定义膨胀运算和腐蚀运算的窗口大小w=5和梯度k[w]={0,50,100,50,0}。
[0160] S902:依次从心电信号数据ecglist中读一个心电信号数据ecglist[i],以及其后的四个心电信号数据ecglist[i+1]、ecglist[i+2]、ecglist[i+3]、ecglist[i+4],分别与S901中对应的梯度进行不同程度的腐蚀运算,得到最小值,写入数组f0[i]中。
[0161] S903:重复步骤S902,直到数组ecglist只剩下4个数据。
[0162] S904:对于心电信号数据ecglist中的最后4个心电信号数据ecglist[num_read-w+1]、ecglist[num_read-w+2]、ecglist[num_read-w+3]、ecglist[num_read-w+4]做最大程度的腐蚀运算,并将腐蚀运算的结果写入f0[num_read-w+1]、f0[num_read-w+2]、f0[num_read-w+3]、f0[num_read-w+4]中。
[0163] S905:腐蚀运算结束。
[0164] S906:对腐蚀运算得到的结果集数组f0进行膨胀运算,依次从数组f0中读一个数据f0[i],以及其后的数据f0[i+1]、f0[i+2]、f0[i+3]、f0[i+4],分别与S901中对应的梯度进行相应程度的膨胀运算,得到最大值,写入数组f1[i]。
[0165] S907:重复步骤S906,直到数组f0中剩下最后四个数据。
[0166] S908:对于S907中剩下的最后四个数据,分别做最大程度的膨胀运算,即将ecglist[num_read-w+1]、ecglist[num_read-w+2]、ecglist[num_read-w+3]、ecglist[num_read-w+4]分别加100后写入f1[num_read-w+1]、f1[num_read-w+2]、f1[num_read-w+3]、f1[num_read-w+4]中。
[0167] S909:膨胀运算结束。
[0168] 最后,计算数据ecglist[i]与数据f1[i]之间的差值,并计算所有差值的均值,将该均值写入全局显存s1[i]中。返回计算的结果,数学形态学变换算法结束。
[0169] 通过R波位置提取串行执行算法分析,发明人发现,在上述串行分析算法中,不是一次对所有的心电数据进行数学形态学膨胀运算与腐蚀运算,而是分多批次进行的。每次从经过滤波处理的心电数据中读取一定数量(num_read)的心电数据,然后对读取的该部分心电数据进行膨胀运算与腐蚀运算。根据运算结果进行相应的逻辑判断,从而提取该段心电数据中的所有R波位置。在对R波位置提取算法进行并行化改进时,采用的“一对一”的方式进行。
[0170] 每次调用内核函数进行膨胀运算和腐蚀运算时,启动与数据量等量的线程资源,使得每个线程按照其索引号可以找到唯一的心电数据点。然后,对该数据以及其后相邻的4个数据进行膨胀运算和腐蚀运算,并将计算结果按照线程的索引号写入全局显存。在该并行化执行过程中,发明人进一步发现,程序会多次调用内核函数,并且每次调用之前将本次内核函数所需的数据从CPU端内存写入GPU端显存,CPU和GPU之间频繁的数据传输会严重影响程序的执行效率。下述实施例中,发明人对此做了进一步优化。
[0171] 图10是本发明实施例的R波位置提取的并行执行算法的流程示意图。如图10所示,R波位置提取的并行执行算法包括步骤:
[0172] S1001:声明所述GPU设备端的变量并为其分配相应显存,将滤波处理后的所述心电信号从主机端的内存拷贝到所述GPU设备端的全局内存。
[0173] S1002:每个所述线程调用kernel函数,根据其索引号对应从滤波处理后的所述心电信号中读取一个待检波心电信号。
[0174] S1003:所述线程根据设定窗口大小w和一设定梯度,对读取的所述待检波心电信号及其后紧邻的w-1个待检波心电信号进行不同程度的腐蚀运算,将腐蚀运算后的读取的所述待检波心电信号及所述w-1个待检波心电信号中的最小值根据所述索引号存储至所述全局内存中的一第一临时序列,w为整数,w≥2。
[0175] S1004:每个所述线程根据所述索引号从所述第一临时序列中读取一个所述最小值。
[0176] S1005:根据所述设定窗口大小w和所述设定梯度,对读取的所述最小值及其后紧邻的w-1个所述最小值进行不同程度的膨胀运算,并根据所述索引号将膨胀运算后的读取的所述最小值及其后紧邻的w-1个所述最小值中的最大值存储至所述全局内存中的一第二临时序列。
[0177] S1006:根据所述索引号读取并计算所述待检波心电信号和所述最大值的差值,并将所述差值存储至所述全局内存中的一第三临时序列。
[0178] S1007:所述线程调用规约求和kernel函数计算所述第三临时序列中的所有所述差值的和值。
[0179] S1008:根据所述和值求均值。
[0180] S1009:将所述均值从所述GPU设备端拷贝至所述主机端。
[0181] 本发明实施例中,R波位置提取的并行执行算法中,将经过滤波处理的心电数据全部写入GPU显存,并设置标志位标记读位置,内核函数在执行时依据标志位从显存中读取本次所需的心电数据同时更新标志位。该方法将数据的准备从CPU端迁移到了GPU,使得在此过程中从CPU内存向GPU显存中写数据只发生一次,大大减少了数据传输耗时。
[0182] 本发明实施例中,根据步骤S1008得到均值后,可以根据该均值在主机端继续计算得到R波的位置。
[0183] 在上述步骤S1003中,还可以将腐蚀运算后的读取的所述待检波心电信号及所述w-1个待检波心电信号中的最小值存储至一寄存器中。在上述步骤S1004中,从该寄存器中读取的一个最小值,再从全局内存中读取与该最小值相邻的w-1个最小值。
[0184] 如此一来,因为同时从全局内存和寄存器中读取数据,可以进一步提高R波位置提取的速度。
[0185] 在上述步骤S1003中,设定窗口大小和设定梯度可以是多种不同设定值,例如,该设定窗口大小w=5,该设定梯度为k[w]={0,50,100,50,0}。
[0186] 在上述步骤S1002中,该线程的数量可以等于从主机端拷贝的心电信号的采样点序列长度L3,可设定ThreadsPerBlock3个该线程对应一个线程块,该线程块的数量可以是:
[0187] BlockNum3=(L3+ThreadsPerBlock3-1)/ThreadsPerBlock3。
[0188] 如此可降低并行算法的复杂度。
[0189] 图11是本发明一实施例的R波位置提取的并行执行算法的流程示意图。如图11所示,R波位置提取的并行执行算法包括步骤:
[0190] S1101:根据数据规模和GPU本身参数限制,确定所需启动的线程块数量BlockNum和每个线程块中线程的数量threadPerBlock,使得总的线程数量等于数据量。
[0191] S1102:调用kernel_1函数,在该内核函数中,每个线程依据其索引号gid从全局显存中读取相应的心电数据以及其后的四个数据,然后对这五个数据分别进行不同程度的腐蚀运算,并将得到的最小值再次依据线程的索引号写入临时的d_f0[gid]和寄存器中。
[0192] S1103:同步线程,使得所有线程均已完成第S1102步骤中的腐蚀运算。
[0193] S1104:腐蚀运算完成,依据腐蚀运算得到的结果进行膨胀运算。
[0194] S1105:在该内核函数中,线程首先从寄存器中读取数据d_f0[gid],再依次依据线程的索引号从显存中读取四个相邻的数据d_f0[gid+1]、d_f0[gid+2]、d_f0[gid+3]、d_f0[gid+4],然后对这五个数据分别进行不同程度的膨胀运算,并将得到的最大值依据线程的索引号写入全局内存中的临时的d_f1[gid]中。
[0195] S1106:膨胀运算完成,进行其他运算。
[0196] S1107:调用kernel_2函数,在该内核函数中,计算数组中d_ecglist[gid]与腐蚀膨胀运算得到的结果d_f1[gid]之间的差值,并写入d_s1[gid]中。
[0197] S1108:调用归约求和内核函数,对数组d_s1中的数据进行归约求和,并将最终的结果写入数组d_sum_s1。
[0198] S1109:计算数组s1中数据集的均值d_mean。
[0199] S1110:将计算结果从设备端拷贝到主机端,释放不用的变量回收内存。
[0200] 本发明实施例中,QRS波群起始终止位置提取可采用峰值群确定的方法获得。寻找R波附近的波峰和波谷,并根据一设定阈值,确定QRS波群的边缘位置。QRS波群起始位置的提取所需的特征参数依赖于R波位置的提取。QRS波群宽度的计算主要依靠两个数组:数组QRS_startlist和数组QRS_endlist。数组QRS_startlist存储了QRS波群的起始点,数组QRS_endlist存储了QRS波群的终止点,所以QRS波的宽度即为二者之间的差值。
[0201] 一个实施例中,QRS波群宽度提取采用串行算法执行。图12是本发明实施例中的QRS波群宽度提取的串行执行算法的流程示意图。如图12所示,在串行算法执行过程中,依次从QRS波群的起始点数组QRS_startlist和QRS波群的终止点数组QRS_endlist中读取QRS波群的起始位置QRS_startlist[i]和终止位置QRS_endlist[i],求取起始位置QRS_startlist[i]和终止位置QRS_endlist[i]的差值QRSlist,再根据设定阈值80确定是否记录该差值QRSlist。
[0202] 另一个实施例中,QRS波群宽度提取采用并行算法执行。依据数组QRS_startlist和数组QRS_endlist的长度启动相应数量的线程资源,然后每个线程依据其索引gid分别从数组QRS_startlist和数组QRS_endlist读取相应的数据并行计算二者之间的差值,即可得到相应的QRS波群的宽度,最后再依据线程的索引将QRS波群的宽度写入全局显存。
[0203] 图13是本发明实施例中的QRS波群宽度提取的并行执行算法的流程示意图。如图13所示,QRS波群宽度提取的并行执行算法包括步骤:
[0204] S1301:声明所述GPU设备端的变量并为其分配相应显存,将QRS波群起止位置提取的结果从主机端拷贝到所述GPU设备端的全局内存。
[0205] S1302:所述线程调用所述GPU设备端的kernel函数,根据其索引号读取所述QRS波群起止位置提取的结果中的起始位置和终止位置,计算所述起始位置和终止位置的差值,根据所述索引号将所述差值存储至所述全局内存,生成QRS波群宽度提取的结果。
[0206] S1303:将所述QRS波群宽度提取的结果从所述GPU设备端拷贝至所述主机端。
[0207] 本发明实施例中,可在主机端根据峰值群确定法获得QRS波群的所述起始位置和所述终止位置。以使不易于并行执行的步骤在主机端串行执行,减少在CPU和GPU之间拷贝数据的耗时。
[0208] 在上述步骤S1302中,可根据数据规模和GPU本身参数限制,确定所需启动的线程块数量blocknum和每个线程块中线程的数量threadsPerBlock。所启动线程的总数量可为blocknum*threadPerBlock。线程依据其索引号gid分别从全局内存中的QRS波群起始位置数组QRS_startlist和QRS波群终止位置数组QRS_endlist读取相应的起始位置数据QRS_startlist[gid]和终止位置数据QRS_endlist[gid],计算得到QRS波群宽度,并再次依据线程的索引号将计算结果写入到QRSlist[gid]中。
[0209] 本发明实施例中,所用到的QRS波群的起始位置和终止位置可在主机端计算得到。
[0210] 本发明实施例中,异常波形分类串行算法可分为四步:
[0211] 第一步,对十三种或多种类型的心拍逐个判定。
[0212] 第二步,针对被噪声严重污染的数据段、波幅过小的心搏以及对房性早搏和室性早搏的判定。
[0213] 第三步,针对漏搏及停搏的判定。
[0214] 第四步,针对所有异常波,使用模板比对方法。
[0215] 通过对上述异常波形分类的四个步骤的算法进行分析,发明人发现,第四步模板对比耗时占了整个算法的95%以上,所以,可对耗时最多的部分进行并行加速。模板比对方法是在每个异常心拍附近建立QRS模板。模板比对方法的核心部分耗时最多,该核心部分是生成标识序列。标识序列是依据RR间期RRlist生成。其中标识包括-1、0、1三个值。
[0216] 图14是本发明实施例中的创建模板的并行执行算法的流程示意图。如图14所示,创建模板的并行执行算法包括步骤:
[0217] S1401:声明所述GPU设备端的变量并为其分配相应显存,将R波位置提取的结果从主机端拷贝到所述GPU设备端的全局内存。
[0218] S1402:所述线程调用kernel函数,根据其索引号读取所述R波位置提取的结果中的RR间期,根据一设定准则获取每个所述RR间期的标识符,并根据所述索引号将所述标识符存储至所述全局内存中,生成创建模板的结果。
[0219] S1403:将所述创建模板的结果从所述GPU设备端拷贝到所述主机端。
[0220] 本发明实施例中,RR间期可在主机端由R波位置提取结果计算得到。
[0221] 在上述步骤S1402中,该设定准则可包括:
[0222] (1)如果与第i个RR间期RRlist[i]相邻的第i+1个RR间期RRlist[i+1]不在区间(0.6*RRlist[i],1.5*RRlist[i])内,则所述RR间期数据RRlist[i]的标识符为-1,其中,i为整数,i≥0。
[0223] (2)如果所述RR间期RRlist[i+1]在区间(0.6*RRlist[i],1.5*RRlist[i])内,及所述RR间期RRlist[i]不在区间(0.8*RRmean,1.3*RRmean)内,则所述RR间期RRlist[i]的标识符为0,其中,RRmean为所有所述RR间期的平均值。
[0224] (3)如果所述RR间期RRlist[i+1]在区间(0.6*RRlist[i],1.5*RRlist[i])内,及所述RR间期RRlist[i]在区间(0.8*RRmean,1.3*RRmean)内,则所述RR间期RRlist[i]的标识符为1。
[0225] 在上述步骤S1402中,可根据数据规模和GPU本身参数限制,确定所需启动的线程块数量blocknum和每个线程块中线程的数量threadPerBlock。启动线程的个数可为blocknum*threadPerBlock,每个线程按照其索引从全局显存中读取相应的RR间期数据,并依据上述三条准则,得到相应的标识符,并按照线程索引将结果写入d_FLAGRlist[gid]中。
[0226] 模板是在异常心拍附近创建,即当发现异常心拍时,就需要调用模板创建函数创建模板,因此当异常波形非常多时,就会在该阶段消耗大量的时间。本发明实施例中,不需在每次创建模板时都重新生成标识序列,所以本发明实施例通过对标识序列的生成和模板的创建进行优化,可显著减少异常波形分类的耗时。
[0227] 本发明实施例的并行心电信号分析方法始终保持与串行心电信号分析方法的正确率一致。使用24小时长程心电信号数据对串行和并行算法进行多次测试,然后取其均值得到心电信号分析各个阶段的加速比,如表1所示。
[0228] 表1是串行运行时间和并行运行时间以及对应的加速比
[0229]  串行运行时间(ms) 并行运行时间(ms) 加速比
长间期伪差剔除算法 392 54 7.3
短间期伪差剔除算法 261 44 5.9
数学形态学变换算法 1685 160 10.5
QRS波群宽度检测算法 7 6.8 1.0
心率失常波形分类与检测 1562 30.2 48.5
[0230] 通过表1中的数据对比,可以看出,在心电信号分析的滤波阶段,长间期伪差剔除算法的串行平均运行耗时为392毫秒,经过并行设计和优化后的平均运行时间为54毫秒,所获得的加速比为7.3;短间期伪差剔除算法的串行平均运行时间261毫秒,经过并行设计和优化后的平均运行时间是44毫秒,所获得的加速比为5.9;在心电信号的QRS波检测阶段,数学形态学膨胀运算与腐蚀运算的串行运行速度为1685毫秒,但是经过并行设计和优化后的平均运行时间是160毫秒,加速比为10.5;QRS波群宽度计算的串行运行时间为7毫秒,并行加速后的运行平均运行时间是6.8毫秒,加速比接近1;心率失常波形分类算法的串行运行时间的均值是1562毫秒,经过并行加速后的运行速度为30.2,所获得的加速比为48.5。
[0231] 在对各个算法并行加速前后的运行时间对比的过程中,可以发现,当算法的串行运行时间较长时,并行加速所获得的加速比越大,当算法的串行运行时间很短时。
[0232] 使用不同时长的心电信号样本集对本发明实施例的并行算法进行多次分析测试,得到平均分析时间,如表2所示。从表2可以得知,异常波形越多,分析时间越长,本发明实施例的并行心电信号分析方法能够很好地适应不同时长的心电信号数据文件。分析时间均可保持在2秒以内。时长为24小时的心电信号数据的平均分析时间为1.9秒。假设上传至家庭健康云平台的心电信号数据是均匀分布在每天的各个时段的,则一台“CPU+GPU”服务器一天可以实时分析24小时的长程心电信号数据的数量是44920。那么,只需在家庭健康云平台上部署7台“CPU+GPU”服务器组成的算法服务器集群,就可以满足每日30万条的24小时长程心电信号数据的快速分析需求。
[0233] 表2不同时长的心电数据的分析时间
[0234]心电时长(h) 1 2 4 8 12 16 20 24
文件大小(MB) 0.5 1 2.1 4.1 6.2 8.3 10.3 12.4
分析时间(ms) 105 183 345 676 1023 1364 1644 1932
[0235] 本发明使用“GPU+CPU”异构并行系统来加速长程心电数据的分析过程,即首先使用GPU(Graphic Processing Unit,图形处理器)加速技术,将串行心电算法中的可并行和耗时较多的部分并行化,从指令级加速心电的分析过程,然后在家庭健康云平台上部署装载有并行心电分析算法的GPU服务器,以满足当前家庭健康云服务平台的需求。
[0236] 本发明实施例的基于GPU的并行心电数据分析方法通过将心电信号分析过程中的一个或多个步骤在GPU上并行执行,可以显著提高心电信号的分析速度。
[0237] 本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
[0238] 本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0239] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0240] 这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0241] 以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
QQ群二维码
意见反馈