MIT-BIH ECG 訊號的資料讀取方法和Matlab程式

來源:互聯網
上載者:User

 
(20110622:更新程式下載連結)


最近在寫一篇基於小波變換的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列

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.