PhysioNet Cardiovascular Signal Toolbox 1.0.0
(5,447 bytes)
function windowRRintervals = CreateWindowRRintervals(tNN, NN, HRVparams,option)
%
% windowRRintervals = CreateWindowRRintervals(NN, tNN, settings, options)
%
% OVERVIEW: This function returns the starting time (in seconds) of
% each window to be analyzed.
%
% INPUT: tNN : a single row of time indices of the rr interval
% data (seconds)
% NN : a single row of NN (normal normal) interval
% data in seconds
% HRVparams : struct of settings for hrv_toolbox analysis
% option : 'normal', 'af', 'sqi'
%
% OUTPUT: windowRRintervals : array containing the starting time
% (in seconds) of each window to be
% analyzed
%
%
% DEPENDENCIES & LIBRARIES:
% PhysioNet Cardiovascular Signal Toolbox
% https://github.com/cliffordlab/PhysioNet-Cardiovascular-Signal-Toolbox
%
% REFERENCE:
% Vest et al. "An Open Source Benchmarked HRV Toolbox for Cardiovascular
% Waveform and Interval Analysis" Physiological Measurement (In Press), 2018.
%
% REPO:
% https://github.com/cliffordlab/PhysioNet-Cardiovascular-Signal-Toolbox
% ORIGINAL SOURCE AND AUTHORS:
% Main script written by Adriana N. Vest
% Dependent scripts written by various authors
% (see functions for details)
% 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
%
% Verify input arguments
if nargin< 1
error('Need to supply time to create windows')
end
if nargin<4 || isempty(HRVparams)
option = 'normal';
end
% Set Defaults
increment = HRVparams.increment;
windowlength = HRVparams.windowlength;
win_tol = HRVparams.MissingDataThreshold;
switch option
case 'af'
increment = HRVparams.af.increment;
windowlength = HRVparams.af.windowlength;
case 'mse'
increment = HRVparams.MSE.increment;
windowlength = HRVparams.MSE.windowlength;
if isempty(increment)
windowRRintervals = 0;
return % no need to crate windows , use entair signal
end
case 'dfa'
increment = HRVparams.DFA.increment;
windowlength = HRVparams.DFA.windowlength;
if isempty(increment)
windowRRintervals = 0;
return % no need to crate windows , use entair signal
end
case 'sqi'
increment = HRVparams.sqi.increment;
windowlength = HRVparams.sqi.windowlength;
case 'HRT'
increment = HRVparams.HRT.increment;
windowlength = HRVparams.HRT.windowlength * 3600;
if windowlength > tNN(end)
windowRRintervals = 0;
return;
end
end
nx = floor(tNN(end)); % length of sequence
overlap = windowlength-increment; % number of overlapping elements
Nwinds = fix((nx-overlap)/(windowlength-overlap)); % number of sliding windows
% Initialize output matrix
windowRRintervals = (0:(Nwinds-1))*(windowlength-overlap); % starting index of each windows
% Initialize loop variables
t_window_start = 0; % Window Start Time
i = 1; % Counter
% for j = 1:(floor(tNN(end))-(windowlength))/increment
% indicies = [];
% try
% indicies = find(tNN >= (j-1)*increment & tNN < windowlength+(j-1)*increment);
% % windows_all: first coloumn is start time of sliding window
% % and second column is end time of sliding window
% windows_all(j,1) = tNN(indicies(1));
% windows_all(j,2) = tNN(indicies(end));
% catch
% windows_all(j,1) = NaN;
% windows_all(j,2) = NaN;
% end
% end
if ~strcmp(option,'af') && ~strcmp(option,'sqi')
while t_window_start <= tNN(end) - windowlength + increment
% Find indices of time values in this segment
t_win = tNN(tNN >= t_window_start & tNN < t_window_start + windowlength);
% if NN intervals are supplied, assign them to the current window
% if not, put in place a vector of ones as a place holder
if ~isempty(NN)
nn_win = NN(tNN >= t_window_start & tNN < t_window_start + windowlength);
else
nn_win = (windowlength/length(t_win))* ones(length(t_win),1);
end
% Store the begin time of window
windowRRintervals(i) = t_window_start;
% Increment time by sliding segment length (sec)
t_window_start = t_window_start + increment;
% Check Actual Window Length and mark windows that do not meet the
% crieria for Adequate Window Length
% First remove unphysiologic beats from candidates for this
% measurement:
idxhi = find(nn_win > HRVparams.preprocess.upperphysiolim);
idxlo = find(nn_win < HRVparams.preprocess.lowerphysiolim);
comb = [idxhi ; idxlo];
nn_win(comb) = [];
% Now query the true length of the window by adding up all of the NN
% intervals
truelength = sum(nn_win(:));
if truelength < (windowlength * (1-win_tol))
windowRRintervals(i) = NaN;
end
% Increment loop index
i = i + 1;
end
end
end % end of function