PhysioNet UCDDB 使用MATLAB读取数据

1、前言

最近正在研究Apnea,主要利用PhysioNet的数据库。想在CSDN上找到一点关于PhysioNet数据的读取,发现基本没有教程。所以,就想写下自己的读取PhysioNet的UCDDB数据库的过程。主要涉及碰到的一些错误以及解决方法,方便自己记录学习过程的同时也能为其他人做类似研究提供一些微薄的经验。

2、UCDDB数据读取

首先,粗略看一下UCDDB数据的主要有哪些?下面的图片来自链接[UCDDB数据库]的网页截图。

                                                         

                                                                               图1:数据样本示例

每个subject有四个文件,以ucddb002为例,ucddb002.rec是PSG数据,EDF format。ucddb002_lifecard.edf是三通道的ECG数据,EDF format。ucddb002_respevt.txt是标注文件,标注一些呼吸事件的发生,阻塞性(obstructive),中枢性(central),混合型(mixed)呼吸暂停(apneas)或者呼吸低通气(hypopneas)和周期性呼吸发作(periodic breathing episodes)。ucddb002_stage.txt也是标注文件,根据标准的 Rechtschaffen and Kales rules做的睡眠阶段(sleep stages)标注。下面两张图给出标注的内容,图片来自链接[UCDDB数据库]的网页截图。

                    

                                 图2:ucddbxxx_respevt.txt                                                            图3:ucddbxxx_stage.txt

2.1. 使用EDFbrowser打开.rec文件

标注文件都是txt格式的,直接可以读取的。但是,另外两个数据文件,EDF格式的,需要借助一些软件来查看与获取数据。于是,我去网上找了一下有哪些软件可以打开EDF文件,发现了一个叫做EDFbrowser的软件,下载地址[EDFbrowser下载]。

下面是我使用EDFbrowser打开.rec文件的几个截图。打开软件后,选择open,选择ucddb002.rec文件,会出现图4,有很多生理信号,你可以选择一个进行查看。这里,我选择ECG信号,并点击Add signals。添加之后,就会出现图5的情况。

                                             

                                                                        图4:EDFbrowser打开.rec文件示例

                       

                                                                                           图5:ECG信号图示1

图5是一条直线,ECG信号肯定不是直线。所以,应该是需要调整图中的刻度值。点击信号上的ECG黄色字,就可以设置刻度值了。我这里调整Ampl那一栏,将原先的100调整到4,这样就能看出来ECG信号的波形了。

 

                                                                           图6:调整幅值以及调整后的图像

让咱们看看这个软件能不能导出TXT格式的数据。点击菜单栏Tools,发现可以将EDF转成ASCII(CSV),如图7所示,这个选项应该能导出文本数据,所以,尝试了一下。最后,一个EDF格式文件会生成四个TXT文件,如图8所示。一共生成了四个文件,annotations文件是标注文件,但并不是具体的标注,只是说明有哪些标注,右侧是截图,。header文件是一些基本属性文件,signals主要说明有哪些信号,这些文件都是一些说明文件。data文件就是数据文件了。但需要注意一下,这里导出的全部信号,不是单个信号。

所以,EDFbrowser是一个适合查看与对比信号的软件,不适合导出TXT文件,因为导出的TXT文件还是要分离,才能获取到你想要的数据。

                                                  

                                                                                   图7 Tools选项截图

                                

                                                                                图8:EDF转ASCII生成文件

打开data文件,如图9所示。第一列是时间,后面是1-14列,最后的数据是5hz-75hz,一秒钟越有70个数据点。

 

                                                                            图9:data文件截图

2.2. 使用PhysioNet提供的Matlab工具包读取.edf文件

