1. 程式人生 > >MIT-BIH資料庫ECG心電圖資料處理畫圖與心率計算(附詳細註釋)

MIT-BIH資料庫ECG心電圖資料處理畫圖與心率計算(附詳細註釋)

本文程式碼依據rddata.m檔案編寫,關於資料結構的格式、意義,我在理解後都寫在註釋裡了,有需要的朋友可以認真看一下。歡迎交流。本文處理的資料是MIT-BIH資料庫100.hea和100.dat檔案,利用的是matlab工具。
%檔名稱  :  ECG_Plot
%實現功能  :  讀取MIT-BIH-DB檔案,讀取訊號,對訊號加噪聲,並利用濾波器去噪,並
%             實現影象輸出。
%參考資料  :  rddata.m    Author-Robert Tratnig 
%作者資訊  :  171848-張冰
%             [email protected]
%             
%修訂時間  :  2018年3月27日17點03分
%呼叫格式  :  無
%引數釋義  :  無

clc;clear all;

PATH= '';
HEADERFILE= '100.hea';
ATRFILE= '100.atr';
DATAFILE='100.dat';

%=========================對100.dat檔案資料的處理=========================%
%.hea檔案儲存了ECG的基本資訊
% 通過函式 fullfile 獲得標頭檔案的完整路徑
signalh= fullfile(PATH, HEADERFILE);
% 開啟標頭檔案,其識別符號為 fid1 ,屬性為'r'--“只讀”
fid1=fopen(signalh,'r');
% 讀取標頭檔案的第一行資料,字串格式
z= fgetl(fid1);
% 按照格式 '%*s %d %d %d' 轉換資料並存入矩陣 A 中
A= sscanf(z, '%*s %d %d %d',[1,3]);

nosig= A(1);    % 訊號通道數目
sfreq=A(2);     % 資料取樣頻率
SAMPLES2READ = 10*sfreq;    %取十秒資料

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;

%=========================對100.dat檔案資料的處理=========================%
%.dat檔案的資料格式讀取為每行三個位元組,即三個八位的二進位制數字,其內容含義為
%      0000 0000  ||             0000 0000              ||  0000 0000
%sign1(L)低八位資訊||左四位sign2(R)資訊,右四位sign1(L)資訊||sign2(R)低八位資訊
%將第二位元組的資訊處理後,後四位移至第一位元組最左位即得到完整的sign1
%將第二位元組的資訊處理後,前四位移至第一位元組最左位即得到完整的sign2.
signald = fullfile(PATH , DATAFILE);
fid2 = fopen(signald,'r');
A= fread(fid2, [3, SAMPLES2READ], 'uint8')';
fclose(fid2);

%對第二位元組做左位移運算,位移距離-4
%得到第二位元組左四位,即sign2的高四位,包括符號位,右高資訊
M_R_H = bitshift(A(:,2), -4);
%對第二位元組和1111做與運算,
%保留第二位元組右四位,即sign1的低四位,包括符號位,左高資訊
M_L_H = bitand(A(:,2), 15);
%對第二位元組和1000做與運算,
%保留第二位元組右邊第四位,獲取sign2符號位,並向左位移九位,與整體sign1進行運算
PRL=bitshift(bitand(A(:,2),8),9); 
%對第二位元組和10000000做與運算,
%保留第二位元組右邊第四位,獲取sign1符號位,並向左位移5位,與整體sign2進行運算
PRR=bitshift(bitand(A(:,2),128),5);

%M矩陣為sign1,2的儲存矩陣,儲存100.dat處理後資料
%將sign1(L)高位移至sign1低位前(A(:,1))
%將sign2(R)高位移至sign2低位前(A(:,3))
%最後將訊號符號位資訊去掉
M( : , 1)= bitshift(M_L_H,8)+ A(:,1)-PRL;
M( : , 2)= bitshift(M_R_H,8)+ A(:,3)-PRR;

%將sign的數值與零點做減法得到正負值
%再將得到的具有正負性的值與每mV的整數值相除,即得到電壓多少mV
M( : , 1)= (M( : , 1)- zerovalue(1))/gain(1);
M( : , 2)= (M( : , 2)- zerovalue(2))/gain(2);
%將我們設定的取樣個數除以頻率即得到這段樣品的測定時間。
TIME =(0:(SAMPLES2READ-1))/sfreq;
%釋放變數
clear A M_R_H M_L_H PRR PRL;

%===============================給訊號加白噪聲=============================%
%SNR 信噪比。訊號功率與噪聲功率的比值,不過一般取對數。即SNR=10*lg(A/B)。
%因為將倍數關係轉換為指數關係,所以設定分貝為單位。這裡加2%噪聲
SNR=10*log(100/2);
%利用matlab中的awgn函式給訊號加噪聲
Mwgn = awgn(M,SNR);

