QT Interval Measurement: The PhysioNet/Computing in Cardiology Challenge 2006 1.0.0

% correct_Q_on.m - Searches for better Q_ons in the +-20area of the
% suggested Q_on by Find Q_on.m 
%        Copyright (C) 2006  Michal Huptych, Vaclav Chudacek
%        This software is released under the terms of the GNU General
%        Public License (http://www.gnu.org/copyleft/gpl.html).

function korekceQ = correct_Q_on(ECGch,Q_on_FINAL_abs, Q_on_window_start, Q_on_window_stop)
k4r = 0; k6r = 0; k8r = 0;
k4l = 0; k6l = 0; k8l = 0;

gradient4right = abs(ECGch(Q_on_window_stop:-4:Q_on_FINAL_abs+4)-ECGch(Q_on_window_stop-4:-4:Q_on_FINAL_abs));
gradient4right = gradient4right(length(gradient4right):-1:1);
gradient6right = abs(ECGch(Q_on_window_stop:-6:Q_on_FINAL_abs+6)-ECGch(Q_on_window_stop-6:-6:Q_on_FINAL_abs));
gradient6right = gradient6right(length(gradient6right):-1:1);
gradient8right = abs(ECGch(Q_on_window_stop:-8:Q_on_FINAL_abs+8)-ECGch(Q_on_window_stop-8:-8:Q_on_FINAL_abs));
gradient8right = gradient8right(length(gradient8right):-1:1);

for i = 1:length(gradient4right)
    if (gradient4right(i) < 30)
        k4r = k4r+4;
    end
end
for i = 1:length(gradient6right)
    if (gradient6right(i) < 30)
        k6r = k6r+6;
    end
end
for i = 1:length(gradient8right)
    if (gradient8right(i) < 30)
        k8r = k8r+8;
    end
end

korekceQ = median([k4r k6r k8r]);
Q_on_FINAL_abs = Q_on_FINAL_abs + korekceQ;
if (((Q_on_FINAL_abs+20)-Q_on_FINAL_abs) > 35 && (Q_on_FINAL_abs -(Q_on_FINAL_abs-20)) > 35)
    gradient4left = abs(ECGch(Q_on_FINAL_abs:-4:Q_on_window_start+4)-ECGch(Q_on_FINAL_abs-4:-4:Q_on_window_start));
    gradient4left = gradient4left(length(gradient4left):-1:1);
    gradient6left = abs(ECGch(Q_on_FINAL_abs:-6:Q_on_window_start+6)-ECGch(Q_on_FINAL_abs-6:-6:Q_on_window_start));
    gradient6left = gradient6left(length(gradient6left):-1:1);
    gradient8left = abs(ECGch(Q_on_FINAL_abs:-8:Q_on_window_start+8)-ECGch(Q_on_FINAL_abs-8:-8:Q_on_window_start));
    gradient8left = gradient8left(length(gradient8left):-1:1);

    for i = 1:length(gradient4left)
        if (gradient4left(i) > 30)
            k4l = k4l-4;
        end
    end
    for i = 1:length(gradient6left)
        if (gradient6left(i) > 30)
            k6l = k6l-6;
        end
    end
    for i = 1:length(gradient8left)
        if (gradient8left(i) > 30)
            k8l = k8l-8;
        end
    end
    korekceQ = median([k4l k6l k8l]);
end