• 大小: 10KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-05-28
  • 语言: Matlab
  • 标签: MATLAB  ECG  QRS  

资源简介

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

评论

共有 条评论