QT Interval Measurement: The PhysioNet/Computing in Cardiology Challenge 2006 1.0.0
(4,016 bytes)
%~ trqt.m - Part of the trqt package submitted for the 2006 CinC challenge
%~ Copyright (C) 2006 DA Tironi, R Sassi and LT Mainardi
%~ This software is released under the terms of the GNU General
%~ Public License (http://www.gnu.org/copyleft/gpl.html).
SAMPLING_RATE = 1000; [b_high, a_high] = butter(5,0.5/(SAMPLING_RATE/2),'high'); %per il filtro
Col_RR = 1; %colonna RR
Col_Q = 2; %colonna punto Q
Col_T = 3; %colonna punto T
Col_P = 4; %colonna Pattern
Col_F = 5; %colonna famiglia
Col_QT = 6; %colonna QT
minSizeListaQT = 2;%se listaQT ha meno di queste righe QT viene impostato a 0
minSizePattern = 2;
diagnostica = 0;
listasufile = 0;
salvasufile = 0;
segnale = load('temp.sam');%carico il segnale
segnale = flipud(filter(b_high,a_high,flipud(filter(b_high,a_high,segnale(:,2),[],1)),[],1));%filtro il segnale
if(listasufile == 0)
listaQT = load('temp.lqt'); %carico la lista dei punti q e t
if(size(listaQT, 1) < minSizeListaQT)
Q=0;
T=0;
return
end
%inizio cross correlazione
miglioramento = 1;
c1=1;
while miglioramento > 0 && miglioramento / (c1^2) > 0.05;
c1 = c1 +1;
listaQT = rrpattern(listaQT);
[listaQT, miglioramento] = shiftQT(listaQT, segnale);
pause(0);
end
listaQT = rrpattern(listaQT);
if(salvasufile == 1)
save('temp.sqt', 'listaQT', '-ascii');
end
else
listaQT = load('temp.sqt');
end
listaQT(:,Col_QT) = listaQT(:,Col_T) - listaQT(:,Col_Q);%trovo la colonna QT
[indPattern, lungPattern] = findPattern(listaQT(:,[Col_F, Col_QT]), minSizePattern); %trovo la famiglia piĆ¹ lunga
if(lungPattern < minSizePattern)
Q=0;
T=0;
return
end
[scPuntoQ, isoelettrico] = findQ(listaQT(indPattern:indPattern + lungPattern - 1, Col_Q), segnale);%trovo lo scostamento rispetto al precedente punto Q
listaQT(:, Col_Q) = listaQT(:, Col_Q) + scPuntoQ;
[scPuntoT, XYretta] = findT(listaQT(indPattern:indPattern + lungPattern - 1, Col_T), segnale, isoelettrico);%trovo lo scostamento rispetto al precedente punto T
listaQT(:, Col_T) = listaQT(:, Col_T) + scPuntoT;
listaQT(:, Col_QT) = listaQT(:, Col_T) - listaQT(:, Col_Q);
QTmedio = round(mean(listaQT(indPattern:indPattern + lungPattern - 1, Col_QT)));
%preferito = findPreferito(listaQT(indPattern:indPattern + lungPattern - 1, Col_QT), indPattern);
preferito = indPattern;
Q = listaQT(preferito,Col_Q), %trovo il punto Q
T = listaQT(preferito,Col_Q) + QTmedio, %trovo il punto T
if(diagnostica==1)
WIN_QT = max(listaQT(indPattern:indPattern + lungPattern - 1, Col_QT), 1)+50;
START_Q = -20; WIN_Q =150;
START_T = -130; WIN_T =150;
figure(1)
clf
hold on
for c1 = 0:min([20 lungPattern-1])
plot([START_Q:START_Q+WIN_QT], segnale(listaQT(indPattern + c1, Col_Q)+START_Q:listaQT(indPattern + c1, Col_Q)+START_Q+WIN_QT)- 200*c1 -3000,'.-');
plot(listaQT(indPattern + c1, Col_QT), segnale(listaQT(indPattern + c1, Col_T))- 200*c1 -3000,'r*')
end
FQmedio = meanWindow(listaQT(indPattern:indPattern+lungPattern-1,Col_Q), segnale, START_Q, WIN_Q);
plot(START_Q:WIN_Q+START_Q-1,FQmedio,'.-g');%stampa la media
FTmedio = meanWindow(listaQT(indPattern:indPattern+lungPattern-1,Col_T), segnale, START_T, WIN_T);
plot((START_T:WIN_T+START_T-1)+(QTmedio),FTmedio,'.-g');%stampa la media
plot(QTmedio-size(XYretta(1, :),2)+1:QTmedio, XYretta(2, :),'.-b');%stampa la retta
cretta = round(size(XYretta(1, :),2)/2);
plot(QTmedio-size(XYretta(1, :),2)+1+cretta, XYretta(2, 1+cretta),'r*');%stampa il punto di der minima
% posPuntoDerMinima=1+10+(21-1)/2; %bruttissimo
% plot(XYretta(1, posPuntoDerMinima)+QTmedio, XYretta(2, posPuntoDerMinima),'r*');%stampa il punto di der minima
plot(QTmedio, XYretta(2, size(XYretta,2)),'r*');%stampa il punto t
plot(QTmedio, ylim, 'r:');
plot(xlim, [isoelettrico isoelettrico], 'b:');%stampa il tratto isoelettrico
plot([0 0], ylim, 'b:');
hold off
end
%{
ANNOTAZIONI
%}