【医学】基于小波变换DWT实现ECG信号心率计算附matlab代码

简介: 【医学】基于小波变换DWT实现ECG信号心率计算附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法  神经网络预测雷达通信 无线传感器

信号处理图像处理路径规划元胞自动机无人机

⛄ 内容介绍

心血管疾病是当今危害人类身体健康的主要疾病之一,而心电图检查是临床上诊断心血管疾病的重要方法,如何利用计算机对心电图(ECG)进行快速、自动、准确的分析一直是国内外学者的热门课题。 心电图(ECG)是与心脏搏动相关的电位变化图,由于心电图各波形的形状及其间隔皆与心脏的电气特性有直接的关系,所以医生可以籍此判定心脏微电气活动中的异常,从而诊断出各种不同的心脏疾病,并且可用来监测病人的安危、评估病情的进展和治疗成效等。基于小波变换DWT实现ECG信号心率计算.

⛄ 部分代码

%**************************************************************************

% Outputs a .MAT matrix

% The matrix can then be used in the Wavelets toolbox.

% This program is based on rddata.m by Robert Tratnig.

% The algorithm was based on a program written by Klaus Rheinberger.

% 10May05 - Updated so output file name was how I wanted it

% 17 May 2005 - Added check that input contains exactly two signals -- GBM

%**************************************************************************

clc; clear all; close all;

%**************************************************************************

% Get Data & User Inputs

%**************************************************************************

PATH = input('Path Where Data Is Stored, Else Leave Blank = ','s');

FILE = input('ECG File Name = ','s');       % Input String Filename

HEADERFILE = strcat(FILE,'.hea');           % Header In TXT Format

ATRFILE = strcat(FILE,'.atr');              % Attributes In Binary Format

DATAFILE = strcat(FILE,'.dat');             % ECG Data File

SAMPLESTART = input('ECG Start Time = ','s');

SAMPLEEND = input('ECG End Time = ','s');  

SAMPLESTART_1 = str2num(SAMPLESTART);       % The Start Time In Seconds

SAMPLEEND_1 = str2num(SAMPLEEND);           % The End Time In Seconds

%**************************************************************************

% Load Header Data

%**************************************************************************

fprintf(1,'\\n$> WORKING ON %s ...\n', HEADERFILE);

signalh = fullfile(PATH, HEADERFILE);

fid1 = fopen(signalh,'r');

z = fgetl(fid1);

A = sscanf(z, '%*s %d %d %d',[1,3]);

nosig = A(1);                               % Number Of Signals

if nosig ~= 2

   error('Error: Input must have exactly 2 signals');

end;

sfreq = A(2);                               % Sample Rate Of Data

SAMPLESTART_2 = sfreq * SAMPLESTART_1;      % Samples/Second * Seconds

SAMPLEEND_2 = sfreq * SAMPLEEND_1;          % Samples/Second * Seconds

clear A;

for k = 1:nosig

   z = fgetl(fid1);

   A = sscanf(z, '%*s %d %d %d %d %d',[1,5]);

   dformat(k) = A(1);                      % Format - 212 Only

   gain(k) = A(2);                         % Integers Per mV

   bitres(k) = A(3);                       % Bit Resolution

   zerovalue(k) = A(4);                    % Value Of ECG Zero Point

   firstvalue(k) = A(5);                   % First Value Of Signal

end;

fclose(fid1);

clear A;

%**************************************************************************

% Fix Minor Data Problems

%**************************************************************************

if SAMPLESTART_2 == 0                       % If User Starts At Zero

   SAMPLESTART_2 = 1;                      % We Start At The First Entry

end;

if SAMPLEEND_1 == 0                         % If User Wants To End At Zero

   error('Error: Results In No ECG Data');

end;

if SAMPLESTART_1 < 0 | SAMPLEEND_1 < 0      % If User Enters Negative Time

   error('Error: ECG Start & End Time Must Be Positive');

end;

if SAMPLESTART_1 > SAMPLEEND_1              % If User Sets End Before Start

   error('Error: ECG Start Time Should Be Before ECG End Time');

