From 115e08f04dc06fa3a6c3c1d82bfd16427eb5ddaf Mon Sep 17 00:00:00 2001 From: Lars Date: Tue, 16 Feb 2021 15:52:59 +0100 Subject: [PATCH] Gait variabiliy analysis for CLBP dataset; 1) determine location of turns, 2) create epochs of 1 minute for each participant, 3) calculate the paramters for each minute and overall. Pre-processing controls not the same, script will be pushed later on. --- DetermineLocationTurnsFunc.m | 68 ++++++++++++++++++++++++++++ Main_GaitVariabilityAnalysis_LD.mlx | Bin 0 -> 6100 bytes 2 files changed, 68 insertions(+) create mode 100644 DetermineLocationTurnsFunc.m create mode 100644 Main_GaitVariabilityAnalysis_LD.mlx diff --git a/DetermineLocationTurnsFunc.m b/DetermineLocationTurnsFunc.m new file mode 100644 index 0000000..0f8c4c3 --- /dev/null +++ b/DetermineLocationTurnsFunc.m @@ -0,0 +1,68 @@ +function [locsTurns,FilteredData] = DetermineLocationTurnsFunc(inputData,FS,ApplyRealignment,plotit,Distance) +% Description: Determine the location of turns, plot for visual inspection + +% Input: Acc Data (not yet realigned) + +%Realign sensor data to VT-ML-AP frame + +if ApplyRealignment % apply relignment as described in Rispens S, Pijnappels M, van Schooten K, Beek PJ, Daffertshofer A, van Die?n JH (2014). + data = inputData(:,[3,2,4]); % reorder data to 1 = V; 2 = ML; 3 = AP + % Consistency of gait characteristics as determined from acceleration data collected at different trunk locations. Gait Posture 2014;40(1):187-92. + [RealignedAcc, ~] = RealignSensorSignalHRAmp(data, FS); + dataAcc = RealignedAcc; +end +% Filter data +[B,A] = butter(2,3/(FS/2),'low'); % Filters data very strongly which is needed to determine turns correctly +dataStepDetection = filtfilt(B,A,dataAcc); +% Determine steps +% Explanation of method: https://nl.mathworks.com/help/supportpkg/beagleboneblue/ref/counting-steps-using-beagleboneblue-hardware-example.html +% From website: To convert the XYZ acceleration vectors at each point in time into scalar values, +% calculate the magnitude of each vector. This way, you can detect large changes in overall acceleration, +% such as steps taken while walking, regardless of device orientation. +magfilt = sqrt(sum((dataStepDetection(:,1).^2) + (dataStepDetection(:,2).^2) + (dataStepDetection(:,3).^2), 2)); +magNoGfilt = magfilt - mean(magfilt); +minPeakHeight2 = 1.2*std(magNoGfilt); % based on visual inspection, parameter tuning was performed on standard deviation from MInPeak (used to be 1 SD) +[pks, locs] = findpeaks(magNoGfilt, 'MINPEAKHEIGHT', minPeakHeight2); % for step detection +numStepsOption2_filt = numel(pks); % counts number of steps; + +diffLocs = diff(locs); % calculates difference in step location +avg_diffLocs = mean(diffLocs); % average distance between steps +std_diffLocs = std(diffLocs); % standard deviation of distance between steps + +figure; +findpeaks(diffLocs, 'MINPEAKHEIGHT', avg_diffLocs, 'MINPEAKDISTANCE',9); % these values have been chosen based on visual inspection of the signal +line([1 length(diffLocs)],[avg_diffLocs avg_diffLocs]) +[pks_diffLocs, locs_diffLocs] = findpeaks(diffLocs, 'MINPEAKHEIGHT', avg_diffLocs,'MINPEAKDISTANCE',10); % values were initially 5 +locsTurns = [locs(locs_diffLocs), locs(locs_diffLocs+1)]; + +magNoGfilt_copy = magNoGfilt; +for k = 1: size(locsTurns,1); + magNoGfilt_copy(locsTurns(k,1):locsTurns(k,2)) = NaN; +end + +% Visualising signal; +if plotit + figure; + subplot(2,1,1) + hold on; + plot(magNoGfilt,'b') + plot(magNoGfilt_copy, 'r'); + title('Inside Straight: Filtered data with turns highlighted in blue') + line([6000,12000,18000,24000,30000,36000;6000,12000,18000,24000,30000,36000],[-4,-4,-4,-4,-4,-4;4,4,4,4,4,4],'LineWidth',2,'Linestyle','--','color','k') +% hold on; +% for m = 1:size(locsTurns,1) +% plot(locsTurns(m),DataStraight.([char(Participants(i))]).LyapunovPerStrideRosen_ML(:,m),'--gs',... +% 'LineWidth',2,... +% 'MarkerSize',10,... +% 'MarkerEdgeColor','g',... +% 'MarkerFaceColor',[0.5,0.5,0.5]) +% end + hold off; +end +% Check if number of turns * 20 m are making sense based on total +% distance measured by researcher. +disp(['Number of turns detected = ' num2str(size(locsTurns,1))]) +disp(['Total distance measured by researcher was = ' num2str(Distance)]) + +FilteredData = dataAcc; +end \ No newline at end of file diff --git a/Main_GaitVariabilityAnalysis_LD.mlx b/Main_GaitVariabilityAnalysis_LD.mlx new file mode 100644 index 0000000000000000000000000000000000000000..ad5a919494fda2e06a118a453d462a5896f92992 GIT binary patch literal 6100 zcmaJ_1yCH@wjE@G26uwH4el-j!QFyGfS`kWaCetLumlN&V1eMtV1Wc1JU9d&EV%RG zzgO?(=HLIit4~*ToxQ5}I;;2Ty)=}OkO=?)04hMa#7k=L^d`m2WpAl2J}L~8hKCd9Anm9ilR61&m!|w zA+Ep#2G_C0Pn$9_sFN?Khe{ehTq6!9ei19)_0zJJ5&8LuW$#pFYh&3y)&4D#d*$n- z-0?s|pF!Wp*;%H7{0<$pv%GH#e0*W)=Q*lPOcN|bI9s^(9opi07m+fu7fF{XV-8f@ z7%7!0n3Nlmo^qjhs5-MvB$t63H?>*XvpuL&erE+8T}JWPTu*NW`gxy)hhsaheYF+F zZ7{^CK^R|LkPg@cpTiti(vmGd8t)`V!=fkvctw zG6;O5Uz}kmEOq2XL>}dcX5BN8X)OYkpRq2v0-~I-8r%LLot2u-bg1%2X+lnEN&?}f~f`3q^OF@eEsX{L>t!r@1`K!O^kN0c7z0ByJy{Tq*5t|om<+@yCZYr-1 zB#@nAD%<5n2xF37LbbsG&?Q$XDfU&L{csP_`5~<9UwtrW+;oBIjz5BGLmL<`HG5!|6T?Mbml;GeP{oHT6ytmko=R@koL!( znIH`gOcKQNOd6!vcOclI!<&U{%u03@{V0_R#+| zl?#>35p_D#&3_%)%Z&MGac7wDl;L4UvSFRR#E=Vrk6Oi7O_e7k4d?Ea-Q)*)G154+ zJbyHT-)kuo2Kb^Qa~g05I1lv7;u_7Ur^i5|4hf!$j8_7;VWkW}Qn+F`1*O*GIW9Nm zOS{T6?tn}&a|kH7=pD&H;r0N7AhHBFPQzn%DdtGekS4@^t^ZXWrLUqVmU&4Yub4kdHKW>B)|*~S#uq*YM22g<-qUk& z!Z%U{gXxHQhg((ev@k53U%3%I8m&b)<9W;BhQ1~#Mt6=AM+-(Cn=sNyhhTQ_fCKnI zGxh?7FGys5jTl1Gz7vU*YND^I1Itr-Zk>Kcn^105C{rTk>y9}PVmtx_lHfZ{kSAy} z)@vjrFkn|Hio(UM;sWBeJROMn$?US36E(ESWIlF8t#-W|+5|~+nRrjvA(i{1L4yj0 zpA^!_36WUXtqjvEmUh=qP*uD-{7#B2OlE3vw6e5=9??C5OVmPw7Euz+Q79U`Bov{A zu6qTqpKN0IWl$Fx19@d=Uc~HNAVyG#EF{9VH7oGroqUuH((Y?3c+q@Nc3DKGJJwp6 zfx*s!%~7%N2sMgtW&32%Q5nD@b2c_7@|tH7$<~M)9<@P@?i;z&+H?{fwT(zbup&~I zI;vc=?TH>b51TgW-6hlacBf@WBWua$n69Dj0#H*3ft!q;JS}JNOIAp#C;jx2CjecR z^tlD!mv>-$Jnjhb4N;bi5s1ymLYyz{QlsJ9m=UnKqT!lphXc~eQBvevrmar9O>QBW{i$FF2FxtpUbTh`ssZy!`E3l1R+Q!=vw(syUjRgx&X=TVE$`_?cUpR!+1q zkGRPd!#@bQ=;;DP_V}Z^w)LXDkSp1=69bx{bOK=giaOIB9cSSPjjoy{*WRjh zTS_RGN{?d005mj-ZMT#@hDMQ*1pZpaT+}On+);;{40W7lv(%@vaKR5Cto-riP%)YZ zk2xk#&+e-<-iEa6uWQ`HXN+3dCLh0i*;NYtX|CJ(;-&t~Iyy4O3*xiv)X$V}k~nw? zXm#FWHV2o9sIgb|22V}rEc|G;M}&wjNM&_T{2fxP)YEM=&S760 zc&2;iyH>?VX6`)s?fJw2R~Bc2xT=t>p!S7hHCWFJyGiA>6P@srb5O2}Fg3E?Vx1_Z|S- z-LM|XW#eSKSR$%oV^1?fisVPO&JcHIYO1cLKHtd}t5ih9aO(^S@u-cMx!BKn=rcsG zarLc9?=^$fYSd~8`LKGdn6X*+kZr=%@E8>@QJ2L^kJ(q$7g5J|Ik%vgI!OjSpN?c; zM$ewM^x9$dK{MpQb&1qXOn}O2Ni7hGS4JIO2q%^Q2HdRv#cCfy;>WG^v}u6ML@SU zQi(rWG2#&`y*>z_2s=mYO>={Y4t>GR^r#3m9No9A1?cEGoSG(}aL&oO-t(Aa>2&?6wSz?FfYMGYQ^Vgnz ztOF<|Rx+b_??c|SQ^%pwf_~ks73~{~^ADD+!*U;0WU&)V7`z?esSScf*32!n(J%wL zpS9rxT55_)@Q)^mii;^3?D7oa5+L%XZ?0mjf1z}N`9NS_4*Rv(Y zNxDE#Zm})l(Xj6FEl$OHF`w?r&&^`k^tYzB$pp3aq1Y7S+UUEz4S{gZa8xubw>Iy_ zH)goLq@QmSZ1ZhoipPji&R#;-|WCTla~$NyQERCfc1P zA5efoe%pQ&lVY-&=Luoc58CW04rrS*;ehc(uxAhpwB@r7bU^p9!M-Zmq`x+hSD)X! zdNK3<(tCJ3ojZ@WGx)FByM7GQAN22Mc$&AP8$b}=>jV8uU3YE*lhceSFLg-)fnSs) z7qTxhD5b*IbZlNdXDhH@H?Q14!oaIdk@&1HPF*lHDB$DB~^J{bu_=wbD zWy4?Xb~dUJ^5fm~#8&Hu_$RoZ@ZQl_Kq*!rJoPikqpA{;a3W!KF5jhI=C8S(U4H*obB;wdnYZD6^+ zGQ~mBxaqk+;vu*b28s{huiK}yoIvG@?lGCDCsetyP!qkIiuJmHkni7N{JkCN^#u!j zzwhkK2>}4y`_As)?Fhuv!^QJ|o00kKMdwg1f?l&87fI!~LS_5GOzZwsYttriDJBKk z-p}cltGiR^uG@V|w1(y0dDR~`u9-`yO5$GPC3#WDGAnOjQML}Dj(QTwZ+Yznv`H=w z<^kU%2gs1fG_hNoehY;m(+91jR+dsEDT8#+GFI^nI>%DK5}0iBt?TN26VX5mF4m5) zi7N8cAW{Kfv&9baJzI69XNWG91=We+iy*jvB|$;HLSUps+v`t1CwTo)+XF^?Gj6uw zgA=MxXSl}Y-PGZQ^9Hf8;%uK0NFj^(?zv7_`8V^bBe9CQ&)EbemZE9QZ&;kf@97N`>LG+SqH82$b&4PW%YG?U&9}Ll ztN|xRDOvn$C?=8BG4mOnAwx5XH!*q5A#vjG*n2cd5Iy@Cz1~;4Lf)zVcWoX)Z_~jl*C%7H+$SqHEWZ8$KKc2tnBC7= z(V9R>d|6m>!9?KTJL8@7HqhQ)F8>F^-n#HndLsdke)nEdf6o5u3*Pdd&H~$#+-~ee zU|IKk;_K2T9Cay^R7vIcpMPuYANXXB8}sV9=TZ8eQ;OgDbn^bcjG81t?Yp=zBh7lw zJA?-9Fu#^i9DhvEtV7Xof@ROt)vC0%-C(xTw<}6sN(64*KrmMlBVHD3?zNbr)92=u z!I^_f$G%q*7>7IwmlOI1G>mPB{j$)8?x*r(Zl{2caFX0U@PB6M@#;mL1D7AsWsrLd zfHR;AOR@Hw-eEI`qc3vHX(#OZUr=u>ag0wY&G%P{Iib7Qi9|iCO5qP;rRHhYv-4+uyeqHQXHV9^)+jz6(bcFJEJuP2=dfM*uM!wIV@xSE{_PMv_ z-0dLF57IJ8Y<0Vr7BDEH2<4cX=al-Ll09+al|xeE_qD{GmAzn9(_wqP20 zFCTDmG?h5LP!OtiJ2$%DMXa6v7IUHViCE(?3O>WjvibS&=qnPUc;8Mry(D!G3U^a4 z8G7F0ux^UgUz95huK0NdUyPUHi&>Re7VZj?;%@~*KREaC<|PJc&Sye=p~@`Q^(oKV zk}myTJL(s{6PU(yWR@gIBUCDVFV5X9uiFqYQ!X7x+=70a;jRAn{MpvkogeZC-RIBz z-}2Y8cC@x|w^nqvfjltanb?dK#)Tv2-(e{W;fi#5+RLok!pE!-gDMopU)^% zBI^qWbI>qmFNt=yEx%h09vPo|QD>~EQ(y=1;5INvek8#D^+e23+r2?oZlH3yE$3CG z9{UCl{)F}owEUv7gO5T;G#-dUtmCW1tWflR)sW+BChn{oV!_TYIYI3=>z@lGHIxzV ztH=NE!`{;XxToXa$3M8Te**kzG(JTB3&8yT_M7ead*DCWYJUY*-oN2Lm~4Ln{J9bS z1t5a`AArBM#oxpKsha*3&Ue49{+HVNC(xf|