package Ġai . fuzz yl abs . we arable my foot . imu Ċ Ċ import Ġcom . github . ps am bit 9 7 9 1 . jd sp . signal . peaks . Find Peak Ċ import Ġcom . github . ps am bit 9 7 9 1 . jd sp . signal . peaks . Peak Ċ import Ġjava . time . Instant Ċ import Ġkotlin . math . floor Ċ import Ġai . fuzz yl abs . increment alp ca . Incremental PCA Ċ import Ġai . fuzz yl abs . we arable my foot . math . cum trap z Ċ import Ġai . fuzz yl abs . we arable my foot . util . Double Vector 3 D Ċ import Ġkotlin . math . absolute Value Ċ Ċ @ Experimental Unsigned Types Ċ private Ġval ĠTAG Ġ= ĠIM US ession :: class . java . simple Name Ċ Ċ /** Ċ Ġ* ĠSession Ġof Ġan Ġinteraction Ġwith ĠI MU Ċ Ġ* Ċ Ġ* Ġ@ constructor ĠCreates Ġand Ġpre pa res Ġa Ġsession Ġfor Ġrecording Ċ Ġ* Ġ@ param [ sampling Frequency ] ĠS ampling Ġfrequency Ġof Ġan ĠI MU Ġ( Hz ) Ċ Ġ* Ġ@ param [ window Size Millis ] ĠWindow Ġsize Ġto Ġbe Ġused Ġfor Ġcalculation Ġ( ms ) Ċ Ġ* Ġ@ property [ current Element ] ĠThe Ġlast Ġsession Ġelement Ġ([ IM US ession Element ]) Ġcalculated Ċ Ġ* Ġ@ property [ read ings ] ĠList Ġof Ġ[ IM U Reading ] Ġrecorded Ġduring Ġa Ġsession Ċ Ġ* Ġ@ property [ elements ] ĠList Ġof Ġ[ IM US ession Element ] Ġcalculated Ġduring Ġa Ġsession Ċ Ġ*/ Ċ @ Experimental Unsigned Types Ċ class ĠIM US ession ( val Ġp ca Initial Size : ĠInt Ġ= Ġ 5 0 , Ġsampling Frequency : ĠInt Ġ= Ġ 1 0 0 , Ġval Ġwindow Size Millis : ĠInt Ġ= Ġ 1 0 0 0 0 ){ ĊĠĠĠ Ġprivate Ġvar Ġip ca : ĠIncrement al PCA Ġ= ĠIncrement al PCA ( 3 , 3 ) ĊĠĠĠ Ġprivate Ġvar Ġip ca Initialized : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġwindow Size Ġ= Ġwindow Size Millis Ġ/ Ġ( 1 0 0 0 Ġ/ Ġsampling Frequency ) ĊĠĠĠ Ġprivate Ġvar Ġwindow : ĠMutable List < IM U Reading > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġvar Ġcurrent Element : ĠIM US ession Element Ġ= ĠIM US ession Element ( ĊĠĠĠĠĠĠĠ ĠInstant . now (), ĊĠĠĠĠĠĠĠĠ 0 . 0 , ĊĠĠĠĠĠĠĠĠ 0 . 0 , ĊĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠ Ġ) ĊĠĠĠ Ġvar Ġread ings : ĠMutable List < IM U Reading > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġvar Ġelements : ĠMutable List < IM US ession Element > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShift Ġcurrent Ġwindow Ġby Ġadding Ġnew Ġreading ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param [ reading ] ĠReading Ġto Ġbe Ġadded ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġshift Window ( reading : ĠI MU Reading , Ġis Recording : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWait Ġfor Ġenough Ġread ings Ġfor ĠPCA Ġinitial isation ĊĠĠĠĠĠĠĠ Ġif (! ip ca Initialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . add ( reading ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( window . size Ġ== Ġp ca Initial Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize PCA () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip ca Initialized Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpc Ġ= Ġip ca . update ( reading . get Acceleration ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreading . pc Ġ= ĠDouble Vector 3 D ( pc [ 0 ], Ġpc [ 1 ], Ġpc [ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( window . size Ġ>= Ġwindow Size ) Ġwindow Ġ= Ġwindow . drop ( 1 ). to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . add ( reading ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( is Recording ) Ġadd Reading ( reading ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġreading Ġto Ġthe Ġrecording ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param [ reading ] ĠReading Ġto Ġbe Ġadded ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Reading ( reading : ĠI MU Reading ) Ġ{ ĊĠĠĠĠĠĠĠ Ġread ings . add ( reading ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize PCA () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġacceleration Array Ġ= Ġwindow . map Ġ{ Ġit . get Acceleration () Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠ Ġval Ġp cs Ġ= Ġip ca . initialize ( acceleration Array ) ĊĠĠĠĠĠĠĠ Ġwindow Ġ= Ġwindow . zip ( pcs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( reading , Ġpc ) Ġ-> Ġreading . also Ġ{ Ġit . pc Ġ= ĠDouble Vector 3 D ( pc [ 0 ], Ġpc [ 1 ], Ġpc [ 2 ]) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClear Ġthe Ġrecording ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠMakes Ġ[ read ings ] Ġand Ġ[ elements ] Ġlists Ġempty ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġwindow Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġread ings Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġelements Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġip ca Ġ= ĠIncrement al PCA ( 3 , 3 ) ĊĠĠĠĠĠĠĠ Ġip ca Initialized Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Window Metrics ( no New Read ings : ĠInt , Ġis Recording : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Element Ġ= Ġget Window Metrics ( no New Read ings , Ġupdate Distance Ġ= Ġis Recording ) ĊĠĠĠĠĠĠĠ Ġif ( is Recording ) Ġelements . add ( current Element ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Window Metrics ( no New Read ings : ĠInt , Ġupdate Distance : ĠBoolean ): ĠIM US ession Element Ġ= ĊĠĠĠĠĠĠĠ ĠComp anion . getWindow Metrics ( window , Ġno New Read ings , Ġcurrent Element . distance , Ġupdate Distance ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet ĠByteArray Ġrepresentation Ġof Ġthe Ġwindow Ġfor Ġvisual isation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Visual isation Bytes (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpc Ġ= Ġwindow . map Ġ{ Ġit . get PC 0 () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmin Acceleration Ġ= Ġ- 1 6 . 0 Ġ* Ġ 9 . 8 ĊĠĠĠĠĠĠĠ Ġval Ġmax Acceleration Ġ= Ġ+ 1 6 . 0 Ġ* Ġ 9 . 8 ĊĠĠĠĠĠĠĠ Ġreturn Ġpc . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfloor (( it Ġ- Ġmin Acceleration ) Ġ/ Ġ( max Acceleration Ġ- Ġmin Acceleration ) Ġ* Ġ 2 5 5 ). toInt (). to Byte () ĊĠĠĠĠĠĠĠ Ġ}. toByteArray () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalculates Ġrunning Ġmetrics Ġfor Ġa Ġgiven Ġwindow Ġof Ġread ings ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param [ window ] ĠIterable Ġof Ġread ings , Ġwindow Ġto Ġperform Ġcalculations Ġon ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param [ no New Read ings ] ĠNumber Ġof Ġnew Ġread ings Ġsince Ġthe Ġlast Ġupdate ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param [ last Distance ] ĠDistance Ġestimate Ġfrom Ġthe Ġprevious Ġcalculation ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠIM US ession Element Ġcontaining Ġcurrent Ġtime Ġand Ġcalculated Ġmetrics ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget Window Metrics ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow : ĠIterable < IM U Reading >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno New Read ings : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Distance : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Distance : ĠBoolean ĊĠĠĠĠĠĠĠ Ġ): ĠIM US ession Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp ca 0 Ġ= Ġwindow . map Ġ{ Ġit . get PC 0 () Ġ}. toDouble Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= Ġwindow . first (). getTime () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġwindow . map Ġ{ Ġ( it . getTime () Ġ- ĠstartTime ). toDouble () Ġ/ Ġ 1 0 0 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwindow Delta Time Ġ= Ġwindow . last (). getTime () Ġ- Ġwindow . first (). getTime () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Read ings Ġ= Ġwindow . toList (). take Last ( no New Read ings ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Delta Time Ġ= Ġnew Read ings . last (). getTime () Ġ- Ġnew Read ings . first (). getTime () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstep Pe aks Ġ= Ġfind Step Pe aks ( pca 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcad ence Ġ= Ġget Window Cad ence ( step Pe aks , Ġwindow Delta Time . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspeed Ġ= Ġget Speed ( pca 0 , Ġstep Pe aks , Ġtime ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdistance Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( update Distance ) Ġlast Distance Ġ+ Ġspeed Ġ* Ġ( new Delta Time . toDouble () Ġ/ Ġ 1 0 0 0 ) Ġelse Ġlast Distance ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIM US ession Element ( Instant . now (), Ġcad ence , Ġspeed , Ġdistance ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGet Ġestimated Ġspeed Ġfor Ġa Ġwind om ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param [ pca 0 ] ĠInput Ġarray , Ġthe Ġfirst Ġprinciple Ġcomponent Ġis Ġassumed ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param [ step Pe aks ] ĠIterable Ġof Ġpe aks Ġcorresponding Ġto Ġsteps ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param [ time ] ĠRelative Ġtime Ġfor Ġeach Ġreading ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠSpeed Ġin Ġm / s ^ 2 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Speed ( pca 0 : ĠDouble Array , Ġstep Pe aks : ĠInt Array , Ġtime : ĠList < Double >): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmid points Ġ= ĠlistOf ( 0 , Ġ* step Pe aks . to Typed Array (), Ġp ca 0 . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. zip With Next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( it . first Ġ+ Ġit . second ) Ġ/ Ġ 2 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspeed Values Ġ= Ġmid points . zip With Next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( a , Ġb ) Ġ-> Ġget Step Speed ( pca 0 . slice ( a .. b ), Ġtime . slice ( a .. b )) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( speed Values . isEmpty ()) Ġ 0 . 0 Ġelse Ġspeed Values . sum () Ġ/ Ġspeed Values . size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Step Speed ( step Window : ĠIterable < Double >, Ġtime : ĠIterable < Double >): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcum trap z ( step Window , Ġtime ). map Ġ{ Ġit . absolute Value Ġ}. max OrNull () Ġ?: Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGet Ġcad ence Ġfor Ġa Ġwindow ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param [ step Pe aks ] ĠIterable Ġof Ġpe aks Ġcorresponding Ġto Ġsteps ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param [ deltaTime ] ĠSize Ġof Ġthe Ġwindow Ġin Ġmilliseconds ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Window Cad ence ( step Pe aks : ĠInt Array , Ġdelta Time : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstep Pe aks . size Ġ/ Ġdelta Time . toDouble () Ġ* Ġ 6 0 0 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠFinds Ġpe aks Ġin Ġa Ġsignal Ġthat Ġcorrespond Ġto Ġindividual Ġsteps ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠImplements Ġpeak Ġdetection Ġstep Ġcounting . ĠA Ġstep Ġis Ġcounted Ġif Ġit Ġexceeds ĊĠĠĠĠĠĠĠĠ Ġ* Ġ 3 5 . 0 Ġm / s ^ 2 . ĠEn forces Ġdistance Ġbetween Ġpe aks Ġof Ġ 2 0 Ġsamples ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param [ pca 0 ] ĠInput Ġarray , Ġthe Ġfirst Ġprinciple Ġcomponent Ġis Ġassumed ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠIterable < Int > Ġwith Ġindices Ġof Ġthe Ġoriginal Ġarray Ġcorresponding Ġto Ġpe aks ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfind Step Pe aks ( pca 0 : ĠDouble Array ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfp Ġ= ĠFind Peak ( pca 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġout Pe aks : ĠPe ak ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Pe aks Ġ= Ġfp . detect Pe aks () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNegative Array Size Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠZero Ġpe aks Ġfound Ġand Ġthe Ġj DSP Ġthrows Ġexceptions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOrder Ġis Ġimportant ! ĠUnt il Ġj DSP Ġprovides Ġa Ġmethod Ġfor Ġfiltering Ġby Ġmultiple ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġproperties Ġfiltering Ġby Ġdistance Ġneeds Ġto Ġbe Ġperformed Ġfirst , Ġso Ġnot Ġto Ġrecreate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpeak Ġprior ities ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpeak sBy Distance Ġ= Ġout Pe aks ?. filter By Peak Distance ( 2 0 ) Ġ?: Ġint ArrayOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpeak Height s Ġ= Ġout Pe aks ?. find Peak Height s ( peak sBy Distance ) Ġ?: Ġdouble ArrayOf () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpeak sBy Distance . zip ( peak Height s . as Iterable ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . second Ġ>= Ġ 5 0 . 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to IntArray () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }