基于离散小波变换(DWT)的心电信号伪影去除及心电信号PQRST波检测(MATLAB R2018)

心电信号是心脏神经,肌肉组织电化学活动的表现形式。这些电化学活动使心脏内部产生一系列非常协调的电刺激脉冲,分别使心房,心室的肌肉细胞兴奋,从而有节律的舒张和收缩。这些生物电活动在体表的不同部位形成不同的电位差变化,就是心电信号。其他生理电活动,如脑电(Electroencephalogram,EEG),肌电(Electromyography,EMG)等都是如此。

心脏主要由心肌组成四腔室结构,上部分为两心房,下部分为两心室。心脏收缩时

的心电活动称为除极,心脏舒张时的心电活动称为复极。一个心动周期开始于窦房结,它是心脏的最高起搏点(也叫一级起搏点)。它出发的激励指令经结间束首先传给房室结(也称第二级起搏点)。房室结向下发出一通传导路,称为房室束,它位于室间隔内。房室束往下又不断发左右两个束支,越分越细,最后分别形成互相交织的网状结构,称为普肯耶纤维,最后终止于心肌内。心电传导变化复杂,呈混沌状,但其有序结果通过周身组织传遍全身,使身体各部位出现有规律的,各向异性的电位变化。一个周期的心电信号如下图所示:

将测量电极按照一定规则放置在人体表面的特定位置,会监测到心电信号的变化曲线,不同的导联方式得到的心电信号波形会有所不同,将这些变化曲线记录下来,就是临床诊断中用到的心电图。在一般情况下,心电图由一系列波群组成,各个波段反映不同阶段心电变化,它们是P波,QRS波群,T波和可能出现的一小段U波。标准心电图如下所示:

心电信号是心脏物理规律的微弱电反映,它有如下特点:

(1)信号微弱,容易被噪声淹没。心电信号幅度为毫伏级,约为0.5~5mV,典型值为1mV。

(2)具有低频和能量集中的特性。心电信号是一种低频信号,频率范围在0.05Hz~100Hz。其能量主要集中在0.25Hz~40Hz。

(3)随机性强,不同人的心电信号都不一样,甚至有通过心音进行人员身份识别的技术手段,但是标准心电可以通过函数模拟产生。

(4)准周期性。心电信号是一种典型的准周期信号,各个周期的信号虽然不完全相同但它们的特征相同。

鉴于此,提出一种基于离散小波变换(DWT)的心电信号伪影去除及心电信号PQRST波检测方法,运行环境为MATLAB R2018,心电信号伪影去除代码如下:

Matlab 复制代码
clear all
close all
clc

Fs = 360; % Sampling Frequency
Fnotch = 0.67; % Notch Frequency
BW = 5; % Bandwidth
Apass = 1; % Bandwidth Attenuation
[b, a] = iirnotch (Fnotch/ (Fs/2), BW/(Fs/2), Apass);
Hd = dfilt.df2 (b, a);

load ('100m.mat');
ecgsig = val/200;
t = 0:length(ecgsig)-1;
tx = t./Fs;

subplot (4, 1, 1), plot(tx,ecgsig), title ('ECG Signal with baseline wander'), grid on
y0=filter (Hd, ecgsig);
subplot (4, 1, 2), plot(tx,y0), title ('ECG signal with low-frequency noise (baseline wander) Removed'), grid on

Fnotch = 50; % Notch Frequency
BW = 50; % Bandwidth
Apass = 1; % Bandwidth Attenuation
[b, a] = iirnotch (Fnotch/ (Fs/2), BW/ (Fs/2), Apass);
Hd1 = dfilt.df2 (b, a);
y1=filter (Hd1, y0);
subplot (4, 1, 3), plot (tx,y1), title ('ECG signal with power line noise Removed'), grid on

d = fdesign.lowpass('Fp,Fst,Ap,Ast',0.4,0.5,1,80);
Hd2 = design(d,'equiripple');
y2 = filter(Hd2,y1);
subplot(4,1,4)
plot(tx,y2),title('ECG Signal with high frequency noise removed'), grid on

wt = modwt(y2,4,'sym4');
wtrec = zeros(size(wt));
wtrec(3:4,:) = wt(3:4,:);

y3 = imodwt(wtrec,'sym4');
y3 = abs(y3).^2;
avg = mean(y3);
[Rpeaks,locs] = findpeaks(y3,t,'MinPeakHeight',8*avg,'MinPeakDist',50);
nohb = length(locs);
timelimit = length(ecgsig)/Fs;
hbpermin = (nohb*60)/timelimit;
disp(strcat('Heart Rate = ',num2str(hbpermin)))

figure
plot(t,y3)
grid on
xlim([0,length(ecgsig)])
hold on
plot(locs,Rpeaks,'^r');
%完整代码:mbd.pub/o/bread/ZZWZk5py
xlabel('samples'), title(strcat('Rpeaks found and Heart Rate : ',num2str(hbpermin)))

心电信号PQRST波检测结果如下:

工学博士,担任《Mechanical System and Signal Processing》《中国电机工程学报》《控制与决策》等期刊审稿专家,擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。

相关推荐
sduwcgg10 分钟前
kaggle配置
人工智能·python·机器学习
88号技师2 小时前
【1区SCI】Fusion entropy融合熵,多尺度,复合多尺度、时移多尺度、层次 + 故障识别、诊断-matlab代码
开发语言·机器学习·matlab·时序分析·故障诊断·信息熵·特征提取
硅谷秋水3 小时前
通过模仿学习实现机器人灵巧操作:综述(上)
人工智能·深度学习·机器学习·计算机视觉·语言模型·机器人
仙人掌_lz3 小时前
人工智能与机器学习:Python从零实现性回归模型
人工智能·python·机器学习·线性回归
阡之尘埃3 小时前
Python数据分析案例73——基于多种异常值监测算法探查内幕交易信息
人工智能·python·机器学习·数据分析·异常检测·无监督学习
极小狐4 小时前
极狐GitLab 如何 cherry-pick 变更?
人工智能·git·机器学习·gitlab
旧故新长5 小时前
支持Function Call的本地ollama模型对比评测-》开发代理agent
人工智能·深度学习·机器学习
一只可爱的小猴子6 小时前
2022李宏毅老师机器学习课程笔记
人工智能·笔记·机器学习
爱研究的小陈7 小时前
Day 4:机器学习初探——从监督学习到无监督学习
机器学习
Blossom.1188 小时前
人工智能在智能家居中的应用与发展
人工智能·深度学习·机器学习·智能家居·vr·虚拟现实·多模态融合