function [arypnData, nDataLen, arynRPos, ANNOT] = ReadMITDataMy( PATH, dataNum )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 函数说明:读取MIT数据
% 输入参数:PATH 数据路径
% dataNum 数据编号
% 输出参数:arypnData 波形,2导联
% nDataLen 波形长度
% arynRPos R波位置
% ANNOT2 每个心搏注释
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 输出参数初始化
arypnData = [];
nDataLen = 0;
arynRPos = [];
ANNOT = [];
% 读取头文件“.hea”
s = fopen(strcat(PATH,'\',dataNum,'.hea'),'r');
% 读第一行
A = fgetl(s);
arynHead = sscanf(A,'%d');
clear A;
% 导联数
nLeadNum = arynHead(2);
% 采样率
nSampleRate = arynHead(3);
% 数据总长
nDataLen = arynHead(4);
% 读各导联信息
for nLead = 1 : nLeadNum
A = fgetl(s);
arypnLeadInf(nLead,:) = sscanf(A,'%*s %d %d %d %d %d %d');
clear A;
% 存储格式
arynForm(nLead) = arypnLeadInf(nLead,1);
% 增益
arynGain(nLead) = arypnLeadInf(nLead,2);
% ADC零值
arynZero(nLead) = arypnLeadInf(nLead,4);
% 第一个值
arynFirstData(nLead) = arypnLeadInf(nLead,5);
end
fclose(s);
% 读取数据文件“.dat”
arypnData = zeros(nDataLen,2);
if arynForm(1) ~= 212 || arynForm(2) ~= 212
return;
end
s = fopen(strcat(PATH,'\',dataNum,'.dat'),'r');
% 每三个字节存储两个数据
A = fread(s,[3,nDataLen],'uint8');
A = A';
for nIndex = 1 : nDataLen
% 信号0的采样数据取自第一、二字节(16位)的最高12位,其中第一字节作为低8位,第二字节的低4位作为其高4位
arypnData(nIndex,1) = bitshift(bitand(A(nIndex,2),15),8) + A(nIndex,1) - arynZero(1);
% 信号1的采样数据由第二字节的高4位(作为组成信号1采样数据的12位的高4位)和下一字节的8位(作为组成信号1采样数据的12位的低8位)共同组成
arypnData(nIndex,2) = bitshift(bitshift(A(nIndex,2),-4),8) + A(nIndex,3) - arynZero(2);
end
clear A;
fclose(s);
% 读取注释文件“.atr”
s = fopen(strcat(PATH,'\',dataNum,'.atr'),'r');
A = fread(s,[2,nDataLen],'uint8');
A = A';
nBeatNum = 0;
nIndex = 1;
while nIndex <= length(A)
% 高6位的值为类型代码,代表意义是节律变化
nNote = bitshift(A(nIndex,2),-2);
% 低10位的值是发生时间或辅助信息
nPos = bitshift(bitand(A(nIndex,2),3),8) + A(nIndex,1);
% 当读到的16位值为0时,表示到了文件尾
if nNote == 0 && nPos == 0
break;
end
% 当高6位为十进制59时,读取之后第3个16位的高6位,作为类型代码,读取之后第二个16位+第一个16位*2^16,作为发生时间
if nNote == 59
nBeatNum = nBeatNum + 1;
ANNOT(nBeatNum) = bitshift(A(nIndex + 3,2),-2);
arynRPos(nBeatNum) = bitshift(A(nIndex + 2,2),8) + A(nIndex + 2,1)...
+ bitshift((bitshift(A(nIndex + 1,2),8) + A(nIndex + 1,1)),16);
% 发生时间的值为该注释点到前一注释点的间隔
if nBeatNum > 1
arynRPos(nBeatNum,1) = arynRPos(nBeatNum,1) + arynRPos(nBeatNum - 1);
end
% 高6位为十进制60,61,62时,继续读下一个16位
elseif nNote == 60 || nNote == 61 || nNote == 62
nIndex = nIndex + 1;
continue;
% 类型代码为63,代表的意义是在该16位值后附加了3个(低10位值代表的数)字节的辅助信息,若字节个数为奇数,则再附加一个字节的空值
elseif nNote == 63
nIndex = nIndex + (nPos + rem(nPos,2)) / 2;
else
nBeatNum = nBeatNum + 1;
ANNOT(nBeatNum,1) = nNote;
arynRPos(nBeatNum,1) = nPos;
% 发生时间的值为该注释点到前一注释点的间隔
if nBeatNum > 1
arynRPos(nBeatNum,1) = arynRPos(nBeatNum,1) + arynRPos(nBeatNum - 1);
end
end
nIndex = nIndex + 1;
end
解读MIT-BIH数据的MATLAB代码.zip
版权申诉
93 浏览量
2023-02-01
19:31:15
上传
评论
收藏 2KB ZIP 举报
GZM888888
- 粉丝: 209
- 资源: 2970
最新资源
- 20240616_195603662.jpeg
- 52481010776991400971718624279654.jpg
- _.sys_oaid_QQ浏览器压缩包.zip
- 三个工具 1、gui的分数显示,每5秒刷一次,数据库能到27年 2、WebServer改分数的接口 3、修改分数的html页面
- 计算整数各位数字之和 C++中如何计算任何一个正整数的各位数字之和
- FPM383C/FPM383F指纹模块,stm32例程,使用库函数
- 银行家算法学习笔记介绍和使用讲解
- 后缀表达式求值算法介绍
- DDR3 DDR4 DDR5参数详细解释,手把手教你学习流程,反复复习
- 多台单片机间网络的实现(互相通信)含源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