zoukankan      html  css  js  c++  java
  • ECG心电图数据1

    最近在写一篇基于小波变换的ECG信号压缩算法的论文,遇到了怎样获取ECG信号测试数据的问题,在百度和专业论坛里搜索了一番,发现也有很多朋友为此发愁。现在论文写好了,投稿中,顺便也把怎样获取和处理ECG信号数据的方法写出来,供有需要的朋友参考,省却在百度和论坛里苦苦求索的麻烦,呵呵 ^_^

    一、首先,如果是对ECG心电信号进行观察、分析和诊断使用的话,有两个方法:

    (1)    从MIT-BIH数据库下载
    请参考我前些天发布的文章《MIT-BIH ECG 心电数据的下载和读取图解》,里面有详尽介绍。

    http://blog.csdn.net/chenyusiyuan/archive/2008/01/06/2027887.aspx

    (2)    用专门的Matlab心电数据读取程序
    我10日在浩惠电子论坛(http://www.hheet.com/bbs/)的“医疗器械”版块找到了读取ECG心电数据的Matlab程序(rddata.m),如获至宝啊!这个程序是由外国人写的,能够读取MIT-BIH数据库 .atr、.dat、.hea三种文件的数据,根据这些数据计算出实际的心电信号值,并绘制出信号波形。程序不大,注释也算齐全,不过是英文的,需要这个程序的朋友请按以下链接下载。

    http://download.csdn.net/source/3383369


    二、如果是要对ECG信号进行压缩、编码等信号处理操作

    上面程序获得的数据就不便于使用了,因为那是转换为具有实际意义的心电数据,信号数据值一般在-2~2之间,单位是mV。那么,要找新的ECG读取程序来获取数据吗?不用!实际上,程序rddata.m中本身就是把MIT .dat 文件中存储的二值数据转换为十进制数据,然后再进一步处理转换成具有实际意义的心电信号值。我们进行信号处理时,需要用到的就是从二值数据转换来的初始十进制数据,由于 .dat文件中是三个字节存储2个数,即每个数12bits,转换后得到的十进制数范围应该是0~2048。我所理解的数据存储方式图示如下,不知是否正确,仅供参考:



    由于rddata.m程序中的注释是英文的,且有些地方也说明不清楚,我从程序中截取出将二值数据转换为十进制数据的部分代码,将注释转换为中文,并根据自己的理解作一些补充说明,希望对大家有所帮助!

    具体的程序代码如下:

    %-------------------------------------------------------------------------
    % 程序Fun_ReadECGData 用于读取ECG信号数据,将原始的二值数据转换为十进制数
    % 输入参数及其示例:
    % PATH= 'D:/MATLAB/R2007b/work/ECG Data'; % 指定数据的储存路径
    % HEADERFILE= '117.hea';      % .hea 格式,头文件,可用记事本打开
    % DATAFILE='117.dat';         % .dat 格式,ECG 数据
    % SAMPLES2READ=2048;          % 指定需要读入的样本数
    %                             % 若.dat文件中存储有两个通道的信号:
    %                             % 则读入 2*SAMPLES2READ 个数据 
    % 输出参数:M —— 一个SAMPLES2READ行2列的数据矩阵,每列数据代表一个通道的信号值
    %-------------------------------------------------------------------------
                                
    function M = Fun_ReadECGData(PATH,HEADERFILE,DATAFILE,SAMPLES2READ)

    %------ LOAD HEADER DATA --------------------------------------------------
    %------ 读入头文件数据 -----------------------------------------------------
    %
    % 示例:用记事本打开的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
    %
    %-------------------------------------------------------------------------


    %-------------------------------------------------------------------------
    % 【注】函数 fprintf 的功能将格式化的数据写入到指定文件中。
    % 表达式:count = fprintf(fid,format,A,...)
    % 在字符串'format'的控制下,将矩阵A的实数数据进行格式化,并写入到文件对象fid中。该函数返回所写入数据的字节数 count。
    % fid 是通过函数 fopen 获得的整型文件标识符。fid=1,表示标准输出(即输出到屏幕显示);fid=2,表示标准偏差。
    %-------------------------------------------------------------------------

    fprintf(1,'//n$> WORKING ON %s .../n', HEADERFILE);   % 在Matlab命令行窗口提示当前工作状态
    signalh= fullfile(PATH, HEADERFILE);                           % 通过函数 fullfile 获得头文件的完整路径
    fid1=fopen(signalh,'r');                            % 打开头文件,其标识符为 fid1 ,属性为'r'--“只读”
    z= fgetl(fid1);                                        % 读取头文件的第一行数据,字符串格式
    A= sscanf(z, '%*s %d %d %d',[1,3]);      % 按照格式 '%*s %d %d %d' 转换数据并存入矩阵 A 中
    nosig= A(1);                                         % 信号通道数目
    sfreq=A(2);                                           % 数据采样频率
    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);                               % 信号的第一个整数值 (用于偏差测试)
    end;
    fclose(fid1);
    clear A;

    %------ LOAD BINARY DATA --------------------------------------------------
    %------ 读取 ECG 信号二值数据 ----------------------------------------------
    %
    % 说明:.dat 文件的数据格式
    %
    %      用 uint8 格式读入 N 个样本,存入矩阵 A 中,则 A 有 N 行、3列,每列一个字节,
    %      即每行用三个字节表示两个数m1、m2,每个数 12 bits,故又称为 212 格式
    %      m1的低8位存放在 A(:,1),m2的低8位存放在A(:,3),
    %      m1的高4位存放在A(:,2)的低4位,m2的高4位存放在A(:,2)的高4位
    %      
    % 根据上述数据格式,可以用一系列移位、位与操作,提取出十进制格式的双通道信号数据
    %
    %-------------------------------------------------------------------------

    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');
    A= fread(fid2, [3, SAMPLES2READ], 'uint8')';      % 矩阵A共有SAMPLES2READ行、3列,每列数据都是以uint8格式读入,注意这时数据通过uint8的读入方式已经成为十进制数了
    fclose(fid2);
    M2H= bitshift(A(:,2), -4);                          % 字节向右移四位,即取字节的高四位,属于信号2的高4位
    M1H= bitand(A(:,2), 15);                          % 取字节的低四位,属于信号1的高4位
    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;       % 将M1H、M2H分别左移8位,即乘以2^8,再分别加上A(:,1),A(:,2),
    M( : , 2)= bitshift(M2H,8)+ A(:,3)-PRR;      % 由于左移时把符号位也移动了,要减去符号位的值
    M=M';            % 为了方便后期的数据处理,将输出矩阵 M 转置为2行SAMPLES2READ列

  • 相关阅读:
    贪婪大陆
    色板游戏
    11/29 NOIP 模拟赛
    USACO4.4 重叠的图像 Frame Up
    CSP2020 题解
    NOIP前板子复习
    关于我
    【洛谷】【搜索+字符串】
    【洛谷】【动态规划/01背包】P2925 [USACO08DEC]干草出售Hay For Sale
    【洛谷】【二分查找】P1102 A−B数对
  • 原文地址:https://www.cnblogs.com/alexanderkun/p/4044333.html
Copyright © 2011-2022 走看看