資源簡介
MATLAB 對ECG原始數據(MIT-BIH庫)信號進行低通濾波、工頻干擾抑制、線性濾波(基線漂移就正)和簡單的QRS波、R點識別。
代碼片段和文件信息
%%??ECG數據庫(MIT-BIH庫)讀取識別QRS波
%有待確認(1)(2)的效果哪個更好
clc;
clear;
PATH=?‘E:\MATLAB\ecg數據\xdsj‘;??????%指定數據的儲存路徑
HEADERFILE=?‘100.hea‘;??????%.hea?格式,頭文件,可用記事本打開
DATAFILE=‘100.dat‘;?????????%.dat?格式,ECG?數據
SAMPLES2READ=4*2048;??????????%指定需要讀入的樣本數若.dat文件中存儲有兩個通道的信號:則讀入?2*SAMPLES2READ?個數據?
%頭文件中的信息
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‘[13]);????????????????????%?按照格式?‘%*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‘[15]);
????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;
%讀取data數據
if?dformat~=?[212212]?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?[3SAMPLES2READ]?‘uint8‘);??%?matrix?with?3?rows?each?8?bits?long?=?2*12bit?矩陣A共有SAMPLES2READ行、3列,每列數據都是以uint8格式讀入,注意這時數據通過uint8的讀入方式已經成為十進制數了
fclose(fid2);
M2H=?bitshift(A(2:)?-4);????????%?字節向右移四位,即取字節的高四位,屬于信號2的高4位
M1H=?bitand(A(2:)?15);??????????%取字節的低四位
PRL=bitshift(bitand(A(2:)8)9);?????%?sign-bit???取出字節低四位中最高位,向左移九位??移位?
PRR=bitshift(bitand(A(2:)128)5);???%?sign-bit???取出字節高四位中最高位,向左移五位
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‘;?%?為了方便后期的數據處理,將輸出矩陣?M?轉置為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‘);????%裝載數據完成
figure(1);?clf?box?on?hold?on
plot(TIME?M(1:)‘r‘);
%if?nosig==2
%plo
- 上一篇:序列二次規劃法及matlab代碼
- 下一篇:多智能體一致性問題報告
評論
共有 條評論