TWAnalyser - A T-wave Alternans Detector 1.0.0

File: <base>/twa-mfiles/CalcAltSeries.m (2,889 bytes)
function [alt_s, avg_even, avg_odd] = CalcAltSeries(ecg, fid, amp, STLen, valid, calc_from_diff)
% CalcAltSeries.m
% Author: Alexander Khaustov; alexander dot khaustov at gmail dot com 
% Copyright (C) 2008 St.-Petersburg Institute of Cardiological Technics (Incart), www.incart.ru
% This software is released under the terms of the GNU General
% Public License (http://www.gnu.org/copyleft/gpl.html).
% 
% calculates the alternans series for different points within st segment. 
% If a given beat is marked as invalid it's replaced by the average
% even/odd beat
% this is the routine used for Param.MethodForEctopy = 'replace' and
% Param.MethodForEctopy = 'differences'
%
% normally the series is formed from sequential amplitudes of equally timed
% points within ST segment, but if the parameter calc_from_diff is
% set - series is calculated as differences between amplitudes in adjacent
% beats which performs natural detrending of the data that is later subject
% to power spectral estimation and supresses low frequencies
%
% INPUT:
%       see AlignBeats.m
% OUTPUT: 
%       alt_s       (num_of_beats x num_of_leads x num_of_timepoints): TWA series                 
%       avg_even (num_of_timepoints x num_of_leads)
%       avg_odd  (num_of_timepoints x num_of_leads)

    avg_even = [];
    avg_odd = [];
    invalid_exist = ~isempty(find(valid==0));
    if (invalid_exist)
        vinds = find(valid);
        odd = vinds(find(mod(vinds(:), 2)));  %   odd indices of valid QRS
        even = vinds(find((1 - mod(vinds(:), 2))));   %   even indices of valid QRS
    end;    
    alt_s = zeros(length(fid) - 1, STLen);

    for timept = 1:STLen           
        %   whenever there are invalid complexes compute odd and even
        %   averages to replace those
        if (invalid_exist)
            avg_odd(timept) = mean(ecg(fid(odd) + timept) - amp(odd));                
            avg_even(timept) = mean(ecg(fid(even) + timept) - amp(even));
        end;
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        
        for i = 1:(length(fid) - 1)
            
            if (valid(i)) 
                first = ecg(fid(i) + timept) - amp(i);
            elseif mod(i, 2)
                first = avg_odd(timept);
            else
                first = avg_even(timept);
            end;

            if (~calc_from_diff)
                alt_s(i, timept) = first;
            else
                if (valid(i + 1)) 
                    second = ecg(fid(i + 1) + timept) - amp(i + 1);
                elseif mod(i + 1, 2)
                    second = avg_odd(timept);
                else
                    second = avg_even(timept);
                end;
                alt_s(i, timept) = first - second;
            end;
            
        end;
    end;    

return;