end;

%**************************************************************************

% Load Binary Data

%**************************************************************************

if dformat ~= [212,212], error('Error: File Not 212 Binary Format'); end;

signald = fullfile(PATH, DATAFILE);         % Data In 212 Format

fid2 = fopen(signald,'r');

A = fread(fid2, [3, SAMPLEEND_2], 'uint8')';

fclose(fid2);

M2H = bitshift(A(:,2), -4);

M1H = bitand(A(:,2), 15);

PRL = bitshift(bitand(A(:,2),8),9);         % Sign Bit

PRR = bitshift(bitand(A(:,2),128),5);       % Sign Bit

M( : , 1) = bitshift(M1H,8)+ A(:,1)-PRL;

M( : , 2) = bitshift(M2H,8)+ A(:,3)-PRR;

if M(1,:) ~= firstvalue, error('Error: 1st Bit Values Inconsistent'); end;

switch nosig

case 2

   M( : , 1) = (M( : , 1) - zerovalue(1))/gain(1);

   M( : , 2) = (M( : , 2) - zerovalue(2))/gain(2);

   TIME = (0:(SAMPLEEND_2 - 1))/sfreq;

case 1

   M( : , 1) = (M( : , 1) - zerovalue(1));

   M( : , 2) = (M( : , 2) - zerovalue(1));

   M = M';

   M(1) = [];

   sM = size(M);

   sM = sM(2)+1;

   M(sM) = 0;

   M = M';

   M = M/gain(1);

   TIME = (0:2*(SAMPLEEND_2)-1)/sfreq;

otherwise

   disp('Error: Sorting Algorithm For > 2 Signals Not Programmed Yet!');

end;

clear A M1H M2H PRR PRL;

fprintf(1,'\\n$> LOADING DATA FINISHED \n');

%**************************************************************************

% Load Attributes Data

%**************************************************************************

atrd = fullfile(PATH, ATRFILE);

fid3 = fopen(atrd,'r');

A = fread(fid3, [2, inf], 'uint8')';

fclose(fid3);

ATRTIME = [];

ANNOT = [];

sa = size(A);

saa = sa(1);

i = 1;

while i <= saa

   annoth = bitshift(A(i,2),-2);

   if annoth == 59

       ANNOT = [ANNOT;bitshift(A(i + 3,2),-2)];

       ATRTIME = [ATRTIME;A(i+2,1) + bitshift(A(i + 2,2),8) +...

               bitshift(A(i + 1,1),16) + bitshift(A(i + 1,2),24)];

       i = i + 3;

   elseif annoth == 60

   elseif annoth == 61

   elseif annoth == 62

   elseif annoth == 63

       hilfe = bitshift(bitand(A(i,2),3),8) + A(i,1);

       hilfe = hilfe + mod(hilfe,2);

       i = i + hilfe/2;

   else

       ATRTIME = [ATRTIME;bitshift(bitand(A(i,2),3),8) + A(i,1)];

       ANNOT = [ANNOT;bitshift(A(i,2),-2)];

  end;

  i = i + 1;

end;

ECG_1_Temp = M(:,1);

ECG_1 = ECG_1_Temp(SAMPLESTART_2 : SAMPLEEND_2);

if nosig == 2

   ECG_2_Temp = M(:,2);

   ECG_2 = ECG_2_Temp(SAMPLESTART_2 : SAMPLEEND_2);

end;

Time_Adjusted = TIME(SAMPLESTART_2 : SAMPLEEND_2);

%**************************************************************************

% Display Data

%**************************************************************************

figure(1); clf, box on, hold on

plot(Time_Adjusted, ECG_1,'r');

if nosig == 2

   plot(Time_Adjusted, ECG_2,'b');

end;

for k = 1:length(ATRTIMED)

   text(ATRTIMED(k),0,num2str(ANNOTD(k)));

end;

xlim([Time_Adjusted(1), Time_Adjusted(end)]);

xlabel('Time (Seconds)'); ylabel('Voltage (mV)');

