matlab 下采样数据点_MATLAB下对MIT-BIH数据库中212格式ECG读取

本文介绍了如何使用MATLAB读取标准心电数据库MIT-BIH中的212格式ECG数据,并进行下采样操作。MIT-BIH数据库是国际公认的心律失常研究的标准数据集,适用于算法建模分析。文章提供了包含详细注释的源码,附带了MITBIH数据实验包下载。
摘要由CSDN通过智能技术生成

MIT-BIH 是由美国麻省理工学院提供的研究心律失常的数据库。目前国际上公认的可作为标准的心电数据库有三个,分别是美国麻省理工学院提供的MIT-BIH 数据库,美国心脏学会的AHA数据库以及欧洲ST-T心电数据库。这些数据库广泛用于相关行业的算法建模中基础数据的分析。MIT-BIH 官方链接如下:

https://www.physionet.org/​www.physionet.org

废话不多说,看源码,里面附带有详细注释:

clear all
clc
%------ SPECIFY DATA ------------------------------------------------------
% 指定数据的储存路径
PATH= 'E:Code SourceMATLAB work spaceMITBIH analysisdata draw104';
% .hea 格式,头文件,可用记事本打开
HEADERFILE= '104.hea'; 
% .atr 格式,属性文件,数据格式为二进制数
ATRFILE= '104.atr'; 
% .dat 格式,ECG 数据
DATAFILE='104.dat';
% 指定需要读入的样本数
% 若.dat文件中存储有两个通道的信号:
% 则读入 2*SAMPLES2READ 个数据
SAMPLES2READ=7200; 
%------ 读入头文件数据 -----------------------------------------------------
%
% 示例:用记事本打开的117.hea 文件的数据
%
% 117 2 360 650000
% 117.dat 212 200 11 1024 839 31170 0 MLII
% 117.dat 212 200 11 1024 930 28083 0 V2
% # 69 M 950 654 x2
% # None
%
%-------------------------------------------------------------------------
% 在Matlab命令行窗口提示当前工作状态
fprintf(1,'n WORKING ON %s n', HEADERFILE); 
% 【注】函数 fprintf 的功能将格式化的数据写入到指定文件中。
% 表达式:count = fprintf(fid,format,A,…)
% 在字符串’format’的控制下,将矩阵A的实数数据进行格式化,并写入到文件对象fid中。该函数返回所写入数据的字节数 count。
% fid 是通过函数 fopen 获得的整型文件标识符。fid=1,表示标准输出(即输出到屏幕显示);fid=2,表示标准偏差。

% 通过函数 fullfile 获得头文件的完整路径
signalh= fullfile(PATH, HEADERFILE); 
% 打开头文件,其标识符为 fid1 ,属性为’r’–“只读”
fid1=fopen(signalh,'r'); 
% 读取头文件的第一行数据,字符串格式
z= fgetl(fid1); 
% 按照格式 ‘%*s %d %d %d’ 转换数据并存入矩阵 A 中
A= sscanf(z, '%*s %d %d %d',[1,3]); 
nosig= A(1);         % 信号通道数目
sfreq= A(2);         % 数据采样频率
fprintf(1,'n nosig(信号通道数目) = %d, sfreq(采样频率) = %dHZn', nosig,sfreq); 

clear A;             % 清空矩阵 A ,准备获取下一行数据
for k=1:nosig        % 读取每个通道信号的数据信息
z= fgetl(fid1);      % 读取下一行文件
A= sscanf(z, '%*s %d %d %d %d %d',[1,5]);
dformat(k)= A(1);    % 信号格式; 这里只允许为 212 格式
gain(k)= A(2);       % 每 mV 包含的整数个数
bitres(k)= A(3);     % 采样精度(位分辨率)
zerovalue(k)= A(4);  % ECG 信号零点相应的整数值
firstvalue(k)= A(5); % 信号的第一个整数值 (用于偏差测试)
fprintf(1,'n通道%d dformat(信号格式)=%d,gain(1mV)=%d,bitres(采样精度)=%d,zerovalue(零点偏置)=%dn',k,dformat(k),gain(k),bitres(k),zerovalue(k)); 
end
fclose(fid1);
clear A;

%------ LOAD BINARY DATA --------------------------------------------------
%------ 读取 ECG 信号二值数据 ----------------------------------------------
%
if dformat~= [212,212]
    error('this script does not apply binary formats different to 212.'); 
end
% 获取完整的路径
signald= fullfile(PATH, DATAFILE); 
% 读入 212 格式的 ECG 信号数据
fid2=fopen(signald,'r');
% matrix with 3 rows, each 8 bits long, = 212bit
A= fread(fid2, [3, SAMPLES2READ], 'uint8')'; 
fclose(fid2);
% 通过一系列的移位(bitshift)、位与(bitand)运算,将信号由二值数据转换为十进制数
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('inconsistency in the first bit values'); 
end
switch nosig
    case 2
        M( : , 1)= (M( : , 1)- zerovalue(1))/gain(1);
        M( : , 2)= (M( : , 2)- zerovalue(2))/gain(2);
        TIME=(0:(SAMPLES2READ-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*(SAMPLES2READ)-1)/sfreq;
    otherwise % this case did not appear up to now!
        % here M has to be sorted!!!
        disp('Sorting algorithm for more than 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); % attribute file with annotation data
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
        % nothing to do!
        elseif annoth==61
        % nothing to do!
        elseif annoth==62
        % nothing to do!
        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
ANNOT(length(ANNOT))=[]; % last line = EOF (=0)
ATRTIME(length(ATRTIME))=[]; % last line = EOF
clear A;
ATRTIME= (cumsum(ATRTIME))/sfreq;
ind= find(ATRTIME <= TIME(end));
ATRTIMED= ATRTIME(ind);
ANNOT=round(ANNOT);
ANNOTD= ANNOT(ind);
fprintf(1,'n LOAD ATTRIBUTES DATA FINISHED n');

%------ DISPLAY DATA ------------------------------------------------------
%使用figure1
figure(1); 
%绘制通道1的图,一般用第一通道数据做分析
plot(TIME, M(:,1),'b');
%第二通道咋一看是经过滤波处理后的数据
if nosig==2
    hold on
    plot(TIME, M(:,2),'r');
end
for k=1:length(ATRTIMED)
    text(ATRTIMED(k),0,num2str(ANNOTD(k)));
end
%限制X轴数据
xlim([TIME(1), TIME(end)]);
xlabel('Time / s'); 
ylabel('MLII导联 / mV');
string=['MIT心律失常ECG原始signal ',DATAFILE];
title(string);
fprintf(1,'ALL FINISHED n');

e63cd6962fca67b451b16f346a6e4af7.png
104波形演示

其中,MITBIH data实验数据包大家可以在文章附件中下载,希望对正在学习的小伙伴有所帮助。

附件:

zhimg_answer_editor_file_zip.svg
MITBIH data.rar
66.4M
·
百度网盘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值