package Ġale kt as . tele com app . utils Ċ Ċ import Ġale kt as . tele com app . domain . entities . Window Ċ import Ġale kt as . tele com app . domain . entities . signals . Signal Ċ import Ġcom . j jo e 6 4 . graph view . series . DataPoint Ċ import Ġio . reactivex . Observable Ċ import Ġorg . apache . commons . math 3 . transform . D ft Normalization Ċ import Ġorg . apache . commons . math 3 . transform . Fast Four ier Transformer Ċ import Ġorg . apache . commons . math 3 . transform . Transform Type Ċ Ċ fun ĠDouble . format ( digits : ĠInt ) Ġ= Ġ"% .${ digits } f ". format ( this ) Ċ Ċ fun ĠList < Pair < Double , ĠDouble >> . to Sorted Points (): ĠMutable List < DataPoint > Ġ= Ġthis ĊĠĠĠ Ġ. map Ġ{ ĠData Point ( it . first , Ġit . second ) Ġ} ĊĠĠĠ Ġ. sorted By Ġ{ Ġit . x Ġ} ĊĠĠĠ Ġ. to Mutable List () Ċ Ċ fun ĠSignal . to Data Points (): ĠArray < DataPoint > Ġ= Ġthis . get Points () ĊĠĠĠ Ġ. map Ġ{ ĠData Point ( it . key , Ġit . value ) Ġ} ĊĠĠĠ Ġ. to Typed Array () Ċ Ċ fun ĠList < Pair < Double , ĠDouble >> . toFloat (): ĠList < Pair < Float , ĠFloat >> Ġ= ĊĠĠĠ Ġthis . map Ġ{ ĠPair ( it . first . toFloat (), Ġit . second . toFloat ()) Ġ} Ċ Ċ fun ĠSignal . getS pect rum (): ĠArray < DataPoint > Ġ{ ĊĠĠĠ Ġval Ġdata Ġ= ĠWindow ( Window . GA US SE ). apply To ( this ). getValues () ĊĠĠĠ Ġval Ġold Size Ġ= Ġdata . size ĊĠĠĠ Ġval Ġsignal Data Ġ= Ġif Ġ(! old Size . is Power Of Two ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Size Ġ= Ġold Size . highest One Bit (). sh l ( 1 ) ĊĠĠĠĠĠĠĠ Ġdata . copyOf ( new Size Ġ= Ġnew Size ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġspectrum Ġ= ĠFast Four ier Transformer ( D ft Normalization . STANDARD ) ĊĠĠĠĠĠĠĠ Ġ. transform ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Data , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTransform Type . FORWARD ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġval Ġactual Size Ġ= Ġ( spectrum . size Ġ/ Ġ 2 ). coerce In ( 0 , Ġ 4 0 0 0 ) ĊĠĠĠ Ġspectrum Ġ= Ġspectrum . take ( actual Size ). to Typed Array () ĊĠĠĠ Ġreturn Ġspectrum ĊĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġi , Ġcomplex Ġ-> ĠData Point ( i . toDouble (), Ġcomplex . abs ()) Ġ} ĊĠĠĠĠĠĠĠ Ġ. to Typed Array () Ċ } Ċ Ċ fun ĠSignal . get Normalized Spectrum (): ĠArray < DataPoint > Ġ{ ĊĠĠĠ Ġval Ġdata Ġ= ĠWindow ( Window . GA US SE ). apply To ( this ). getValues () ĊĠĠĠ Ġval Ġold Size Ġ= Ġdata . size ĊĠĠĠ Ġval Ġsignal Data Ġ= Ġif Ġ(! old Size . is Power Of Two ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Size Ġ= Ġold Size . highest One Bit (). sh l ( 1 ) ĊĠĠĠĠĠĠĠ Ġdata . copyOf ( new Size Ġ= Ġnew Size ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġspectrum Ġ= ĠFast Four ier Transformer ( D ft Normalization . STANDARD ) ĊĠĠĠĠĠĠĠ Ġ. transform ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Data , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTransform Type . FORWARD ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġval Ġactual Size Ġ= Ġ( spectrum . size Ġ/ Ġ 2 ). coerce In ( 0 , Ġ 4 0 0 0 ) ĊĠĠĠ Ġspectrum Ġ= Ġspectrum . take ( actual Size ). to Typed Array () ĊĠĠĠ Ġval Ġmax Spectrum Value Ġ= Ġspectrum . max By Ġ{ Ġit . abs () Ġ} ?. abs () Ġ?: Ġ 1 . 0 ĊĠĠĠ Ġreturn Ġspectrum ĊĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġi , Ġcomplex Ġ-> ĠData Point ( i . toDouble (), Ġcomplex . abs () Ġ/ Ġmax Spectrum Value ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. to Typed Array () Ċ } Ċ Ċ fun ĠInt . is Power Of Two (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġthis Ġ> Ġ 0 Ġ&& Ġthis Ġand Ġthis Ġ- Ġ 1 Ġ== Ġ 0 Ċ } Ċ Ċ fun ĠInt . highest One Bit (): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġi Ġ= Ġthis ĊĠĠĠ Ġi Ġ= Ġi Ġor Ġ( i Ġshr Ġ 1 ) ĊĠĠĠ Ġi Ġ= Ġi Ġor Ġ( i Ġshr Ġ 2 ) ĊĠĠĠ Ġi Ġ= Ġi Ġor Ġ( i Ġshr Ġ 4 ) ĊĠĠĠ Ġi Ġ= Ġi Ġor Ġ( i Ġshr Ġ 8 ) ĊĠĠĠ Ġi Ġ= Ġi Ġor Ġ( i Ġshr Ġ 1 6 ) ĊĠĠĠ Ġreturn Ġi Ġ- Ġi . ush r ( 1 ) Ċ } Ċ Ċ infix Ġfun ĠClosed Range < Double >. step ( step : ĠDouble ): ĠIterable < Double > Ġ{ ĊĠĠĠ Ġrequire ( start . is Finite ()) ĊĠĠĠ Ġrequire ( end Inclusive . is Finite ()) ĊĠĠĠ Ġrequire ( step Ġ> Ġ 0 . 0 ) Ġ{ Ġ" Step Ġmust Ġbe Ġpositive , Ġwas : Ġ$ step ." Ġ} ĊĠĠĠ Ġval Ġsequence Ġ= Ġgenerate Sequence ( start ) Ġ{ Ġprevious Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( previous Ġ== ĠDouble . POSITIVE _ INFINITY ) Ġreturn @ generate Sequence Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġprevious Ġ+ Ġstep ĊĠĠĠĠĠĠĠ Ġif Ġ( next Ġ> Ġend Inclusive ) Ġnull Ġelse Ġnext ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġsequence . as Iterable () Ċ } Ċ Ċ fun Ġ< T > ĠObservable < T >. do On First ( action : Ġ( T ) Ġ-> ĠUnit ): ĠObservable < T > Ġ= ĊĠĠĠ Ġtake ( 1 ). do On Next ( action ). concat With ( skip ( 1 )) Ċ