% This script calculates coefficient of variation (CoV) of the stride % frequency using a peak-picking algorithm based on velocity signals in % two different forms: straights and loops. % % Author: Artur A. Soczawa-Stronczyk % Location: University of Leicester, UK % Created: 15/04/2020 % Version: 1.0 % % Cite as: % Soczawa-Stronczyk, Artur; Bocian, Mateusz (2020), Gait coordination in overground walking with a virtual reality avatar, v5, Dryad, Dataset, https://doi.org/10.5061/dryad.vx0k6djnr %% Script Initiation % Clear existing variables clear; % Load data file load('Dataset.mat'); % Specify sampling frequency fs = 128; % [Hz] % Define the threshold for the peak-picking algorithm thr = 0.3; %% Starights % Extract individual straights for nPart = 1:6 % number of test subjects (participants) for nWalk = 1:8 % number of walks if length(RL.straights{nWalk,nPart}) >= 17 for n = 2:16 RL.velStr{nWalk,nPart}{n-1} = RL.vel{nWalk,nPart}(RL.straights{nWalk,nPart}(n,1):RL.straights{nWalk,nPart}(n,2),:); end else for n = 2:14 RL.velStr{nWalk,nPart}{n-1} = RL.vel{nWalk,nPart}(RL.straights{nWalk,nPart}(n,1):RL.straights{nWalk,nPart}(n,2),:); end end if length(VR.straights{nWalk,nPart}) >= 17 for n = 2:16 VR.velStr{nWalk,nPart}{n-1} = VR.vel{nWalk,nPart}(VR.straights{nWalk,nPart}(n,1):VR.straights{nWalk,nPart}(n,2),:); end else for n = 2:14 VR.velStr{nWalk,nPart}{n-1} = VR.vel{nWalk,nPart}(VR.straights{nWalk,nPart}(n,1):VR.straights{nWalk,nPart}(n,2),:); end end end end % Discard 5% of the signals to keep it compatible with Analysis_Part01.m % script. for nPart = 1:6 for nWalk = 1:8 for n = 1:length(RL.velStr{nWalk,nPart}) RL.velStr{nWalk,nPart}{n} = RL.velStr{nWalk,nPart}{n}(round(0.05*length(RL.velStr{nWalk,nPart}{n})):round(0.95*length(RL.velStr{nWalk,nPart}{n})),:); end for n = 1:length(VR.velStr{nWalk,nPart}) VR.velStr{nWalk,nPart}{n} = VR.velStr{nWalk,nPart}{n}(round(0.05*length(VR.velStr{nWalk,nPart}{n})):round(0.95*length(VR.velStr{nWalk,nPart}{n})),:); end end end % Calculate CoV of the stride frequency using a peak-picking algorithm % Real Environment for nPart = 1:6 for nWalk = 1:8 for nPeople = 1:2 % Initiate vector RL.stride{nWalk,nPart,nPeople} = []; for nStraight = 1:length(RL.velStr{nWalk,nPart}) % Peaks greater than the threshold; [~,RL.locs{nWalk,nPart,nPeople}{nStraight}] = findpeaks(RL.velStr{nWalk,nPart}{nStraight}(:,nPeople),'MinPeakHeight',thr); % Initiate vector RL.strideLocal{nWalk,nPart,nPeople}{nStraight} = zeros(length(RL.locs{nWalk,nPart,nPeople}{nStraight})-1,1); % Stride duration [data points] for m = 1:length(RL.locs{nWalk,nPart,nPeople}{nStraight})-1 RL.strideLocal{nWalk,nPart,nPeople}{nStraight}(m,1) = abs(RL.locs{nWalk,nPart,nPeople}{nStraight}(m,1)-RL.locs{nWalk,nPart,nPeople}{nStraight}(m+1,1)); end % Stride frequency RL.stride{nWalk,nPart,nPeople} = [RL.stride{nWalk,nPart,nPeople}; fs./RL.strideLocal{nWalk,nPart,nPeople}{nStraight}]; end end % Coefficient of variation results.CoVStraightsRL{nWalk,nPart} = ([std(RL.stride{nWalk,nPart,1}), std(RL.stride{nWalk,nPart,2})] ./ [mean(RL.stride{nWalk,nPart,1}), mean(RL.stride{nWalk,nPart,2})])*100; end end % Virtual Reality for nPart = 1:6 for nWalk = 1:8 for nPeople = 1:2 % Initiate vector VR.stride{nWalk,nPart,nPeople} = []; for nStraight = 1:length(VR.velStr{nWalk,nPart}) % Peaks greater than the threshold; [~,VR.locs{nWalk,nPart,nPeople}{nStraight}] = findpeaks(VR.velStr{nWalk,nPart}{nStraight}(:,nPeople),'MinPeakHeight',thr); % Initiate vector VR.strideLocal{nWalk,nPart,nPeople}{nStraight} = zeros(length(VR.locs{nWalk,nPart,nPeople}{nStraight})-1,1); % Stride duration [data points] for m = 1:length(VR.locs{nWalk,nPart,nPeople}{nStraight})-1 VR.strideLocal{nWalk,nPart,nPeople}{nStraight}(m,1) = abs(VR.locs{nWalk,nPart,nPeople}{nStraight}(m,1)-VR.locs{nWalk,nPart,nPeople}{nStraight}(m+1,1)); end % Stride frequency VR.stride{nWalk,nPart,nPeople} = [VR.stride{nWalk,nPart,nPeople}; fs./VR.strideLocal{nWalk,nPart,nPeople}{nStraight}]; end end % Coefficient of variation results.CoVStraightsVR{nWalk,nPart} = ([std(VR.stride{nWalk,nPart,1}), std(VR.stride{nWalk,nPart,2})] ./ [mean(VR.stride{nWalk,nPart,1}), mean(VR.stride{nWalk,nPart,2})])*100; end end %% Loops % Calculate CoV of the stride frequency using a peak-picking algorithm % Real Environment for nPart = 1:6 for nWalk = 1:8 for nPeople = 1:2 % Initiate vector RL.strideLoops{nWalk,nPart,nPeople} = []; % Peaks greater than the threshold; if length(RL.straights{nWalk,nPart}) >= 17 [~,RL.locsLoops{nWalk,nPart,nPeople}] = findpeaks(RL.vel{nWalk,nPart}(RL.straights{nWalk,nPart}(2,1):RL.straights{nWalk,nPart}(16,2),nPeople),'MinPeakHeight',thr); else [~,RL.locsLoops{nWalk,nPart,nPeople}] = findpeaks(RL.vel{nWalk,nPart}(RL.straights{nWalk,nPart}(2,1):RL.straights{nWalk,nPart}(14,2),nPeople),'MinPeakHeight',thr); end % Initiate vector RL.strideLocalLoops{nWalk,nPart,nPeople} = zeros(length(RL.locsLoops{nWalk,nPart,nPeople})-1,1); % Stride duration [data points] for m = 1:length(RL.locsLoops{nWalk,nPart,nPeople})-1 RL.strideLocalLoops{nWalk,nPart,nPeople}(m,1) = abs(RL.locsLoops{nWalk,nPart,nPeople}(m,1)-RL.locsLoops{nWalk,nPart,nPeople}(m+1,1)); end % Stride frequency RL.strideLoops{nWalk,nPart,nPeople} = [RL.strideLoops{nWalk,nPart,nPeople}; fs./RL.strideLocalLoops{nWalk,nPart,nPeople}]; end % Coefficient of variation results.CoVLoopsRL{nWalk,nPart} = ([std(RL.strideLoops{nWalk,nPart,1}), std(RL.strideLoops{nWalk,nPart,2})] ./ [mean(RL.strideLoops{nWalk,nPart,1}), mean(RL.strideLoops{nWalk,nPart,2})])*100; end end % Virtual Reality for nPart = 1:6 for nWalk = 1:8 for nPeople = 1:2 % Initiate vector VR.strideLoops{nWalk,nPart,nPeople} = []; % Peaks greater than the threshold; if length(VR.straights{nWalk,nPart}) >= 17 [~,VR.locsLoops{nWalk,nPart,nPeople}] = findpeaks(VR.vel{nWalk,nPart}(VR.straights{nWalk,nPart}(2,1):VR.straights{nWalk,nPart}(16,2),nPeople),'MinPeakHeight',thr); else [~,VR.locsLoops{nWalk,nPart,nPeople}] = findpeaks(VR.vel{nWalk,nPart}(VR.straights{nWalk,nPart}(2,1):VR.straights{nWalk,nPart}(14,2),nPeople),'MinPeakHeight',thr); end % Initiate vector VR.strideLocalLoops{nWalk,nPart,nPeople} = zeros(length(VR.locsLoops{nWalk,nPart,nPeople})-1,1); % Stride duration [data points] for m = 1:length(VR.locsLoops{nWalk,nPart,nPeople})-1 VR.strideLocalLoops{nWalk,nPart,nPeople}(m,1) = abs(VR.locsLoops{nWalk,nPart,nPeople}(m,1)-VR.locsLoops{nWalk,nPart,nPeople}(m+1,1)); end % Stride frequency VR.strideLoops{nWalk,nPart,nPeople} = [VR.strideLoops{nWalk,nPart,nPeople}; fs./VR.strideLocalLoops{nWalk,nPart,nPeople}]; end % Coefficient of variation results.CoVLoopsVR{nWalk,nPart} = ([std(VR.strideLoops{nWalk,nPart,1}), std(VR.strideLoops{nWalk,nPart,2})] ./ [mean(VR.strideLoops{nWalk,nPart,1}), mean(VR.strideLoops{nWalk,nPart,2})])*100; end end