还有一个数据文件,.edf文件,但是这个文件不能使用刚刚的方法打开,因为它报错了,如图10所示。所以就只能使用PhysioNet提供的工具了,在这里我使用的是Matlab上的工具包,详情见地址:https://physionet.org/physiotools/matlab/wfdb-app-matlab/。这里说一下为什么不使用Python工具包,因为Python工具包只支持MIT WFDB format,见图11的网页截图。

                                             

                                                             图10:使用EDFBrowser打开.edf文件出错

             

                                                             图11:Python工具包只支持MIT WFDB format

由UCDDB的说明,.edf文件是三个通道的ECG信号,V5,CC5,VR5,所以我们在读取完之后可以获得三个通道的数据。根据工具包说明,我们可以通过以下代码获得数据。

[signal, Fs, tm] = rdsamp('ucddb002_lifecard.edf');

在Matlab中运行这行代码后,可以在工作区中看到我们想要的数据。Fs是采样频率,128Hz。signal是数据,从图12中可以看到,有三列数据,对应三个通道。tm是采样时间点。

                                                                                                                      图12: Matlab读取数据截图  

 读取完之后,可以再通过Matlab将这些数据写入到TXT文件中,方便我们后续的处理。

2.3. 使用PhysioNet提供的Matlab工具包读取.rec文件

为了快速将所有数据文件生成TXT格式,我们同样使用Matlab读取.rec文件。ECG信号在第六个通道,所以可以通过下面的一行代码完成ECG信号的提取。

[signal, Fs, tm] = rdsamp('ucddb002.rec',[6]);

3. 提取UCDDB数据库中的所有ECG信号

现在我们使用下面的代码就可以把UCDDB数据库中的所有ECG数据提取出来,如有错误,请留言告知

% 所有文件名集合
filename_set = [
    'ucddb002'; 'ucddb003'; 'ucddb005'; 'ucddb006'; 'ucddb007'; 'ucddb008'; 'ucddb009'; 'ucddb010';'ucddb011';'ucddb012'; 
     'ucddb013'; 'ucddb014'; 'ucddb015'; 'ucddb017'; 'ucddb018'; 'ucddb019'; 'ucddb020';'ucddb021'; 'ucddb022'; 'ucddb023';
    'ucddb024'; 'ucddb025'; 'ucddb026'; 'ucddb027'; 'ucddb028'
    ];

% 读取ECG信号并保存至TXT文本
for index = 1:25
    info = [filename_set(index, :), 'start....'];
    disp(info);
    % 读取.rec文件
    filename = [filename_set(index, :), '.rec'];
    [signal] = rdsamp(filename,[6]);
    % 将signal写入TXT文件
    file_path = ['TXT文件/', filename_set(index, :), '_V2.txt'];
    f_id = fopen(file_path, 'w');
    len = numel(signal);
    for i=1:len
        fprintf(f_id, '%f\r\n', signal(i)); 
    end
    fclose(f_id);
    
    % 读取.edf文件
    filename = [filename_set(index, :), '_lifecard.edf'];
    [signal] = rdsamp(filename);
    % 将signal写入TXT文件
    for j=1:3
        switch(j)
            case 1
                file_path = ['TXT文件/', filename_set(index, :), '_V5.txt'];
                f_id = fopen(file_path, 'w');
                len = numel(signal(:, 1));
                for i=1:len
                    fprintf(f_id, '%f\r\n', signal(i, 1)); 
                end
                fclose(f_id);
            case 2
                file_path = ['TXT文件/', filename_set(index, :), '_CC5.txt'];
                f_id = fopen(file_path, 'w');
                len = numel(signal(:, 2));
                for i=1:len
                    fprintf(f_id, '%f\r\n', signal(i, 2)); 
                end
                fclose(f_id);
            case 3
               file_path = ['TXT文件/', filename_set(index, :), '_V5R.txt'];
                f_id = fopen(file_path, 'w');
                len = numel(signal(:, 3));
                for i=1:len
                    fprintf(f_id, '%f\r\n', signal(i, 3)); 
                end
                fclose(f_id);
        end        
    end 
    info = [filename_set(index, :), 'end....'];
    disp(info);
end

 

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值