資源簡介
MATLAB 對ECG原始數(shù)據(jù)(MIT-BIH庫)信號進(jìn)行低通濾波、工頻干擾抑制、線性濾波(基線漂移就正)和簡單的QRS波、R點(diǎn)識別。
代碼片段和文件信息
%%??ECG數(shù)據(jù)庫(MIT-BIH庫)讀取識別QRS波
%有待確認(rèn)(1)(2)的效果哪個更好
clc;
clear;
PATH=?‘E:\MATLAB\ecg數(shù)據(jù)\xdsj‘;??????%指定數(shù)據(jù)的儲存路徑
HEADERFILE=?‘100.hea‘;??????%.hea?格式,頭文件,可用記事本打開
DATAFILE=‘100.dat‘;?????????%.dat?格式,ECG?數(shù)據(jù)
SAMPLES2READ=4*2048;??????????%指定需要讀入的樣本數(shù)若.dat文件中存儲有兩個通道的信號:則讀入?2*SAMPLES2READ?個數(shù)據(jù)?
%頭文件中的信息
fprintf(1‘\\n$>?WORKING?ON?%s?...\n‘?HEADERFILE);???%?在Matlab命令行窗口提示當(dāng)前工作狀態(tài)
signalh=fullfile(PATH?HEADERFILE);???????????????????%?通過函數(shù)?fullfile?獲得頭文件的完整路徑
fid1=fopen(signalh‘r‘);??????????????????????????????%?打開頭文件,其標(biāo)識符為?fid1?,屬性為‘r‘--“只讀”
z=fgetl(fid1);????????????????????????????????????????%?讀取頭文件的第一行數(shù)據(jù),字符串格式
A=sscanf(z?‘%*s?%d?%d?%d‘[13]);????????????????????%?按照格式?‘%*s?%d?%d?%d‘?轉(zhuǎn)換數(shù)據(jù)并存入矩陣?A?中
nosig=?A(1);??????????????????????????????????????????%?信號通道數(shù)目
sfreq=A(2);???????????????????????????????????????????%?數(shù)據(jù)采樣頻率
clear?A;??????????????????????????????????????????????%?清空矩陣?A?,準(zhǔn)備獲取下一行數(shù)據(jù)
for?k=1:nosig?????????????????????????????????????????%?讀取每個通道信號的數(shù)據(jù)信息
????z=?fgetl(fid1);
????A=?sscanf(z?‘%*s?%d?%d?%d?%d?%d‘[15]);
????dformat(k)=?A(1);???????????%?信號格式;?這里只允許為?212?格式
????gain(k)=?A(2);??????????????%?每?mV?包含的整數(shù)個數(shù)
????bitres(k)=?A(3);????????????%?采樣精度(位分辨率)
????zerovalue(k)=?A(4);?????????%?ECG?信號零點(diǎn)相應(yīng)的整數(shù)值
????firstvalue(k)=?A(5);????????%?信號的第一個整數(shù)值?(用于偏差測試)
end;
fclose(fid1);
clear?A;
%讀取data數(shù)據(jù)
if?dformat~=?[212212]?error(‘this?script?does?not?apply?binary?formats?different?to?212.‘);?end;
signald=?fullfile(PATH?DATAFILE);???????????%?讀入?212?格式的?ECG?信號數(shù)據(jù)
fid2=fopen(signald‘r‘);
A=?fread(fid2?[3SAMPLES2READ]?‘uint8‘);??%?matrix?with?3?rows?each?8?bits?long?=?2*12bit?矩陣A共有SAMPLES2READ行、3列,每列數(shù)據(jù)都是以uint8格式讀入,注意這時數(shù)據(jù)通過uint8的讀入方式已經(jīng)成為十進(jìn)制數(shù)了
fclose(fid2);
M2H=?bitshift(A(2:)?-4);????????%?字節(jié)向右移四位,即取字節(jié)的高四位,屬于信號2的高4位
M1H=?bitand(A(2:)?15);??????????%取字節(jié)的低四位
PRL=bitshift(bitand(A(2:)8)9);?????%?sign-bit???取出字節(jié)低四位中最高位,向左移九位??移位?
PRR=bitshift(bitand(A(2:)128)5);???%?sign-bit???取出字節(jié)高四位中最高位,向左移五位
M(?1??:)=?bitshift(M1H8)+?A(?1??:?)-PRL;%?將M1H、M2H分別左移8位,即乘以2^8,再分別加上A(:1),A(:2),
M(?2??:)=?bitshift(M2H8)+?A(?2??:?)-PRR;%?由于左移時把符號位也移動了,要減去符號位的值
%if?M(1:)?~=?firstvalue?error(‘inconsistency?in?the?first?bit?values‘);?end;
%switch?nosig
%case?2
????M(?1??:)=?(M(?1??:)-?zerovalue(1))/gain(1);
????M(?2??:)=?(M(?2??:)-?zerovalue(2))/gain(2);
????TIME=(0:(SAMPLES2READ-1))/sfreq;
%case?1
????%M(?:??1)=?(M(?:??1)-?zerovalue(1));
????%M(?:??2)=?(M(?:??2)-?zerovalue(1));
????%M=M‘;
????%M(1)=[];
????%sM=size(M);
????%sM=sM(2)+1;
????%M(sM)=0;
????%M=M‘;?%?為了方便后期的數(shù)據(jù)處理,將輸出矩陣?M?轉(zhuǎn)置為2行SAMPLES2READ列
????%M=M/gain(1);
????%TIME=(0:2*(SAMPLES2READ)-1)/sfreq;
%otherwise??%?this?case?did?not?appear?up?to?now!
????%?here?M?has?to?be?sorted!!!
????%disp(‘Sorting?algorithm?for?more?than?2?signals?not?programmed?yet!‘);
%end;
clear?A?M1H?M2H?PRR?PRL;
fprintf(1‘\\n$>?LOADING?DATA?FINISHED?\n‘);????%裝載數(shù)據(jù)完成
figure(1);?clf?box?on?hold?on
plot(TIME?M(1:)‘r‘);
%if?nosig==2
%plo
- 上一篇:序列二次規(guī)劃法及matlab代碼
- 下一篇:多智能體一致性問題報告
評論
共有 條評論