%==============================設計濾波器並濾波============================%
%三角濾波器
M_filter1 = [0,1,2,3,2,1,0];
%梯形濾波器
M_filter2 = [0,1,1,1,1,1,0];
%利用filter函式,將sign1進行與三角濾波器濾波並作平均,得到新的訊號值
Mflt(:,1) = filter(M_filter1,1,M(:,1) )/sum(M_filter1);
%利用conv2函式,將sign2進行與梯形濾波器濾波器做卷積,作平均,得到新的訊號值
%M_filter2需要旋轉180度,即做一次轉置
%效果與filter函式相同,這裡只是試一下不同的方法。
Mflt(:,2) = conv2(Mwgn(:,2) , M_filter2','same')/sum(M_filter2);

%=================================計算心率================================%
%觀察R值在0.5以上,並且在R值前後函式單調,所以在0.5範圍以上尋找極值確定R點位置
[R_V,R_L]=findpeaks(M(:,1),'minpeakheight',0.5);
%根據位置和取樣頻率來計算取樣區間內的平均心率
H_Rate = 60*(length(R_L)-1)/((R_L(length(R_L))-R_L(1))/sfreq);
%算出取樣的時間區間
R_Time = R_L(length(R_L))/sfreq;
%列印結果
disp('**********************診斷資訊**********************')
disp('**                                                **')
disp(['**','  該位測試物件在',num2str(R_Time,3),'秒內,的平均心率是:  '...
    num2str(H_Rate,3),'下  ','**']);
disp('**                                                **')
disp('**********************祝您健康**********************')

%===================================畫圖==================================%
%畫2個訊號在原圖/加噪聲(wgn)/濾波後(flt)的影象-----依次從上到下
%左列位訊號1,右列為訊號2
figure('NumberTitle', 'off', 'Name', 'ECG作圖');
clf, box on, hold on;
%因為影象較大較多,這裡讓畫圖面板最大化
set(gcf,'Position',get(0,'ScreenSize'))
%分配3*2的畫圖區間
s(1) = subplot(3,2,1);
s(2) = subplot(3,2,2);
s(3) = subplot(3,2,3);
s(4) = subplot(3,2,4);
s(5) = subplot(3,2,5);
s(6) = subplot(3,2,6);
string=['ECG signal ',DATAFILE];
%原圖
plot(s(1),TIME, M(:,1),'r');title(s(1),[string,' MLII']);
xlabel(s(1),'Time / s'); ylabel(s(1),'Voltage / mV');
plot(s(2),TIME, M(:,2),'b');title(s(2),[string,' V5']);
xlabel(s(2),'Time / s'); ylabel(s(2),'Voltage / mV');
%加噪聲圖(wgn)
plot(s(3),TIME, Mwgn(:,1),'r');title(s(3),[string,' MLII wgn']);
xlabel(s(3),'Time / s'); ylabel(s(3),'Voltage / mV');
plot(s(4),TIME, Mwgn(:,2),'b');title(s(4),[string,' V5 wgn']);
xlabel(s(4),'Time / s'); ylabel(s(4),'Voltage / mV');
%濾波後圖(flt)
%直接濾波原資料的圖
plot(s(5),TIME, Mflt(:,1),'r');title(s(5),[string,' MLII flt']);
xlabel(s(5),'Time / s'); ylabel(s(5),'Voltage / mV');
%濾波加噪聲後的圖
plot(s(6),TIME, Mflt(:,2),'b');title(s(6),[string,' V5 wgn flt']);
xlabel(s(6),'Time / s'); ylabel(s(6),'Voltage / mV');
%畫出兩個濾波器的形狀圖
figure('NumberTitle', 'off', 'Name', '濾波器');
clf, box on, hold on;
f(1) = subplot(2,1,1);
f(2) = subplot(2,1,2);
plot(f(1),M_filter1,'r');title(f(1),'三角濾波器');
plot(f(2),M_filter2,'b');title(f(2),'梯形濾波器');


結果如圖:figure1:心電圖figure2:濾波器圖figure3:心率計算圖及對應程式碼。

相關推薦

MIT-BIH資料庫ECG心電圖資料處理畫圖心率計算詳細註釋

本文程式碼依據rddata.m檔案編寫,關於資料結構的格式、意義,我在理解後都寫在註釋裡了,有需要的朋友可以認真看一下。歡迎交流。本文處理的資料是MIT-BIH資料庫100.hea和100.dat檔案,利用的是matlab工具。%檔名稱 : ECG_Plot %實現功能

mysql資料庫的日期資料處理 date_formatstr_to_date的使用細節

首先建立一個簡單的資料表,表名testDateFunction,表結構如下所示 +-------+---------+------+-----+---------+----------------+

用SQLAlchemy例項物件來進行資料庫表中資料的增刪改查操作db.session.xx

#encoding:utf-8 from flask import Flask from flask_sqlalchemy import SQLAlchemy import config app = Flask(__name__) app.config.from_obje

python中如何遍歷資料夾及其子資料夾中的所有檔案實現程式碼

【時間】2018.10.27 【題目】python中如何遍歷資料夾及其子資料夾中的所有檔案 目錄 概述 概述       本文提供了python中如何遍歷資料夾及其子資料夾中的所有檔案的兩種方法。兩者均返回檔名列表(可以選擇檔名列表或者是包含完整路徑的檔名列

日本大資料應用環境和發展狀況PPT下載

本篇選自野村綜合研究所數字基礎開發部部門經理、高階研究員城田真琴先生近日在“大資料應用中日交流論壇”上所做的題為《日本的大資料應用環境和發展狀況》的演講。 公眾號後臺回覆"181206"即可獲取PPT原文 本篇主要分為四點與大家分享: 日本大資料發

帶你入門Python資料探勘機器學習程式碼、例項

作者:韋瑋來源:Python愛好者社群本文共7800字,建議閱讀10+分鐘。本文結合程式碼例項待

scrapy框架爬取資料入庫詳細介紹

在論壇上看過很多的scrapy資料入庫(mysql)的例子,但是我嘗試之後總是出現一些莫名其妙的錯誤,搞得自己走了很多彎路,於是我將我認為是最簡單易懂的方法和程式碼展示給大家,歡迎大家吐槽1.建立scrapy專案(安裝scrapy框架和mysql資料庫就不在這討論了,論壇上也

python爬取大眾點評網商家資訊以及評價,並將資料儲存到excel表中原始碼及註釋

import requests from bs4 import BeautifulSoup import traceback # 異常處理 import xlwt # 寫入xls表 # Cookie記錄登入資訊,session請求 def get_content(url,he

layui資料庫查詢及資料處理

資料庫資料查詢及返回資料(例): //********************************************************************************** case 'getmess': $page = $_REQUEST['

Mysql資料庫大文字資料處理

資料庫大文字資料處理 目標:把 mp3檔案儲存到資料庫中! 在my.ini中新增如下配置: max_allowed_packet=10485760 1 什麼是大文字資料 所謂大文字資料,就是大的位元組資料,或大的字元資料。標準SQL中提供瞭如下型別來

3-6 用 Pandas 進行資料處理資料清洗視覺化版本:py3

主要內容: 格式轉換 缺失資料 異常資料 資料標準化操作 格式轉換 如Python記錄時間的方式,不能夠直接實現減運算,就需要進行轉換 pandas.to_datetime 缺失資料 忽略缺失資料 直接標記 利用平均值、最常出現值進行填充 異常資料 處

資料處理:獨熱編碼One-Hot Encoding和 LabelEncoder標籤編碼

一、問題由來 在很多機器學習任務中,特徵並不總是連續值,而有可能是分類值。 離散特徵的編碼分為兩種情況:   1、離散特徵的取值之間沒有大小的意義,比如color:[red,blue],那麼就使用one-hot編碼   2、離散特徵的取值有大小的意義,比如size:[

Spark一些常用的資料處理方法-1.RDD計算

在Spark實際應用中,會用到很多數值處理方法,我將一些比較常用的方法寫在這裡,供新手向的學習參考一下。 1.1 讀取檔案至RDD var rdd = sc.textFile("檔案路徑") var rddfromhdfs = sc.textFil

[譯]針對科學資料處理的統計學習教程scikit-learn教程2

翻譯:Tacey Wong 統計學習: 隨著科學實驗資料的迅速增長,機器學習成了一種越來越重要的技術。問題從構建一個預測函式將不同的觀察資料聯絡起來,到將觀測資料分類,或者從未標記資料中學習到一些結構。 本教程將探索機器學習中統計推理的統計學習的使用:將手中的資料做出結論 Scikit-learn 是一

資料演算法-Hadoop/Spark大資料處理技巧》讀書筆記——二次排序

寫在前面: 在做直播的時候有同學問Spark不是用Scala語言作為開發語言麼,的確是的,從網上查資料的話也會看到大把大把的用Scala編寫的Spark程式,但是仔細看就會發現這些用Scala寫的文章

資料演算法-Hadoop/Spark大資料處理技巧》讀書筆記——移動平均

移動平均:對時序序列按週期取其值的平均值,這種運算被稱為移動平均。典型例子是求股票的n天內的平均值。 移動平均的關鍵是如何求這個平均值,可以使用Queue來實現。 public class MovingAverageDriver { public

callable介面配合ExecutorService實現多執行緒處理資料,並接收返回值2018-08-23

/** * @author chenzhen * Created by chenzhen on 2018/8/22. */ @Data public class QuickPullGit implements Callable<ArrayList&l

Apache Pulsar:實時資料處理中訊息、計算和儲存的統一

本文來自於 QCon 北京2018全球開發者大會,作者翟佳,其畢業於中科院計算所,

資料處理之獨熱編碼One-Hot Encoding

比如 sex:[“male”, “female”] country: [‘china’,’USA’,’Japan’] 正常數字量化後: “male”, “female”用0,1表示; ‘china’,’USA’,’Japan’用0,1,2表示。 現

hadoop大資料處理平臺案例

大資料可以說是從搜尋引擎誕生之處就有了,我們熟悉的搜尋引擎,如百度搜索引擎、360搜尋引擎等可以說是大資料技處理技術的最早的也是比較基礎的一種應用。大概在2015年大資料都還不是非常火爆,2015年可以說是大資料的一個分水嶺。隨著網際網路技術的快速發展,大資料也隨之迎來它的發