准确识别心电信号的R波是进行HRV分析的前提。因此,开发出准确的心电信号R波检测方法十分重要。近几十年来,提出的R峰检测方法主要分为两个阶段。第1阶段是预处理阶段,目的是对受不同噪声影响的原始心电信号进行降噪处理,从而实现增强R峰特征,削弱其他波形的目的。第二阶段为R峰检测阶段,利用决策规则寻找真实的R峰位置。
通常情况下心电信号的频率比较低,而且幅值比较小,在实际的信号采集过程中心电信号容易受到各种类型的噪声的影响,将导致心电信号的形态发生改变甚至波形突变等情况,这将影响对心血管疾病的临床分析和辅助诊断。因此需要对原始心电信号进行降低噪声处理,以减少噪声对心电信号的影响,为后续的心电信号R波检测等工作提供可靠的信号。
基线漂移
基线漂移噪声主要是在心电信号采集过程中,由于佩戴者的呼吸以及身体的运动,导致心电信号采集装置的电极发生滑动。基线漂移在心电图上的表现就是心电信号的基线发生波动,基线不再是水平的,这将影响科研人员对心电信号的特征点进行识别以及后续其他科研工作。基线漂移噪声频率范围一般小于1Hz。
工频干扰
工频干扰噪声是心电信号采集设备产生的一种比较常见的干扰噪音,它是由市电50Hz或60Hz及其谐波分量组成的,其中,国内的市电是50Hz,国外的市电是60Hz。工频干扰噪声导致心电信号的特征点的幅值比较大,这将导致心电信号R波的识别工作受到影响。
肌电噪声
肌电噪声是由于在心电信号采集的过程中,测试者的肌肉神经系统发生颤动或者收缩现象所导致的。因此在实际测量心电信号数据的时候需要注意寻找合适的电极贴片的位置,尽量减小肌电噪声对心电信号质量的影响。肌电噪声的频率范围一般是在5Hz-2000Hz之间。通常情况下,肌电噪声在心电信号上表现为细小的波纹,这将导致心电图峰值和低谷等位置模糊不清,使得心电信号R波的识别变得更加困难。
鉴于此,提出一种基于匹配追踪和最大重叠离散小波变换的ECG心电信号R波检测方法,运行环境为MATLAB 2018a。
function plotExtents(hAxes,x,y,iPk,bPk,bxPk,byPk,wxPk,refW)% compute level of half-maximum (height or prominence)
if strcmp(refW,'halfheight')hm = 0.5*y(iPk);
elsehm = 0.5*(y(iPk)+bPk);
end% get the default color order
colors = get(0,'DefaultAxesColorOrder');% plot boundaries between adjacent peaks when using half-height
if strcmp(refW,'halfheight')% plot heightplotLines(hAxes,'Height',x(iPk),y(iPk),x(iPk),zeros(length(iPk),1),colors(2,:)); % plot widthplotLines(hAxes,'HalfHeightWidth',wxPk(:,1),hm,wxPk(:,2),hm,colors(3,:));% plot peak bordersidx = find(byPk(:,1)>0);plotLines(hAxes,'Border',bxPk(idx,1),zeros(length(idx),1),bxPk(idx,1),byPk(idx,1),colors(4,:));idx = find(byPk(:,2)>0);plotLines(hAxes,'Border',bxPk(idx,2),zeros(length(idx),1),bxPk(idx,2),byPk(idx,2),colors(4,:));else% plot prominenceplotLines(hAxes,'Prominence',x(iPk), y(iPk), x(iPk), bPk, colors(2,:)); % plot widthplotLines(hAxes,'HalfProminenceWidth',wxPk(:,1), hm, wxPk(:,2), hm, colors(3,:));% plot peak bordersidx = find(bPk(:)<byPk(:,1));plotLines(hAxes,'Border',bxPk(idx,1),bPk(idx),bxPk(idx,1),byPk(idx,1),colors(4,:));idx = find(bPk(:)<byPk(:,2));plotLines(hAxes,'Border',bxPk(idx,2),bPk(idx),bxPk(idx,2),byPk(idx,2),colors(4,:));
endhLine = get(hAxes,'Children');
tags = get(hLine,'tag');legendStrs = {};
searchTags = {'Signal','Peak','Prominence','Height','HalfProminenceWidth','HalfHeightWidth','Border'};
for i=1:length(searchTags)if any(strcmp(searchTags{i},tags))legendStrs = [legendStrs, ...{getString(message(['signal:findpeaks:Legend' searchTags{i}]))}]; %#ok<AGROW>end
endif length(hLine)==1legend(getString(message('signal:findpeaks:LegendSignalNoPeaks')), ...'Location','best');
elselegend(legendStrs,'Location','best');
完整代码可通过知乎学术咨询获得:
https://www.zhihu.com/consult/people/792359672131756032?isMe=1
end
工学博士,担任《Mechanical System and Signal Processing》《中国电机工程学报》《控制与决策》等期刊审稿专家,擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。