% function [logistic_regression_B_matrix, pi_vector, total_obs_distribution] = trainSpringerSegmentationAlgorithm(PCGCellArray, annotationsArray, Fs, figures) % % Training the Springer HMM segmentation algorithm. Developed for use in % the paper: % D. Springer et al., "Logistic Regression-HSMM-based Heart Sound % Segmentation," IEEE Trans. Biomed. Eng., In Press, 2015. % %% Inputs: % PCGCellArray: A 1XN cell array of the N audio signals. For evaluation % purposes, these signals should be from a distinct training set of % recordings, while the algorithm should be evaluated on a separate test % set of recordings, which are recorded from a completely different set of % patients (for example, if there are numerous recordings from each % patient). % annotationsArray: a Nx2 cell array: position (n,1) = the positions of the % R-peaks and postion (n,2) = the positions of the end-T-waves % (both in SAMPLES) % Fs: The sampling frequency of the PCG signals % figures (optional): boolean variable dictating the disaplay of figures. % %% Outputs: % logistic_regression_B_matrix: % pi_vector: % total_obs_distribution: % As Springer et al's algorithm is a duration dependant HMM, there is no % need to calculate the A_matrix, as the transition between states is only % dependant on the state durations. % %% 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 [logistic_regression_B_matrix, pi_vector, total_obs_distribution] = trainSpringerSegmentationAlgorithm(PCGCellArray, annotationsArray, Fs, figures) %% Options if(nargin < 4) figures = false; end numberOfStates = 4; numPCGs = length(PCGCellArray); % A matrix of the values from each state in each of the PCG recordings: state_observation_values = cell(numPCGs,numberOfStates); for PCGi = 1:length(PCGCellArray) PCG_audio = PCGCellArray{PCGi}; S1_locations = annotationsArray{PCGi,1}; S2_locations = annotationsArray{PCGi,2}; [PCG_Features, featuresFs] = getSpringerPCGFeatures(PCG_audio, Fs); PCG_states = labelPCGStates(PCG_Features(:,1),S1_locations, S2_locations, featuresFs); %% Plotting assigned states: if(figures) figure('Name','Assigned states to PCG'); t1 = (1:length(PCG_audio))./Fs; t2 = (1:length(PCG_Features))./featuresFs; plot(t1, PCG_audio, 'k-'); hold on; plot(t2, PCG_Features, 'b-'); plot(t2, PCG_states, 'r-'); legend('Audio','Features','States'); pause(); end %% Group together all observations from the same state in the PCG recordings: for state_i = 1:numberOfStates state_observation_values{PCGi,state_i} = PCG_Features(PCG_states == state_i,:); end end % Save the state observation values to the main workspace of Matlab for % later investigation if needed: assignin('base', 'state_observation_values', state_observation_values) %% Train the B and pi matrices after all the PCG recordings have been labelled: [logistic_regression_B_matrix, pi_vector, total_obs_distribution] = trainBandPiMatricesSpringer(state_observation_values);