本篇将介绍如何利用WFDB工具包,进行MIT-BIH数据库读取。实测有效~
一、WFDB软件包下载
1、打开浏览器,输入:
https://physionet.org/physiotools/matlab/wfdb-app-matlab/wfdb-app-toolbox-0-10-0.zip
下载WFDB工具箱(wfdb-app-toolbox)
2、将下载好的压缩文件,解压至Matlab安装路径下的toolbox路径里。
(我的路径为:D:\Program Files\MATLAB\R2022b\toolbox)。
二、WFDB-Demo示例演示
1、打开Matlab软件,设置路径为:D:\Program Files\MATLAB\R2022b\toolbox\wfdb-app-toolbox-0-10-0\mcode。
2、命令行窗口,输入wfdbdemo,运行。
wfdbdemo
至此,说明你的WFDB工具箱下载没问题。
下面,我们使用该工具箱,来读取MIT-BIH Arrhythmia Database数据库的数据记录。
三、WFDB-Matlab代码读取数据
1、Matlab代码
clc;
clear;
[signal,Fs,tm]=rdsamp('mitdb/100',[],10000);
%% 绘图区域
figure(1)
plot(tm, signal(1:10000,1));
title('ECG Signal (Channel 1)');
xlabel('Time (s)');
ylabel('Amplitude (mV)');
figure(2)
plot(tm, signal(1:10000,2));
title('ECG Signal (Channel 2)');
xlabel('Time (s)');
ylabel('Amplitude (mV)');
%% 读取注释信息
[ann,type,subtype,chan,num]=rdann('mitdb/100','atr', [],[],[],'N');
% 绘制信号图形
figure(3);
plot(tm, signal(:, 1));
title('ECG Signal with Annotations (Channel 1)');
xlabel('Time (s)');
ylabel('Amplitude (mV)');
grid on;
% 将注释和对应的类型标注在图像中
for i = 1:length(ann)
% 将注释的时间转换为图形的x轴位置
ann_x = ann(i) / Fs;
% 检查ann(i)是否在signal的索引范围内
if ann(i) <= length(signal)
% 根据注释类型选择不同的标记符号
switch type(i)
case 'N'
marker = 'o'; % 正常心跳,圆圈标记
case 'S'
marker = 's'; % 窦性心跳,方块标记
case 'V'
marker = 'v'; % 室性心跳,三角形标记
case 'F'
marker = '^'; % 房性心跳,上三角标记
case 'I'
marker = 'd'; % 交界性心跳,菱形标记
otherwise
marker = 'x'; % 其他类型,叉号标记
end
% 在信号图上标注注释
hold on;
% 分开传递标记符号和颜色参数
plot(ann_x, signal(ann(i), 1), marker, 'Color', 'r', 'MarkerSize', 10, 'LineWidth', 2);
% 添加文本注释,只显示类型
text(ann_x, signal(ann(i), 1), type(i), ...
'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'right');
hold off;
end
end
2、运行结果
上述代码中
[signal,Fs,tm]=rdsamp('mitdb/100',[],10000);
% signal:一个矩阵,其中每一行代表一个时间点,每一列代表一个通道的信号值。
% Fs:采样频率,表示信号的采样率,单位是Hz。
% tm:时间向量,与signal中的每一列对应,表示每个样本的时间点。
% mitdb/100(或100):MIT-BIH Arrhythmia Database数据库中的100号记录。
% 10000:读取记录前10000个采样点数。
(同理,可以将mitdb/100替换为:bidmc/bidmc01等数据,即可读取对应数据库记录)。
以上,即利用读取100号记录的通道1和2的前10000个点数据。
[ann,type,subtype,chan,num]=rdann('mitdb/100','atr', [],[],[],'N');
% 这行代码读取记录号为100的注释信息,这些注释信息存储在.atr文件中。
% ann:一个向量,包含注释的样本索引。
% type:一个字符串数组,包含每个注释的类型(例如'N'表示正常心跳)。
% subtype:一个字符串数组,包含每个注释的子类型(如果有的话)。
% chan:一个向量,包含每个注释对应的通道编号。
% num:一个字符串数组,包含每个注释的额外信息(如果有的话)。
以上,将前10000个数据中的心律失常(N)类型标记在时间索引上。
根据matlab工作区结果,可以看到ann(注释的样本索引)数目、type(心律失常类型)与官网
(MIT-BIH Arrhythmia Database Directory (Tables) )给定的数目一致。
四、纯Matlab代码读取数据
1、打开浏览器,输入:
https://physionet.org/static/published-projects/mitdb/mit-bih-arrhythmia-database-1.0.0.zip
下载数据。
2、Matlab代码
clc; % 清除命令窗口
clear; % 清除工作空间的所有变量
close all; % 关闭所有图形窗口
%------ 指定数据 ------------------------------------------------------
PATH = 'D:\Program Files\MATLAB\R2022b\toolbox\wfdb-app-toolbox-0-10-0\mit-bih-arrhythmia-database-1.0.0\mit-bih-arrhythmia-database-1.0.0'; % 数据保存路径
HEADERFILE = '100.hea'; % 文本格式的头文件
ATRFILE = '100.atr'; % 二进制格式的属性文件
DATAFILE = '100.dat'; % 数据文件
SAMPLES2READ = 650000; % 要读取的样本数量
%------ 加载二进制数据 --------------------------------------------------
signald = fullfile(PATH, DATAFILE); % 数据文件路径
fid2 = fopen(signald, 'r'); % 以只读模式打开文件
A = fread(fid2, [3, SAMPLES2READ], 'uint8')'; % 读取3行,每行8位的数据,转换为2*12位的矩阵
fclose(fid2); % 关闭文件
M2H = bitshift(A(:,2), -4); % 将第二列数据向右移动4位,得到高四位
M1H = bitand(A(:,2), 15); % 对第二列数据进行位与操作,得到低四位
M(:, 1) = bitshift(M1H, 8) + A(:,1); % 将低四位向左移动8位,与第一列数据相加,得到第一个通道的数据
M(:, 2) = bitshift(M2H, 8) + A(:,3); % 将高四位向左移动8位,与第三列数据相加,得到第二个通道的数据
M = (M - 1024) / 200; % 对数据进行归一化处理
%至此,两个通道的数据保存在数组M中
%------ 绘制数据 ------------------------------------------------------
figure(1)
plot(M(1:5000,1)); % 绘制第一个通道的前5000个数据点
title('Channel 1'); % 设置标题
xlabel('Sample numbers/N'); % 设置x轴标签
ylabel('Amplitude/mv'); % 设置y轴标签
figure(2)
plot(M(1:5000,2)); % 绘制第二个通道的前5000个数据点
title('Channel 2'); % 设置标题
xlabel('Sample numbers/N'); % 设置x轴标签
ylabel('Amplitude/mv'); % 设置y轴标签
Tips:下一讲,我们将进入第二章的内容:心电信号的基本概念,包括:心电信号中的形成机制与常见噪声。
以上就是WFDB工具包与MIT-BIH数据库读取的全部内容啦~
我们下期再见,拜拜(⭐v⭐) ~
(Ps:有代码实现需求,请见主页信息,谢谢支持!~)