how to read binary file

Please, guide me on how to read a binary file in MATLAB gait in neurodegenerative disease in physionet site.
Those who used ECG MIT BIH data can help me but I do not know how to use the help on the site https://archive.physionet.org/physiotools/matlab/rddata.m ?
Thank you very much.

Respuestas (1)

Behzad Eydiyoon
Behzad Eydiyoon el 10 de Sept. de 2021

0 votos

It is completely straightforward. just read the guide and replace your downloaded data path with the path in the m.file.
Below you can see that the path for the data set is on the line 26.
% This programm reads ECG data which are saved in format 212.
% (e.g., 100.dat from MIT-BIH-DB, cu01.dat from CU-DB,...)
% The data are displayed in a figure together with the annotations.
% The annotations are saved in the vector ANNOT, the corresponding
% times (in seconds) are saved in the vector ATRTIME.
% The annotations are saved as numbers, the meaning of the numbers can
% be found in the codetable "ecgcodes.h" available at www.physionet.org.
%
% ANNOT only contains the most important information, which is displayed
% with the program rdann (available on www.physionet.org) in the 3rd row.
% The 4th to 6th row are not saved in ANNOT.
%
%
% created on Feb. 27, 2003 by
% Robert Tratnig (Vorarlberg University of Applied Sciences)
% (email: rtratnig@gmx.at),
%
% algorithm is based on a program written by
% Klaus Rheinberger (University of Innsbruck)
% (email: klaus.rheinberger@uibk.ac.at)
%
% -------------------------------------------------------------------------
clc; clear all;
%------ SPECIFY DATA ------------------------------------------------------
PATH= 'C:\Users\beydi\Documents\MATLAB\Samples\MIT-BIH\mit-bih-arrhythmia-database-1.0.0'; % path, where data are saved
HEADERFILE= '100.hea'; % header-file in text format
ATRFILE= '100.atr'; % attributes-file in binary format
DATAFILE='100.dat'; % data-file
SAMPLES2READ=30000; % number of samples to be read
% in case of more than one signal:
% 2*SAMPLES2READ samples are read
%------ LOAD HEADER DATA --------------------------------------------------
fprintf(1,'\\n$> WORKING ON %s ...\n', HEADERFILE);
signalh= fullfile(PATH, HEADERFILE);
fid1=fopen(signalh,'r');
z= fgetl(fid1);
A= sscanf(z, '%*s %d %d %d',[1,3]);
nosig= A(1); % number of signals
sfreq=A(2); % sample rate of data
clear A;
for k=1:nosig
z= fgetl(fid1);
A= sscanf(z, '%*s %d %d %d %d %d',[1,5]);
dformat(k)= A(1); % format; here only 212 is allowed
gain(k)= A(2); % number of integers per mV
bitres(k)= A(3); % bitresolution
zerovalue(k)= A(4); % integer value of ECG zero point
firstvalue(k)= A(5); % first integer value of signal (to test for errors)
end;
fclose(fid1);
clear A;
%------ LOAD BINARY DATA --------------------------------------------------
if dformat~= [212,212], error('this script does not apply binary formats different to 212.'); end;
signald= fullfile(PATH, DATAFILE); % data in format 212
fid2=fopen(signald,'r');
A= fread(fid2, [3, SAMPLES2READ], 'uint8')'; % matrix with 3 rows, each 8 bits long, = 2*12bit
fclose(fid2);
M2H= bitshift(A(:,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;
M( : , 2)= bitshift(M2H,8)+ A(:,3)-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=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');
%------ LOAD ATTRIBUTES DATA ----------------------------------------------
atrd= fullfile(PATH, ATRFILE); % attribute file with annotation data
fid3=fopen(atrd,'r');
A= fread(fid3, [2, inf], 'uint8')';
fclose(fid3);
ATRTIME=[];
ANNOT=[];
sa=size(A);
saa=sa(1);
i=1;
while i<=saa
annoth=bitshift(A(i,2),-2);
if annoth==59
ANNOT=[ANNOT;bitshift(A(i+3,2),-2)];
ATRTIME=[ATRTIME;A(i+2,1)+bitshift(A(i+2,2),8)+...
bitshift(A(i+1,1),16)+bitshift(A(i+1,2),24)];
i=i+3;
elseif annoth==60
% nothing to do!
elseif annoth==61
% nothing to do!
elseif annoth==62
% nothing to do!
elseif annoth==63
hilfe=bitshift(bitand(A(i,2),3),8)+A(i,1);
hilfe=hilfe+mod(hilfe,2);
i=i+hilfe/2;
else
ATRTIME=[ATRTIME;bitshift(bitand(A(i,2),3),8)+A(i,1)];
ANNOT=[ANNOT;bitshift(A(i,2),-2)];
end;
i=i+1;
end;
ANNOT(length(ANNOT))=[]; % last line = EOF (=0)
ATRTIME(length(ATRTIME))=[]; % last line = EOF
clear A;
ATRTIME= (cumsum(ATRTIME))/sfreq;
ind= find(ATRTIME <= TIME(end));
ATRTIMED= ATRTIME(ind);
ANNOT=round(ANNOT);
ANNOTD= ANNOT(ind);
%------ DISPLAY DATA ------------------------------------------------------
figure(1); clf, box on, hold on
plot(TIME, M(:,1),'r');
if nosig==2
plot(TIME, M(:,2),'b');
end;
for k=1:length(ATRTIMED)
text(ATRTIMED(k),0,num2str(ANNOTD(k)));
end;
xlim([TIME(1), TIME(end)]);
xlabel('Time / s'); ylabel('Voltage / mV');
string=['ECG signal ',DATAFILE];
title(string);
fprintf(1,'\\n$> DISPLAYING DATA FINISHED \n');
% -------------------------------------------------------------------------
fprintf(1,'\\n$> ALL FINISHED \n');

7 comentarios

NGR MNFD
NGR MNFD el 11 de Sept. de 2021
hello...
I know I have to use the binary part of the data, but I do not understand the code command? I also get an error from sample 2read in my MATLAB program! Can you help me understand and how to use this code for my data? thanks very much
Walter Roberson
Walter Roberson el 11 de Sept. de 2021
If your signal has fewer than 30000 datapoints then you might need to adjust
SAMPLES2READ=30000;
Behzad Eydiyoon
Behzad Eydiyoon el 11 de Sept. de 2021
Annotated ECG signals collected from MIT-BIH are described by three things: a text header file (.hea), a binary file (.dat) and a binary annotation file (.atr).
Header file consists of detailed information such as number of samples, sampling frequency, format of ECG signal, type of ECG leads and number of ECG leads, patient‟s history and the detailed clinical information.
In binary data signal file, the signal is stored in 212 formats which mean each sample requires number of leads times 12 bits to be stored.
The binary annotation file consists of beat annotation.
NGR MNFD
NGR MNFD el 12 de Sept. de 2021
Thank you for answering. But I want a line-by-line explanation of the ecg code commands to finally implement the commands or pay attention to my own database. For example, what do these terms go back to? M1H M2H PRR PRL? thanks
NGR MNFD
NGR MNFD el 12 de Sept. de 2021
For example, when I run the program similar to the command like (load binary data), it gives me an error about first value or zerovalue (Undefined function or variable 'zerovalue)
Walter Roberson
Walter Roberson el 12 de Sept. de 2021
M1H => first half of M
M2H => second half of M
PRR => Right part of PR
PRL => left part of PR
zerovalue => integer value of ECG zero point
zerovalue would not have been assigned to if nosig (number of signals) is 0 or negative.
NGR MNFD
NGR MNFD el 13 de Sept. de 2021
hello dear ...
Do you have more details about MATLAB code commands so that I can understand what you did? thanks

Iniciar sesión para comentar.

Categorías

Productos

Versión

R2019a

Preguntada:

el 10 de Sept. de 2021

Comentada:

el 13 de Sept. de 2021

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by