string = ['ECG Signal ',DATAFILE];

title(string);

fprintf(1,'\\n$> DISPLAYING DATA FINISHED \n');

%**************************************************************************

% Output Data File Into Current Working Directory

%**************************************************************************

save(strcat(FILE,'_ECG_',SAMPLESTART,'_',SAMPLEEND) ...

   , 'ECG_1' , 'ECG_2' , 'Time_Adjusted');

fprintf(1,'\\n$> ALL FINISHED \n');

%**************************************************************************

% End Of Code

%**************************************************************************

⛄ 运行结果

⛄ 参考文献

[1]张锦. 基于小波变换的ECG信号去噪研究[J]. 电脑知识与技术:学术版, 2017, 13(11):3.

[2]杨旭东. 基于小波变换的ECG信号特征参数提取研究[D]. 电子科技大学.

❤️ 关注我领取海量matlab电子书和数学建模资料
❤️部分理论引用网络文献,若有侵权联系博主删除


相关文章
基于粒子滤波器的电池剩余使用寿命计算matlab仿真
本研究基于粒子滤波器预测电池剩余使用寿命(RUL),采用MATLAB2022a实现。通过非线性动力学模型模拟电池老化过程,利用粒子滤波器处理非线性和非高斯问题,准确估计电池SOH变化趋势,进而预测RUL。系统仿真结果显示了良好的预测性能。
|
1月前
|
运维 算法
基于Lipschitz李式指数的随机信号特征识别和故障检测matlab仿真
本程序基于Lipschitz李式指数进行随机信号特征识别和故障检测。使用MATLAB2013B版本运行,核心功能包括计算Lipschitz指数、绘制指数曲线、检测故障信号并标记异常区域。Lipschitz指数能够反映信号的局部动态行为,适用于机械振动分析等领域的故障诊断。
|
2月前
|
算法
MATLAB符号计算
【10月更文挑战第9天】MATLAB不仅擅长数值计算,还具备强大的符号计算功能,支持代数运算、方程求解、微积分等。本文介绍如何使用MATLAB的符号工具箱进行符号变量定义、方程求解、微分积分及矩阵运算,并通过多个实际应用案例展示了其在机械系统、电路分析、经济优化和物理运动学等领域的应用。此外,文章还提供了符号计算的最佳实践和未来展望。
|
2月前
|
安全 调度
电力系统的负荷损失和潮流计算matlab仿真,对比最高度数,最高介数以及最高关键度等节点攻击
本课题研究节点攻击对电力系统稳定性的影响,通过模拟最高度数、最高介数和最高关键度攻击,对比不同攻击方式下的停电规模。采用MATLAB 2022a 进行系统仿真,核心程序实现线路断开、潮流计算及优化。研究表明,节点攻击会导致负荷损失和系统瘫痪,对电力系统的安全构成严重威胁。通过分析负荷损失率和潮流计算,提出减少负荷损失的方法,以提升电力系统的稳定性和安全性。
|
3月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于NSCT非采样轮廓波变换和CNN网络人脸识别matlab仿真
本项目展示了一种结合非采样轮廓波变换(NSCT)与卷积神经网络(CNN)的人脸识别系统。通过NSCT提取多尺度、多方向特征,并利用CNN的强大分类能力实现高效识别。项目包括ORL人脸库的训练结果对比,提供Matlab 2022a版本下的完整代码及详细中文注释,另有操作步骤视频指导。
|
4月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
236 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
4月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
143 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
3月前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
3月前
|
机器学习/深度学习 算法
基于心电信号时空特征的QRS波检测算法matlab仿真
本课题旨在通过提取ECG信号的时空特征并应用QRS波检测算法识别心电信号中的峰值。使用MATLAB 2022a版本实现系统仿真,涵盖信号预处理、特征提取、特征选择、阈值设定及QRS波检测等关键步骤,以提高心脏疾病诊断准确性。预处理阶段采用滤波技术去除噪声,检测算法则结合了一阶导数和二阶导数计算确定QRS波峰值。
|
4月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
111 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码

热门文章

最新文章