Permalink
Switch branches/tags
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
144 lines (118 sloc) 5.38 KB
function out = EvalTimeDomainHRVstats(NN,tNN,sqi,HRVparams,windows_all)
% [NNmean,NNmedian,NNmode,NNvariance,NNskew,NNkurt,SDNN,NNiqr,RMSSD, pnn50
% btsdet,avgsqi] = EvalTimeDomainHRVstats(NN,tNN,sqi,HRVparams,windows_all)
%
% OVERVIEW: This function returns time domain HRV metrics calculated on
% input NN intervals.
%
% INPUT: MANDATORY:
% NN : a single row of NN (normal normal) interval
% data in seconds
% tNN : the time indices of the rr interval data
% (seconds)
% sqi : (Optional )Signal Quality Index; Requires
% a matrix with at least two columns. Column
% 1 should be timestamps of each sqi measure,
% and Column 2 should be SQI on a scale from 0 to 1.
% HRVparams : struct of settings for hrv_toolbox analysis
% windows_all : vector containing the starting time of each
% windows (in seconds)
%
% OUTPUT:
% out.NNmean :
% out.NNmedian :
% out.NNmode :
% out.NNvariace :
% out.NNskew : skewness
% out.NNkurt : kurtosis
% out.SDNN : standard deviation
% out.NNiqr :
% out.RMSSD :
% out.pnn50 : the fraction of consecutive beats that differ by
% more than a specified time.
% out.btsdet :
% out.avgsqi :
% out.tdflag : 2 - Not enough high SQI data
% 3 - Not enough data in the window to analyze
% 5 - Success
%
% REPO:
% https://github.com/cliffordlab/PhysioNet-Cardiovascular-Signal-Toolbox
% ORIGINAL SOURCE AND AUTHORS:
% Written by Adriana N. Vest
% COPYRIGHT (C) 2016
% LICENSE:
% This software is offered freely and without warranty under
% the GNU (v3 or later) public license. See license file for
% more information
%
% 10-25-2017 Modified by Giulia Da Poian, convert results in ms and
% removed code for writing results on file
%
% Verify input arguments
if nargin< 5
error('no input argument!!!!')
end
if isempty(sqi)
sqi(:,1) = tNN;
sqi(:,2) = ones(length(tNN),1);
end
% Set Defaults
windowlength = HRVparams.windowlength;
alpha = HRVparams.timedomain.alpha;
threshold1 = HRVparams.sqi.LowQualityThreshold;
threshold2 = HRVparams.RejectionThreshold;
% Preallocate arrays (all NaN) before entering the loop
out.NNmean = nan(1,length(windows_all));
out.NNmedian = nan(1,length(windows_all));
out.NNmode = nan(1,length(windows_all));
out.NNvariance = nan(1,length(windows_all));
out.NNskew = nan(1,length(windows_all));
out.NNkurt = nan(1,length(windows_all));
out.NNiqr = nan(1,length(windows_all));
out.SDNN = nan(1,length(windows_all));
out.RMSSD = nan(1,length(windows_all));
out.pnn50 = nan(1,length(windows_all));
out.btsdet = nan(1,length(windows_all));
out.avgsqi = nan(1,length(windows_all));
out.tdflag = nan(1,length(windows_all));
%Analyze by Window
% Loop through each window of RR data
for i_win = 1:length(windows_all)
% Check window for sufficient data
if ~isnan(windows_all(i_win))
% Isolate data in this window
idx_NN_in_win = find(tNN >= windows_all(i_win) & tNN < windows_all(i_win) + windowlength);
idx_sqi_win = find(sqi(:,1) >= windows_all(i_win) & sqi(:,1) < windows_all(i_win) + windowlength);
sqi_win = sqi(idx_sqi_win,:);
t_win = tNN(idx_NN_in_win);
nn_win = NN(idx_NN_in_win);
% Analysis of SQI for the window
lowqual_idx = find(sqi_win(:,2) < threshold1);
% If enough data has an adequate SQI, perform the calculations
if numel(lowqual_idx)/length(sqi_win(:,2)) < threshold2
out.NNmean(i_win) = mean(nn_win) * 1000; % compute and convert to ms
out.NNmedian(i_win) = median(nn_win)* 1000; % compute and convert to ms
out.NNmode(i_win) = mode(nn_win)* 1000; % compute and convert to ms
out.NNvariance(i_win) = var(nn_win)* 1000; % compute and convert to ms
out.NNskew(i_win) = skewness(nn_win);
out.NNkurt(i_win) = kurtosis(nn_win); %
out.NNiqr(i_win) = iqr(nn_win)* 1000; % compute and convert to ms
out.SDNN(i_win) = std(nn_win)* 1000; % compute and convert to ms % SDNN should only be done on longer data segments
% RMSSD
out.RMSSD(i_win) = runrmssd(nn_win)* 1000; % compute and convert to ms
% pNN50
out.pnn50(i_win) = pnna(nn_win, alpha); %
out.btsdet(i_win) = length(nn_win);
out.avgsqi(i_win) = mean(sqi_win(:,2));
out.tdflag(i_win) = 5; % 5 : 'sucess';
else
% 2: low SQI
out.tdflag(i_win) = 2;
end % end of conditional statements that run if SQI is above threshold2
else
% 3: Not enough data in the window to analyze;
out.tdflag(i_win) = 3;
end % end check for sufficient data
end % end of loop through window
end % end of function