% function [d_distributions max_S1 min_S1 max_S2 min_S2 max_systole min_systole max_diastole min_diastole] = get_duration_distributions(heartrate,systolic_time)
%
% This function calculates the duration distributions for each heart cycle
% state, and the minimum and maximum times for each state.
%
%% Inputs:
% heartrate is the calculated average heart rate over the entire recording
% systolic_time is the systolic time interval
%
%% Outputs:
% d_distributions is a 4 (the number of states) dimensional vector of
% gaussian mixture models (one dimensional in this case), representing the
% mean and std deviation of the duration in each state.
%
% The max and min values are self-explanatory.
%
% This code is implemented as outlined in the paper:
% S. E. Schmidt et al., "Segmentation of heart sound recordings by a
% duration-dependent hidden Markov model," Physiol. Meas., vol. 31,
% no. 4, pp. 513-29, Apr. 2010.
%
% Developed by David Springer for comparison purposes in the paper:
% D. Springer et al., "Logistic Regression-HSMM-based Heart Sound
% Segmentation," IEEE Trans. Biomed. Eng., In Press, 2015.
%
%% Copyright (C) 2016 David Springer
% dave.springer@gmail.com
%
% This program is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program. If not, see .
function [d_distributions max_S1 min_S1 max_S2 min_S2 max_systole min_systole max_diastole min_diastole] = get_duration_distributions(heartrate,systolic_time)
springer_options = default_Springer_HSMM_options;
mean_S1 = round(0.122*springer_options.audio_segmentation_Fs);
std_S1 = round(0.022*springer_options.audio_segmentation_Fs);
mean_S2 = round(0.094*springer_options.audio_segmentation_Fs);
std_S2 = round(0.022*springer_options.audio_segmentation_Fs);
mean_systole = round(systolic_time*springer_options.audio_segmentation_Fs) - mean_S1;
std_systole = (25/1000)*springer_options.audio_segmentation_Fs;
mean_diastole = ((60/heartrate) - systolic_time - 0.094)*springer_options.audio_segmentation_Fs;
std_diastole = 0.07*mean_diastole + (6/1000)*springer_options.audio_segmentation_Fs;
%% Cell array for the mean and covariance of the duration distributions:
d_distributions = cell(4,2);
%% Assign mean and covariance values to d_distributions:
d_distributions{1,1} = mean_S1;
d_distributions{1,2} = (std_S1)^2;
d_distributions{2,1} = mean_systole;
d_distributions{2,2} = (std_systole)^2;
d_distributions{3,1} = mean_S2;
d_distributions{3,2} = (std_S2)^2;
d_distributions{4,1} = mean_diastole;
d_distributions{4,2} = (std_diastole)^2;
%Min systole and diastole times
min_systole = mean_systole - 3*(std_systole+std_S1);
max_systole = mean_systole + 3*(std_systole+std_S1);
min_diastole = mean_diastole-3*std_diastole;
max_diastole = mean_diastole + 3*std_diastole;
%Setting the Min and Max values for the S1 and S2 sounds:
%If the minimum lengths are less than a 50th of the sampling frequency, set
%to a 50th of the sampling frequency:
min_S1 = (mean_S1 - 3*(std_S1));
if(min_S1<(springer_options.audio_segmentation_Fs/50))
min_S1 = (springer_options.audio_segmentation_Fs/50);
end
min_S2 = (mean_S2 - 3*(std_S2));
if(min_S2<(springer_options.audio_segmentation_Fs/50))
min_S2 = (springer_options.audio_segmentation_Fs/50);
end
max_S1 = (mean_S1 + 3*(std_S1));
max_S2 = (mean_S2 + 3*(std_S2));