「WFDB工具包与MIT-BIH数据库读取——ECG信号处理-第三课」2024年11月13日

本篇将介绍如何利用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:有代码实现需求,请见主页信息,谢谢支持!~)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值