gusucode.com > 能检测心电特征点PQRST,用matlab编写了界面,并能计算识别率 > ecg/readdata.m
function [X sfreq]=readdata(groupnum) %读取心电数据 PATH= 'D:\ecg'; %指定数据的储存路径 datanum=groupnum; suffixhead='.hea'; suffixdate='.dat'; HEADERFILE=[datanum suffixhead]; %.hea 格式,头文件,可用记事本打开 DATAFILE=[datanum suffixdate]; %.dat 格式,ECG 数据 SAMPLES2READ=3600; %指定需要读入的样本数,若.dat文件中存储有两个通道的信号:则读入 2*SAMPLES2READ 个数据 %读取头文件中的信息 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; %读取data数据 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'); % 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(M1H,8)+ A( 1 , : )-PRL;% 将M1H、M2H分别左移8位,即乘以2^8,再分别加上A(:,1),A(:,2), M( 2 , :)= bitshift(M2H,8)+ A( 2 , : )-PRR;% 由于左移时把符号位也移动了,要减去符号位的值 M( 1 , :)= (M( 1 , :)- zerovalue(1))/gain(1); M( 2 , :)= (M( 2 , :)- zerovalue(2))/gain(2); clear A M1H M2H PRR PRL; X=M(1,:); end