From cad85f8593040460bf2c3b1d538627253bcb57e3 Mon Sep 17 00:00:00 2001 From: toni Date: Fri, 13 Apr 2018 11:52:12 +0200 Subject: [PATCH] puhh. this is a big commit - change the complete file sending / receiving process between phone and watch, we now use channels instead of simple messages. this is recommentad by google, due to some changes in google play services. - made some smaller changes in the ui, for file saving and saving of sensordata for evaluation purposes - edited the manifest and gradle script for play store. - made some change for a better performance for he huawei watch --- android/ConductorsPhone/app/build.gradle | 8 ++-- .../app/src/main/AndroidManifest.xml | 3 +- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3056 -> 6076 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2096 -> 3659 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4569 -> 8732 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6464 -> 14239 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9250 -> 20101 bytes android/ConductorsWatch/app/build.gradle | 11 ++--- .../tonifetzer/conductorswatch/Estimator.java | 13 +++--- .../AccelerometerWindowBuffer.java | 38 +++++++++++------ .../bpmEstimation/BpmEstimator.java | 17 +++++--- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3418 -> 5367 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2206 -> 3208 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4842 -> 7467 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7718 -> 11948 bytes android/ConductorsWatch/build.gradle | 10 ++++- android/ConductorsWatch/gradle.properties | 1 + java/src/main/java/Main.java | 40 ++++++++++-------- .../AccelerometerWindowBuffer.java | 35 ++++++++++----- .../main/java/bpmEstimation/BpmEstimator.java | 19 ++++++--- .../src/main/java/utilities/MovingFilter.java | 5 +++ matlab/AutoCorrMethodNew_Watch.m | 9 ++-- 22 files changed, 132 insertions(+), 77 deletions(-) diff --git a/android/ConductorsPhone/app/build.gradle b/android/ConductorsPhone/app/build.gradle index 993b6df..550f728 100644 --- a/android/ConductorsPhone/app/build.gradle +++ b/android/ConductorsPhone/app/build.gradle @@ -11,8 +11,8 @@ android { minSdkVersion 24 targetSdkVersion 26 //sdk 2 | product version 3 | build num 2 | multi-apk 2 - versionCode 260120100 - versionName "0.1.2" + versionCode 260130300 + versionName "0.1.3.2" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { @@ -33,12 +33,12 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' - implementation 'com.google.android.support:wearable:2.1.0' + implementation 'com.google.android.support:wearable:2.2.0' implementation 'com.google.android.gms:play-services-wearable:11.8.0' implementation 'com.android.support:percent:26.1.0' implementation 'com.android.support:animated-vector-drawable:26.1.0' implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support:support-v4:26.1.0' implementation 'com.android.support:recyclerview-v7:26.1.0' - compileOnly 'com.google.android.wearable:wearable:2.1.0' + compileOnly 'com.google.android.wearable:wearable:2.2.0' } diff --git a/android/ConductorsPhone/app/src/main/AndroidManifest.xml b/android/ConductorsPhone/app/src/main/AndroidManifest.xml index 4c4f298..2f506e6 100644 --- a/android/ConductorsPhone/app/src/main/AndroidManifest.xml +++ b/android/ConductorsPhone/app/src/main/AndroidManifest.xml @@ -3,13 +3,12 @@ package="de.tonifetzer.conductorswatch"> - diff --git a/android/ConductorsPhone/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/ConductorsPhone/app/src/main/res/mipmap-hdpi/ic_launcher.png index a2f5908281d070150700378b64a84c7db1f97aa1..3ed96dfadbb93cbbe473fd46948ecbfbc11e0d26 100644 GIT binary patch literal 6076 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 delta 2084 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⁣ zwiG+x#%j}{0gU~J8;<|!B1@-XaB@{KORFwrYg_8rOv({b0EO#DbeQRm;B6_9=mXGf z-x|VL{zd`)#@yN}HkCSJbjbNlE|zL3Wm9Q8HY`sV)}3%pgN>cL^67{Z;PPL(*wT8N zUjXU{@|*hvm}({wsAC=x0^ok0%UAz0;sogW{B!nDqk|JJ5x~4NfTDgP49^zeu`csl?5mY@JdQdISc zFs!E{^grmkLnUk9 zny~m)1vws@5BFI<-0Tuo2JWX(0v`W|t(wg;s--L47WTvTMz-8l#TL^=OJNRS2?_Qj z3AKT+gvbyBi#H*-tJ%tWD|>EV3wy|8qxfzS!5RW;Jpl5*zo&^UBU=fG#2}UvRyNkK zA06Dy9;K1ca@r2T>yThYgI!ont$(G{6q#2QT+00r_x0(b)gsE`lBB?2gr55gq^D3Fi&p%E(p9>U%bv zkg1Jco(RbyTX7FDHOnl7-O@ zI$AaIl?9NJKPm(WiBP`1-#CB1QzU>&hKm)fpa5DKE{2$X0hGz-0uZ?cyTk(YC!Y&| zL=1VrNERSA5NA2jq7FACfX4JfPyj5XXl1yv0>~s;eF7L2$>&oMqeTFT2m$y7FlkON z_yurD1yIOvA;5C6016pyxBznGUt0kJ&k5r#;&>Jow`r)sp9R~PmK~lz$3xH%LT*1U zJdOyABZ3!FvNoR*vN$5ykHS8f`jA4zV+|L}i1C4`B2c{R0;UdYxaU|H)2avz@ z=mEYc|2S<+(B2Tj+FkX+2D+yFI!k9lWMA61DJ{)e;lum$(;O87?vGJJe!KtK04+N_ zI*P~t@dUb>9Xh{dbyl{-ZQ(UMgz7$|QfL5XSPkskt^NgctYC#;4WcZB1@%@wy@2t3 z2z0DI7&%b$*Aw~abe?GxE`ez@+6hOh-6*8fHRV{1os$EL@}uUZeG4h1&Be`98q*7j z=3-v+lhIjfWVo12!<>%V^a6lTgW3+_#W6n|p*~==zOH7z$0{LSZk(Tpd7EaD04hnA zL;#fxS0aD{`5^&D`}>0Uq?byDD-l2=!wm_bLcUl4gc(% za1p|itVANvFF>hghAS07Im1;IK;|b*W)}VDyI;BIp2=K*yu2a)j?B|f<44NI$NbmJ z#dE0>jI$fMr&@>4kN8MLFb4&2O9fEKaQg%(QO$4_1rVQywG^CmBLh#}_7gKW3vd?| z2?1^&KWq8}8I^_S0|)MowU_pw$q@nl@Nkn$z>BQq_KA^9yaR`(R3u{{Ig;cwt z@AJ^{ODQCm^neroM9nKNUAXi9RCK`OsP_LuR0PUR(YZCCX5dNF6VzcoK&=b^r`W?ltt|*F zpkoae%ZT{C1h~EcFui~b7fF`vb<<~j_VquuUA$}QqIKYELPp#;{u?q8Dz}WAG-(3; zjrm$i%7UbyZMM(Y{>!uJ#vNB?R~B{6Htp=>e*<{fQQ5W7V(1coCWlOON!MzZxhum| ztZBQpGR z;~#ur^&PockKdV{Q6R>o`Pl{0x!DEbpZ7y9Y;*ZvE!*gU`V1W3znva{f=?WO5I&>B z&hw6}tjECtaghm5z|C#%M;Yf_*pI^};h}Vl=^r9EN=tVDj86D;C$jIJ?K7VP+00000NkvXXu0mjf D5i!M* diff --git a/android/ConductorsPhone/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/ConductorsPhone/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 8ca12fe024be86e868d14e91120a6902f8e88ac6..a46541b601e8afe565f96f3a7c94f1e03869a5bb 100644 GIT binary patch literal 14239 zcmV;QH(R0k=~0GrFWzWg7n^OU;{h$ zioM0yMbz`1xy){MFL!q@9hH5a|8sXQ%kJEn-<~;V?wpx+?b;q~kG4nKqwUf5XnVY_ z4*+P7dWY&=84|p&eOt}FosbX+I#9ja5D@5RvOlj4t~U%AreS%!w>zpgY5?k6)K92i zsD7g72GI9(mj#IkSZzSPX3)GV3789yZuN;SFPyW!IMK~KGa^?n$@lp3XxH1bgVsHn zw9)Xza5v3Y!<^LMS4UO&AL=*M2uC%P3XI0*BOO#=qO0bs+1{(Fmj$kSVi4tW%QDfY z!Yv~_J8WB$OZMUIvmQNq)LRNr@3z78nm|K-`ANrik9H|e@-$2hIq>Hu$NR&*^k4qy zq5;3S>%hz)OVHTt2{zf05V$KHwj9_7c_;S6-U}6Q# zZ7{VyaG35%^jzuXieBEO>G}p~A$w+o+dUexUI%{h(1-bvj$oG;3n@oS;rNY9@ZjlV zc>baqUcP+UD0*I94fh{Egp*g#LC(SL;FS>uIzbjN*I6CrA+W1LtR8r!29>0gWNTlz zci{upb#!0@*7j&dYvWOx(8Xm(@=Eos{)fi+n?C>6T^kg`Y`~!~0k)kz0{5OggcmPf zG#V^?MZWW&2lt@#L>c&JMS`~PT9{|A0$Ll5tJWv_lqc;>Q_nh+)w#_oH6J`;mFv4N z`#1fJ&}_LNi)Vw~SHf(xGXA@>;qB4Pu8Cs>vn4pI>7SbwvceN z1RhmAeXYRZ(xWGjp%9&N6LiFt?UleK%IQYNj#MqY>h`tjq3yxj&k;JuF1u2f&x&!q z^|_lC$c0!#)~N%nvWsdAtF-_4KG1d50u`HO;1=m{ExR;x5zEabYlZCr;e&MR4wg-pRkqftePbWPr z{cA7%SA7v0qJA!#&>zELx9x8}Kn}rHpklcQR8cEX>L^3!6|Z8`LK6c6)jPIXBMx6j z@Z7dINo{j}9_DOI zUdmN>Z!0{^FKVE*(tB#D!P^IU=`rB+aU<|(h{5wY0q8BTKu!pdC_I`dZHvEPB_4^4 z?Uf;RYe1g5y3iVRd}{{;$#b)U_z9CXIsV&+0Y?k^xN^fYz*!yEzXbp}qYuP}M`s-Z zgwjRn<2eJgNM6AfcXJE3jN%$2d*g3G2%fJg*zEqTkMXPCXmNTo@Mtjb^cBLRA%tfj z%Hu5n$OQosz@x>2M~?us?oU{SMFp{G zPd^TLzCd}t1wN1~c3}c|w7K9h{}T*RMkr%EXM(;_LZW~1f&~lSeWU#%L6oJM6VhvL zyyq1H&Zl*N=S$}m;Pn;&I=`;PAg!;jtc$nI z_$AQnMP1+-#DeD=l$`GxSRCaHf1{S5mTq!}WvJySC6w|eCs0ADqSUC=H#vfOq$6mc zG*McS4xo+FiEx0GC|#5uN*`r_S`}^&hEzr{wE-KHEy@mMA7Tv-C`XhN${FPnVg;^LZYXyYfydZRNemtXp72a4WrX|FXz0uxH$876?om8dp6{iVUSxq2 z)GrPy@ITaVsNtv)4$APmy)ukKjYf^JSAwyqao9-XQF3<6VFGF*Y7%OS?Q)Q}T?SK8 z3MfU?bep9x12q#h3-yQ15}0GX1m>dVp%z&G4S%BkLM^oV8y2DdM#pvuYAI@&+5PFu7<#4WjYV6Q8xJ6%SG!&ddeon*Rnekc3TB;V}IcR z&k%0|_%qfW*5$^4_s(<(+MNr*dr)``p$grd!zhd@92Fs=$kJ@sL={C9O%+2GTbc!N zL?v0UnJS(t0kuU$iKwJqnT)nlB~ztPrJ~YyWiU#o%Am?5+L-}acs)efs2r+XsywQE z?3#%RP=!=QEESXEwiL+Ci-Y)t4dCr<2v!JVEqGA2C_4g?vsQIdy#MIe$`T2}NUhY+ z!M_DtJR|UY!U50ccy2+Q2c#e05C1%V_{RG-O)=x~&YkP9V_PzKxM+&OV{bAS98mW7 z+{Z=dX-v55*RMs0FBr&Lkl@ivF2dmf1CLv6c*bL>T6Fd(ym$krWweBzJ$(Y(ixR;Z zyG(o28h9L0P6&__9s@lM?>jk}eAuc78-+vZ>gpZm#CukX!=ovLM=LD^{(bVOt>K$M zS1+FdKUeJwJbHD|Ga$Y+JHu+mzl#`R|Al6o`uLt2cuZ>6!CMP+Yd6pf0>s!=Q| zj%ssOB*arCptcZYMnWPgiE3+R1SC_Xpi(o#A&n|MqedC1EPQVE(b-{(F z55YVPx4*&2OAu{+D;903!4QsU>sO9wYb1@h#-NyJ%U%#|DTzf}lUdQ$G>&L%HfoN| zf6>-_6g%2l%n@xV(TJ-i+WK!=hA`R^xxXbEZLQ*nw$?Jy)`I`Wc|;s$d;I*AEk1A; z{UCOo-o+oI57q&J#~rmE6^>?s(ghr-twzW*1hui%775Uz{D^S@?>M-Z-y!t-~d!}F(9cr3^`4=dVo#WEc( zFRlgAsiV7LJz5?Hp0$5~7s?YM^0HX+GGUX)_*UUm3;NRjs}^*byvgw%xvS2GhlJ{B z7-_NLS+?1eHO^B5&v&f=ox5h{NoLpK;;LVKIoVSDprM{2K!gYU7&O;EOPM7|nu&Ap0Wf4|Ql! zr`fU~emR***jsRmf;C7Ow!cv9qW0lMeS;zWS4{}dcn)}`aKJOY!SE~=hlf2Cm1{y6 z3m&6-!b2?2_JRa(H2o7D=DFa4-BY-yK2(XMI=y&N4e>r}h4Ap{w4@Qpc-=*2RGC|j+ogSJ@<}fp} z30d%vsi@-u*NKJgcOKn`q3c)jg6C%zJioO7Jb$s^S<(XVSh3)-r-OuBW85JlF%V3& zrh>KJbYZlW9_1ni(3Nw?#Nk;z3j$HW_o?v8ugC;= zE_lez(PatVVi!|#;dm{0zLx}#WAni?rxn0sS_gQD&vU9`A9&iTgQ@0JFh@BV&SV_s zP_*vV&;Ro|A3yxJ7Cb=&APSNHn)$C1LOh03h~8-~-{+l03En6BGCmLYBzSUH-2lUM zQGk-ryfzg)amjXPY5au6<|06;?}P@McTB&x=EC5yE4kDbL7OM*)1z{)9*O{}BPG8bYxw zwcs(H3E`*+eC~@~U`puvWlio-GbV09yLV?tyIt=`6aV^3fQQT`G|i3_11PS%sKM}z z;ecmCGsC0G0S{LOMN`1zj-Pq^#$^azZ!89nCCUorZumznfWojWobaF`$!oMi(ayTp z<=VAty2Y*p*2gYCL5nPOz@!~ZfrpIqZ~-I9btk1ky_v`&d z^3^55Lqc`4tl9wmz!RPkb%94@HX$E)=5oNZkOQ7&O$d(}2Rzms@HmRVLqhe61KZ)i z?g9>YunR+goONph6oF;pf@c$f$7lw`kaLF9A=W|fMw3_}q3=_$Wg%Ighjd?Tc(^9P zo3jAgTvo&Zk7|>`GqXPMST!y@tEIv-pEo>ycFOSd$s>plw&#S$4&{OXJ!AnCiRB8F z1P>|}6^G{nbrm5w$bD&}TOmQ@wIsp&_-C#fjP;R~LGg_QfEo*)i7a@gHak2E>zsa5 zZ+PgmjDnOPc=GrWIIsRw2#>W0JoXX*+Jt413J)qC&qeAhLV}xN<3?n{ai7fSAwPH< zy!y=ds`bsID0l4S{Dao_q4_2_zIJ!y^351*|zetpOez9`KM+=9rDE85lA*`$~kz zQDZW=aR3y9Ws(UG`anteI#O2wlDy0_Nt>6Im33^4dtU9^P5Y|zq!6pe1L^<|iMA|R z03{$mjR}teK40vi2U`ASpdVxj1}LLoD_D(@ib! z9n$ssOJ)-b9h`{55@>p3Lpv_n&KJX-?((v_Wy{VAoW^{nG zeZ9LeLHA|t>G{FxE6<0f28&GyYpSf# zbv)s5X2G+b!b4^gUOauMrpzvSQsHq$d2s*~k7eQmPs%C;Xw@`4PJ`Gri>h>$l|QL> zHzw%5TyqoDzsAUG5L%zQ!1EIaK#2$tKX{Zl;hBk_dF}4aMoEF$dvp&!cq|$h9@{#? z6Yi|Z{9x|gxdDy{hctNH)VTplz;cPglOP42bW|q3j?$8c#ElO6_3p;#KXouj4chjl zi#h|)7c$}bZ^f0Bymt@r5S?m4)XLSIR?*`ujK12n>-0y2{l5et zE_l9`0uPC{Y*_#$AwUg*XFhhLckbV96o9I#svs7fd_xQl8VZl342p)rhpKyB1ftOZaKmPs-^isJB~atst8m-skQAY8~|-afa;S$F%Q4Lgq0f9m^yOu0BBqN-K_Aqu;39(zgaT}^5eas>RHVM z`7=lMiiPWv;PF(S1U?ARBNjkgu}oa>q_W`2qVN#qorZo;nyYacVS%?FMEW|q z;%DcDQO>sqHy~@&Av0X8p^_1xy5?@J33q7n4dV`0>_d1KHW(huhQfmleRNMgmP!12 zi?#;yg2x->#{p0(mZdK6qG&w*|pFIKl4Mq~-X-N7Fe|YA>k=?nR<=d4R%{a}X@VIlpvjOF= zGp!atY53W7g2!Mg6zNZeLVUhu<%}1~%F3V7JM{1H?Y`dKm>oa$M^_C5r#|r1%qDcq zs0|SB3<{K0j2q;Y7sIK`XPbO!l#0`bz`$~Gv%=#kVtJ13E0kEa!zDSq;MurhA_Q;% zl#XSR1Wz^xJcar-0Byt9iTE8+u9ou%6M=z&9r-%Y9qclrtiE?%!2nbrcu2J6!~!UV z0>n3ig1M`X&re@D*W>_IRXqa-uT@P3k1Gc}UNqV|T$&?2QapW_7d$?wK<(N9Wnj5d z=~xdNo*W7A6r*a3UGbMQxLS))91x7Yxs?k}tpJc8MTnrIm; z!tFuHSp!a9I^8sz;y$ke8&~Z{$r|Mg4@o(W^VFBU9wI`pL3gHfcu;-_P_VW_Er7DH zEOmotDr`r9cH#N_l?afX&T+y7FMzDAt%(oRMLEj#%8&*o{<&m?)dHv?iGO+()-HxRO!%@7pGW_lw z^o97qvx5LcUh7VQGz--m$V6AlhV%zrN3ZMr5bK9S8kjZe$^s}20cuG4O>9AYllnnr z2X{0&JpT47khR$hP8}|RCv-L1ofw@8^3}Is^!JiSl)2U0L?%3eY7-!o1yC)AJld5P zJUjK|p#-%Hm9gfp$H+u?%0_!>)`x^?9lrYNs~!rzYn~59fTY1AD|f3FKp1J%7oJ7< zzKho{HYq@N(GN01Kd7O(TYgw?1^BDKfRUYGG+9*T#akJ8{Fr?8*>GqZ_Z}eC*sY#F zwh!{7JiuqAqEvVS5S}1Zm<)iC=Zy?dU)mk?8-tOW)LI ztf&6VpRgk83lEVS3!roasJ@ARW_OiFn8X-LEFd}opYj<bs z!Q+i(-(8%{q~1vTo|EOpLU>5ZaR~nJ@!h$Mzrq9y2wlbQ0*JEL1Wz)@M}3k^cmgRv z;aUptSO!1^2oNuLP3|J*qMs&C?7 zVo_4FER{=Eg15r&E-c&vH?CL0Gi*%Kuq2)4E=EJ=&K`yGeFadQzZudKeZj+eDFaVj zuoc|7d4*rZckKcMpc5^cuO5m(ZS^#SoXGVMx^6igWuC->rv@NN@C2()fC#OrQUN-P z02LbWgJ%zFKfX>=9S?eXdOs32_yE)?Ha7O#Um0-J8k9B41}Fmol9szQ7mo|jNBWD= zQf2}?foB`*voCEvX`Nk9h2wws`1?<*Sp#Kax4> zttDS?ctTX=AW{ZE=dw0Qgl88Ep1tTmmk}RGbsSh&Sp3QxAUqEFAJc6$ENgUqdToH% z@GN%Ggy_NqC_8nK$(*=)`x;!ka~&?@uld~7^Kj_QVK|S+H*Hby^GA0>2u5ZCcm#=m zWT68ujhb-1uJDASHt__A4?O!&<@h{HWjxs0+Kwb_NCk)vRg-xC=ieB3RAs^=ErY^? z1yClMeo=TpAUr$h!k2T?~*IoO3685#Y?8z4J7yRXMOslo4Ltf!vvkZ|3b z1yD8uWEwVX@>OH?IO7p>I<#cA0nfN?D=sd@)QWWNH zMe4}&hKDFl20#}PAinS%S~&@h;xSiwEU2ic{3H_~!AwLlfk@F)@5Ly46)D?AO3$Dm z;ktL4I6xQB8a#UXxaqb#LZ8YNff1e4;}dMvD&e_%y%I74Z874SB7{fa^8{*67EXds zG*pBz?8>;{2`BK7$cw@gh1x6wpi2l)35UbX1ouQ>%C-;)jyUwDpEfO54ItC5NSBWzGcBtG65IB+1@grk>o zh~@pU4S%TyL$oGFPwyo5C`zmQLHsB zV)`@TC^up0IEcQ*zlCG;5kg;sUSX(&Lqe;nEM2o z_=K_{by{nCxtd*EJ~W7QsT?OGgJOz|-EVwa2q2>S5AK1zizc|BUlbH#Et~`&;BN~5 zVg-|16lYEylG^BvvmNDQ$c^%V^_udWli<1F5%@fz>JuSZBx^KAbCOhe;*`h37Fhsg zM(~2?80xt0Bsio!5%Sh9y+w=)WkWhZ=p=Q;;|Jz(UgdHKP+j0*?|$Qx7Sf{K#nEGX z!Nk0F28D~G8hE?wfRptS1|+fD4As?8Qk)KMRw}SH#=Bv&9Isu12wQcD85Gjs38IS8 znk<~hoNk~1QFu-gJeyI8QUI!Y_%9rD)8Pfrv6U0yBp%B(CqT|R)sut?%7)a;jP|Qm zts<$cJ#FHBwoYi^)=9oC3=ol@znRp;zl-N9Y5}yPU@O=d&IL2gsc@U;4N|d&LMY3N zQecC@9}R*h1f6EmZ6)c-3uhCOT&*Y(cw$80iDv+sECvv{5nOKlH4K=p-(?D*%`3IIBEaHrJ7zp_1fod0+4 z?oHU16AyQ9U+4W@WM7Ih1Sfdia;dpneBcSD@DQIT5?^PaKP1SY*s3*&6P|eGaj=yG zpna=n!Ct*7JmJBv3*jL;jn8)}kAXyU?Tv&9UI6Lp>XIm|yUj-DX$p?22#r#`;2~2o zS_42N+rr&dOX4K>oYW9rpTSHF6PYfDQ;sob!2w|q=hcWg? z)d`-H#QHD*O@uX-*MaDZ{y*@CfEH^MQx>JTdq> zS5KaqjzN@-U6}x$EvO_^DhEIZjAu%O=cojD<X=wI)D;;a~U27*OB7eM$GlYlV(? z7A#osJ{~`I*t}tff*t?#8}_Dctpy-viQy<$iId>ZpFSkzc0)Bd>dg=?Y}r!q2z;JI z?7BpAx6;(*gz#)drD;s!1gI|XoYt8D=MkWT=s@S1uQ)_lpiJ=E0^yyRGiMUodbvjX z*iFYstUmCNsi=Xetp}h}$MTUb*AZ18~rp*5vSn@PH?l`aBt$lZ116 zNZL&@{*AzstUMOdIRH9@0P%t66zR4Q9-<5Qyc8YiBs0wb!UAQ27eMW&O`Ap>>7Lqa z^+x^aru9k@yRf>#L)KyrYDEAMM|h))W~~egl75pOvtIJ8hg;XcL0h2_;h7-Jpr{W# zHC@(tC|o(YCU=W;Y1)$*cv2()bQl3*!*fgmJZDkov}*t=UOx7f`O?`l2@7-(k=H6^ z?TNG0t5>fc_`IKSsO_B@Hj?3ywslf)D*}ipKO>wocPr9sl|)DS^10&(kGxEH*7L|3 zZ47vX(U$6X*n!qZFbO_iLyiF`L%lXYM~r6HhG(U8cus4|LB8%EkC1`S2@8B3XrUuL zdi3b-c;Caxj9P4c}jIAK@OIW4bU+Jhz~sH8OcE2muO$Zs>Izl=_kJfb{__E4 zp-zj9lQ(x5GiJ<(#1FEIbSar<%?BRw4NO8)S|31HE}pDe5f#Jvqx*{>$WDn_IZ$gZoTD-g| z8&Rh?Ci#=w7j77VNrI=oxm%41PZ}x%wNrCK%_MjhKrb19rptuqBC$RMAZ^lpje*N0j{U9;}t$X+GACYd%(8u)tf;zxMR)G(f0uYIM$WA+V{<+os(O8n7aBV^Y z4_PVW7_+z~%UYeSsJTVa3gAhS0#7C?8_(@Wf9S|6#aaNJLVzU0Gl7Ap5_OfF(-;qh zS~H&X>)!brrtNEHsMc!_RbsL_QWMtCA;>YF0P`o09sdN|MX~`pgWX3oc56PHoWRc8 z2v(s*OV8ij>;N6vlP6rvTd>T^F^;?Pd-D>S1|HUgu!h2uMF3hp77EcHI?4giX#_|b zJjC);qTh23UzaJ3f()bO1*FY~4R6xdOW2M5@WT(p1OIfwtSO__95r4pM1c72 zH5$PJXd5-IEw&DgNNukK0l^{pJA}@9BJ#JLx+CaknT$?8Y2r%;jyot zsoqj0o8|DgHNWj5BU1v!8e}^HB)a2YGHXY}W^<&US3!h>iV&Vav_=o^-R6Ano~&3Q zJYKB;o^&bjn;uLzQmkq^o58s-G8;s zYMtd4f5URJZjS_b1Y0LXaR4NmHR>N`-(mn2C2VBiA&Wd^23bm8O>AFrz2T9SLBR_i zW&ZFKE~^2E-GyC1fY=T*f#)j1a}9M9&+S+=90D}{vLtQ%?YG}H*m-6HL`dv9V88&9 zT=tdK2J;I_>lT6%S|BcX)alkq(HsDYW{sMl6HU@@S^}U0MM(@iWPzuB*-?_yU``z5 z1y2wMJQ2+dPZ4Sx2S67QATD^WQg}|Pj)r`lIXBVzd`;U}FnO#|01`OUo%;9hPpr`A z8v1I>l-DhKrHTMaf=7!3pq+biYi-(=TaeIV3p@!{2fKXgpv3pxzH%OX$Ua=sCc!r| zJUJ5JA==IXP^ICt8hEtDEzfn-Ej+gkt&hj@*~ItxykEb5#QJnqG68ibr z31i2vv{8PcE&(30by7@nfLLRcU>C-Gin9hTI8AAy#s-H6(m`Kju zsvkTFV(|PIamj)wPYOKSmW_g)92V$`!L(YIhjd-nG{-~H(y=eK#toZA+O%)qz8^P6 z=q@#+CxlW`zqEBXi&I@YA2jh-%(Y!)M7%fWLf%~aZe73LysMRwTPa)Jbf7#ZM)oT4 zCX1ye{z-!;rY`U(H4L8ZOGiPe=2WP9c>llhKd*u-+7rd#A-at~?OXCYq#7(H`(S+8 z)YeDL7b3U#yL9RDS*K2&zBhN#|3?EM&_;;ZJN|755no#6Qsrq*c)Yz0Yo!=BOC+|* z1u83KZ>5>)W>}~6n|i_1fNo0w&kj`i+C^f!9X`KvofDq37`7LvPk%J1TeqR4Et#o1 zP2l@TjK~HK9N3493u&xWQPnY9^ooGP-to`USzWAaBCBTDIjsvNVk6f*y8Z>>d9uv(_t2O%MHV_ZzfC2M=s-^-Itl%1vk>JmY!8 zlgR;39#42m&^p~eby$3>s6<~OJU0-WJ9yl?cm!nVFDfN%N87LmZPRz!HN!(-g_w1O zdiLx&2)nW&R?hl2SFW802H1^>ZrYZS8&hjP3R~M{Oul-6pQ)I+ZMADUAK2Moc(yb( zJWEHyanIFa_4xv=|1FC}V(^?&9t{PWGyfg$cd9J!WNo?%P)Y7HEBT?aX*BR#3fh?l^CFVw($|W#aJc zTR9z`+`1~>eU)z$gXgOHSSVOJ?xnHZ(1oPUu~)RiG2n=9 z+E!4srM3fGxCQ<}YxFt*bPprMFtUPb3&T^y0naXkXRp>&xPRuTc$A4j$sK!Tq0e&{ z0ouNB1jJ~~_a|+Ieh;xeJ)6UEmerM!n{FTV@8AC`Jbv%!vLquWof+> zuDph8Hw*oUn^z!0eR8wHlg|^L!`7T7SOhD?3E8*Y{6F$0~o)`&c~18%LHB!uVSk`a)rJ@?9oojMJrZS-kN zc3qOXvhH2Gb|ro4*LWOeW21S?$Z$3jX_?Ulo&x<$;J%b4Xj`kE+`k8xkL(fC6{@R5 zhefp;u2EfQ>4u1IvUE#Cw}}pw3U!C-E`I*~a}~@|b&_^De0ro5ZW&Ay!gGB2NXS#4 zet&519>0^e>C&YOxfRvDCA%&zEA$Q>0{;LX14tj+w{NdemKLfH*BJf5ILv|to;Ix4 zh02R3+xEw3Y@sE3RFD9-^yG!`oK_wMxyn%`cz*jDJld5Bcf3}?4V{T%4l{u#Z`p)uQ^gU=qz$kw zz9wx#+onTnghy=lB6ZL{5kzJLA}f=nPt6Qwf;~bc*lW~LWTgyGi-i#CrUP+)rjQtH z2}x92gDfE#l@eqDsi-tmdY}blP-UXBP}za&AP1F;%0uM`nnOW=ITTVAQ5B=M`J2Ob ze>2#D+KJkQDj~w}E=BD|?LqBDpKTv%KdOwX+}8vSpbnxA`L2b-s3WMOK5O9^qcu>0 zI*vNAaSfbAo!Yn>PNU9HoufLBy0Fn0E^aV}OQ=fJWz>}oMvSg`*XTOxhPNTyB(OMZ z!gUNxt|Bzo1h*$dEYB&WQRs+Id`{sJL|mWHHtE=!;bGtEVA6po{ojunIaI;QWcdSg zy&2#{x-r%=D_r^NqKSW^85E*>jk0(A6KvWRMfcqzTPF#2ze%7Qn2x^i-@WmaUT9RHX2cbPR6l?~6aWxqp? z(xj)_qrRU{;rW_IT< z=xQ0V;7JQu2fNXCBHBY%T&LQX5zc5os*I`}b%5$%Mi?9-N)Lm>s3TNIQOBq%(nH}m z)rquFI7xMi>U3HNoI#zXI!ARrH3Tj&3WkfQOH`Fqmr+-UQi9=XN)TM5x{kU*lpF*% zQMVWc!g>5r@qtHhe@ie(SpN42$XTIyf7aKZP9b$o>%2E@gO07uY33W5b)py0=i`q* zCKvR5&z@a>b+gtvWvZzFu4@n+tS~nYcs6iYo`c27Z@hnV*-=em1_c|QJIvIK@ld+( zH^|YRd->;2dyOJ>OzXN2D_nnV;E@DTZ#szeUAK-Me|E9b&oS3h1Q(-O;7NQS8Ssz{ zibKU)-*|woAV7TKxw2v`6#X?EQg#0-`J`*tVWe(p9ru3S;o*Xa^uwRL_uhMhdiCn{ z13n*WW~l6Fqd%|OURM#k5h8E2MBWnM33^Kay6T`N5uR(*=OI?-IGM}5WbDgG)w#YM zJ9hku)G5~O7t~>XzcmdMHl|P1jfRt-_vzDzKs02`$e(67n<(G3(wG9?#PH z!EX&fsuJP3jpxao_0mP?@2F4zM`zS`Zo9pXJ`Z0@)RB%wkQ;fQ zAw=Kf@yDKByZ+*`PCMIHXT~cxJw@hKNh-Mcq2!$Z1u?fR>WiF$&Q&a4-1TJjKr z-CEchlraG)@y!RwPDN;Shz>3r33*G#yiC$wko{SYu4L!rA+)Xr(z@%>5;F>03q%6v znwa1I_=_6cty?$78V&#H+o>L=D~>p-$-mm5J(U?GJhpACFeT@WyFEd#>9&Ik1I{t! zQBbhxcSzTscV^Cz!Lv!7kh;M-`j*rctuukM{8qukgi*+zatHftX&KRi$_7W?t+`HOJ}X?+Ogv=vO|sig z_48H@leo2c0aX`Iz||;s*rPcW@|RD5QfI^GJ2yup4;wOMB)L{{&9u83Kn$PzaxDMYo*}y zp>@#hZT5BQYmGWkQ~f@j2u0F|22zW}bZukDjvZZ8RA6yDduHI0bBe$mElC|vB%5n7lUdf~vKhP_Pso zO;aRe4e0M2`D;50r+@6pQrkj`@yt8AkAEQbeY4#T4h$KetBDi6;dfd{7!!2P48aCdh$+$czZ%A^1|8DI&A95kTR za1InGjf3o^qah2SEwWUHeZj6TkLRV_KVH6X+m0POY*(*dJ%c10kTR08k}{LB(`)#Y zUQ?UJX(o_5(P8@@G&1==dN1fp0ZioA&5S1vA3ic7B0?E~@;rb3eE!ALCoZ4byZz;! zqzEVua)t~SBSO-l&JseC3es!`aM??Mr|01gNiRG{-=NK>SR?Wr4L~>1US2{!XpRPxLbwSjcCS z@1VeZPQSZ1EsH2LY-`g7PAi3}D;;?IfI6q2P)D^NwFm=fV-sKGOVaqnVh|9hzNh+* z!ZDZv@+JMBLG&{|qo3J_en&6*o!w~}+Msz&VS1M~T1V=fcA;Y`?^FLt0M9dWQv?sJPz4{+ze&@&8&wMqC>jgdqR`002ovPDHLkV1icH B@!$Xe literal 6464 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 B0*L?s diff --git a/android/ConductorsPhone/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/ConductorsPhone/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index b824ebdd48db917eea2e67a82260a100371f8a24..2f2c97c60aa4191fc3ce62e391c3f646d20d43b4 100644 GIT binary patch literal 20101 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 diff --git a/android/ConductorsWatch/app/build.gradle b/android/ConductorsWatch/app/build.gradle index 129c2f4..51b4425 100644 --- a/android/ConductorsWatch/app/build.gradle +++ b/android/ConductorsWatch/app/build.gradle @@ -9,8 +9,8 @@ android { minSdkVersion 23 targetSdkVersion 26 //sdk 2 | product version 3 | build num 2 | multi-apk 2 - versionCode 260120101 - versionName "0.1.2" + versionCode 260130301 + versionName "0.1.3.2" } buildTypes { release { @@ -22,6 +22,7 @@ android { wear1 { dimension "minSdk" // Use the defaultConfig value + minSdkVersion 23 } wear2 { dimension "minSdk" @@ -36,8 +37,8 @@ android { } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.google.android.support:wearable:2.1.0' + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.google.android.support:wearable:2.2.0' implementation 'com.google.android.gms:play-services-wearable:11.8.0' implementation 'com.android.support:percent:26.1.0' implementation 'com.android.support:animated-vector-drawable:26.1.0' @@ -45,6 +46,6 @@ dependencies { implementation 'com.android.support:support-v4:26.1.0' implementation 'com.android.support:recyclerview-v7:26.1.0' implementation 'com.android.support:wear:26.1.0' - compileOnly 'com.google.android.wearable:wearable:2.1.0' + compileOnly 'com.google.android.wearable:wearable:2.2.0' compile 'com.github.wendykierp:JTransforms:3.1' } diff --git a/android/ConductorsWatch/app/src/main/java/de/tonifetzer/conductorswatch/Estimator.java b/android/ConductorsWatch/app/src/main/java/de/tonifetzer/conductorswatch/Estimator.java index 5bb93f0..c63e38e 100644 --- a/android/ConductorsWatch/app/src/main/java/de/tonifetzer/conductorswatch/Estimator.java +++ b/android/ConductorsWatch/app/src/main/java/de/tonifetzer/conductorswatch/Estimator.java @@ -30,7 +30,7 @@ public class Estimator implements SensorEventListener { private SensorManager mSensorManager; private Sensor mAccelerometer; - private Sensor mGyroscope; + private Sensor mRawAccelerometer; private Context mContext; private AccelerometerWindowBuffer mAccelerometerWindowBuffer; private BpmEstimator mBpmEstimator; @@ -50,11 +50,11 @@ public class Estimator implements SensorEventListener { mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE); mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION); - mGyroscope = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); + mRawAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_FASTEST); - mSensorManager.registerListener(this, mGyroscope, SensorManager.SENSOR_DELAY_FASTEST); + mSensorManager.registerListener(this, mRawAccelerometer, SensorManager.SENSOR_DELAY_FASTEST); - mAccelerometerWindowBuffer = new AccelerometerWindowBuffer(1024, 256); + mAccelerometerWindowBuffer = new AccelerometerWindowBuffer(6000, 1500); mBpmEstimator = new BpmEstimator(mAccelerometerWindowBuffer, 0, 5000); mTimer.scheduleAtFixedRate(new TimerTask() { @@ -110,9 +110,8 @@ public class Estimator implements SensorEventListener { mByteStreamWriterAcc.reset(); } - if (se.sensor.getType() == Sensor.TYPE_GYROSCOPE) { - //TODO: Rename AccelerometerData to SensorData3D - mByteStreamWriterGyro.writeSensor3D(Sensor.TYPE_GYROSCOPE, se.values[0], se.values[1], se.values[2]); + if (se.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { + mByteStreamWriterGyro.writeSensor3D(Sensor.TYPE_ACCELEROMETER, se.values[0], se.values[1], se.values[2]); mStreamer.sendByteArray(mByteStreamWriterGyro.getByteArray()); mByteStreamWriterGyro.reset(); diff --git a/android/ConductorsWatch/app/src/main/java/de/tonifetzer/conductorswatch/bpmEstimation/AccelerometerWindowBuffer.java b/android/ConductorsWatch/app/src/main/java/de/tonifetzer/conductorswatch/bpmEstimation/AccelerometerWindowBuffer.java index 5f666a9..f9ec264 100644 --- a/android/ConductorsWatch/app/src/main/java/de/tonifetzer/conductorswatch/bpmEstimation/AccelerometerWindowBuffer.java +++ b/android/ConductorsWatch/app/src/main/java/de/tonifetzer/conductorswatch/bpmEstimation/AccelerometerWindowBuffer.java @@ -12,35 +12,49 @@ public class AccelerometerWindowBuffer extends ArrayList { private int mOverlapSize; private int mOverlapCounter; - public AccelerometerWindowBuffer(int windowSize, int overlap){ - mWindowSize = windowSize; - mOverlapSize = overlap; - mOverlapCounter = 1; + public AccelerometerWindowBuffer(int windowSize_ms, int overlap_ms){ + mWindowSize = windowSize_ms; + mOverlapSize = overlap_ms; + mOverlapCounter = 0; } //TODO: add exception handling. falseArgument if ad has no numeric x,y,z public boolean add(AccelerometerData ad){ synchronized (this){ + //do not add duplicates! - if (!isEmpty() && getYongest().equals(ad)) { + if(!isEmpty() && getYongest().equals(ad)){ return false; } - boolean r = super.add(ad); - if (size() > mWindowSize) { - removeRange(0, size() - mWindowSize); + // current - last to increment overlap time + if(!isEmpty()){ + mOverlapCounter += ad.ts - getYongest().ts; } - ++mOverlapCounter; + //add element + boolean r = super.add(ad); + if ((getYongest().ts - getOldest().ts) > mWindowSize){ + + long oldestTime = getYongest().ts - mWindowSize; + for(int i = 0; i < size(); ++i) { + if (get(i).ts > oldestTime) { + break; + } + remove(i); + } + } return r; } } public boolean isNextWindowReady(){ - if((size() > mWindowSize / 2) && mOverlapCounter > mOverlapSize){ - mOverlapCounter = 1; + if(!isEmpty()){ + if(((getYongest().ts - getOldest().ts) > mWindowSize / 2) && mOverlapCounter > mOverlapSize){ + mOverlapCounter = 0; - return true; + return true; + } } return false; } diff --git a/android/ConductorsWatch/app/src/main/java/de/tonifetzer/conductorswatch/bpmEstimation/BpmEstimator.java b/android/ConductorsWatch/app/src/main/java/de/tonifetzer/conductorswatch/bpmEstimation/BpmEstimator.java index e9dac56..824687e 100644 --- a/android/ConductorsWatch/app/src/main/java/de/tonifetzer/conductorswatch/bpmEstimation/BpmEstimator.java +++ b/android/ConductorsWatch/app/src/main/java/de/tonifetzer/conductorswatch/bpmEstimation/BpmEstimator.java @@ -58,13 +58,16 @@ public class BpmEstimator { //just look at the newest 512 samples //List subBuffer = mBuffer.subList(mBuffer.size() - 512, mBuffer.size()); - double[] xAutoCorr = new AutoCorrelation(interp.getX(), 512).getCorr(); - double[] yAutoCorr = new AutoCorrelation(interp.getY(), 512).getCorr(); - double[] zAutoCorr = new AutoCorrelation(interp.getZ(), 512).getCorr(); + double[] xAutoCorr = new AutoCorrelation(interp.getX(), fixedWindow.size()).getCorr(); + double[] yAutoCorr = new AutoCorrelation(interp.getY(), fixedWindow.size()).getCorr(); + double[] zAutoCorr = new AutoCorrelation(interp.getZ(), fixedWindow.size()).getCorr(); - Peaks pX = new Peaks(xAutoCorr, 50, 0.1f, 0, false); - Peaks pY = new Peaks(yAutoCorr, 50, 0.1f, 0, false); - Peaks pZ = new Peaks(zAutoCorr, 50, 0.1f, 0, false); + + //find a peak within range of 250 ms + int peakWidth = (int) Math.round(250 / sampleRate); + Peaks pX = new Peaks(xAutoCorr, peakWidth, 0.1f, 0, false); + Peaks pY = new Peaks(yAutoCorr, peakWidth, 0.1f, 0, false); + Peaks pZ = new Peaks(zAutoCorr, peakWidth, 0.1f, 0, false); mBpmHistory_X.add(pX.getBPM(sampleRate)); mBpmHistory_Y.add(pY.getBPM(sampleRate)); @@ -88,7 +91,7 @@ public class BpmEstimator { //mResetCounter = 0; } else { - int resetAfter = (int) Math.round(mResetLimit_ms / (mBuffer.getOverlapSize() * sampleRate)); + int resetAfter = (int) Math.round(mResetLimit_ms / (mBuffer.getOverlapSize())); if(++mResetCounter > resetAfter){ mBpmHistory.clear(); diff --git a/android/ConductorsWatch/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/ConductorsWatch/app/src/main/res/mipmap-hdpi/ic_launcher.png index cde69bcccec65160d92116f20ffce4fce0b5245c..f6efd77e4355ac768493586aef04236746854272 100644 GIT binary patch literal 5367 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 VPd_xL63_qu002ovPDHLkV1jh~5e5JN literal 3418 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 VFwL6zQVak9002ovPDHLkV1ldB3B&*Z diff --git a/android/ConductorsWatch/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/ConductorsWatch/app/src/main/res/mipmap-xhdpi/ic_launcher.png index bfa42f0e7b91d006d22352c9ff2f134e504e3c1d..ec1d0fe702e0342b851dba7a61f8cded09abd700 100644 GIT binary patch literal 7467 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⪌AVp5@h~e9)6kLWGd62T=Bp_`ELq0V4Y~)zb$rHle}0Ce0F4T z16szp7i2*0`4kFw*~pz>NZ+@EdiVvtj`lY45^SOm1%9Lq{MZ5DCqhZ z+U-v1nMX#v^juMTi^2fk-+Te3$9YS)67Ln}JfrMPd1mJC9R&VS=opl-;Rm`KD&COk zh5`5Rd1W)7!7taH-1|^hdEE;;9lgwc+1mi0Ckvn55~{@+AihQE#_g-(`?65G@7%vN z;ug@w2mZkU;HR$pp3Ax zs{~EHRiUT+;%-%9v*IkFnf`0_ilO^z>^ z{SFjsT-N;eTG6T+A$)dTQxE;Z1>S&s7{KmIG{Nu7D@zs952Ru~u+vJ7O7k!Doh|R) z-skwpaNsA%gAeEu_$SwXM>hlpJhWTc2Y!`UjkWqJZ@-lL#MDJAtN^}K0-xQ9ZU6%= z@&**#z9K!fb~JSlYIgUC4Y-)Hi}s-OHOqX*P{fT~&IMU0&KiFsR{;2;Ma&%SgkYlqnCQGu(sW@ z)d1fvIVNs|l60P*r54}0LFV|KcE6QQQL9CJ~ZL0>4&Qsk2&dlFm!NQ(jXv_ceXHoIX#ZMNVbdR z=BdlU-?mMkDk?_a4?Mw)xLM9uoR#0sr6|Ms!-Air-aqrx1@KSv@XxLJmMYW5oqy-u ze5x^sTEj$muoYAe4dK0k_4SPdp&bvl!n?$>Kg`TP}rTaDSd!i7|@=X$ic7InbcLUJ<0o(!npeX7$_=HNGIPr6d4t^Cfo(HzVKXUoO$E|!aWT=^R$*lw0L+tWoK5dZ~Y zcp74@Mq$uS7!?UcL%Z>s7$^?fhm4Dd4p^wtA#+tqgp$k`P_o$qI)-6j8g$%rK4m~B zQ5sG|SC5Aw3;L2ed3A z@_Njx>FQ}}hUyQ8NZ0fq=y6NRQuwvv(M}hu`J=Y%3>5C@n7u4j9lR}6A2awn1n`5Q zFl2f20B87LX0*b5A^gg|@LOv2CT$ya9q#iCQGF~HECToD8QdE?xz^FwYOd`xtOM0 zkQNhjG1{f#+P)n62tbl zWF^j^TW4P%_frpG`j^(a%CE{UrP~xAkGXt3#_Mrzv}@Px#4xJ3luk_#imBsq19xK_ zH+x0t=sPS-UcGKy@R-F&- zeT{$fU&oDwTr++S{i(I4T(3MQBl2GAo}8k1|JGZ3Jm^-m3l%}d(4AdwbZ?I*-H-92 z`@3AJEXtW4Ko29Gs65KKr*fBDRqcU*laDeJd^^jE*5f@th5mVr@X(F;8EYBP>rE9E zZ&qfej4$5rJN~M#!T76|YU9}*h(ZOjBn1|Kfdw)^ltOi?JAsu^5Z77>m&q{|^~RkMEyj+&BOL002ovPDHLkV1nnRu`2)o literal 4842 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 diff --git a/android/ConductorsWatch/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/ConductorsWatch/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 324e72cdd7480cb983fa1bcc7ce686e51ef87fe7..10388b578bc4e62a5c5423cef575be3b9ffcf98a 100644 GIT binary patch literal 11948 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 diff --git a/android/ConductorsWatch/build.gradle b/android/ConductorsWatch/build.gradle index e6b32bc..3c64aec 100644 --- a/android/ConductorsWatch/build.gradle +++ b/android/ConductorsWatch/build.gradle @@ -3,8 +3,11 @@ buildscript { repositories { - google() + maven { + url "https://maven.google.com" + } jcenter() + google() } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' @@ -17,8 +20,11 @@ buildscript { allprojects { repositories { - google() + maven { + url "https://maven.google.com" + } jcenter() + google() } } diff --git a/android/ConductorsWatch/gradle.properties b/android/ConductorsWatch/gradle.properties index aac7c9b..7abc0b5 100644 --- a/android/ConductorsWatch/gradle.properties +++ b/android/ConductorsWatch/gradle.properties @@ -10,6 +10,7 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx1536m +android.enableD8=true # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit diff --git a/java/src/main/java/Main.java b/java/src/main/java/Main.java index 659a841..f5f124a 100644 --- a/java/src/main/java/Main.java +++ b/java/src/main/java/Main.java @@ -16,7 +16,8 @@ import java.util.stream.IntStream; public class Main { public static void main(String [ ] args) { - File folder = new File("/home/toni/Documents/programme/dirigent/measurements/wearR"); + //File folder = new File("/home/toni/Documents/programme/dirigent/measurements/lgWear"); + File folder = new File("/home/toni/Documents/programme/dirigent/measurements/peter_failed"); File[] listOfFiles = folder.listFiles(); Utils.ShowPNG windowRaw = new Utils.ShowPNG(); @@ -30,7 +31,8 @@ public class Main { for (File file : listOfFiles) { if (file.isFile() && file.getName().contains(".csv")) { - AccelerometerWindowBuffer accWindowBuffer = new AccelerometerWindowBuffer(1024, 256); + //TODO: mach Fenster genau 6 sekunden groß. Egal wie viele Samples. + AccelerometerWindowBuffer accWindowBuffer = new AccelerometerWindowBuffer(6000, 1500); BpmEstimator bpmEstimator = new BpmEstimator(accWindowBuffer, 0, 5000); //read the file line by line @@ -40,7 +42,7 @@ public class Main { String[] measurement = line.split(";"); //if linear acc - if(measurement[1].equals("2")){ + if(measurement[1].equals("10")){ long ts = Long.parseLong(measurement[0]); double x = Double.parseDouble(measurement[2]); double y = Double.parseDouble(measurement[3]); @@ -54,8 +56,9 @@ public class Main { double curBpm = bpmEstimator.estimate(); //System.out.println("BPM: " + curBpm); - - AccelerometerInterpolator acInterp = new AccelerometerInterpolator(accWindowBuffer, 5); + double sampleRate = 20; + AccelerometerInterpolator acInterp = new AccelerometerInterpolator(accWindowBuffer, sampleRate); + int peakWidth = (int) Math.round(250 / sampleRate); //print raw x,y,z double[] dTs = IntStream.range(0, accWindowBuffer.getTs().length).mapToDouble(i -> accWindowBuffer.getTs()[i]).toArray(); @@ -70,9 +73,9 @@ public class Main { windowRaw.set(plotRaw.draw()); //auto corr - double[] xAutoCorr = new AutoCorrelation(acInterp.getX(), 512).getCorr(); - double[] yAutoCorr = new AutoCorrelation(acInterp.getY(), 512).getCorr(); - double[] zAutoCorr = new AutoCorrelation(acInterp.getZ(), 512).getCorr(); + double[] xAutoCorr = new AutoCorrelation(acInterp.getX(), accWindowBuffer.size()).getCorr(); + double[] yAutoCorr = new AutoCorrelation(acInterp.getY(), accWindowBuffer.size()).getCorr(); + double[] zAutoCorr = new AutoCorrelation(acInterp.getZ(), accWindowBuffer.size()).getCorr(); //print autocorr int[] tmp = IntStream.rangeClosed(-((xAutoCorr.length - 1)/2), ((xAutoCorr.length - 1)/2)).toArray(); @@ -86,10 +89,11 @@ public class Main { windowAuto.set(plotCorr.draw()); - Peaks pX = new Peaks(xAutoCorr, 50, 0.1f, 0, false); + Peaks pX = new Peaks(xAutoCorr, peakWidth, 0.1f, 0, false); + int xOffset = xAutoCorr.length / 2; LinkedList peaksX = pX.getPeaksIdx(); - double[] dPeaksXX = IntStream.range(0, peaksX.size()).mapToDouble(i -> (peaksX.get(i) - 512)).toArray();//peaks.stream().mapToDouble(i->i).toArray(); + double[] dPeaksXX = IntStream.range(0, peaksX.size()).mapToDouble(i -> (peaksX.get(i) - xOffset)).toArray();//peaks.stream().mapToDouble(i->i).toArray(); double[] dPeaksXY = IntStream.range(0, peaksX.size()).mapToDouble(i -> (xAutoCorr[peaksX.get(i)])).toArray(); Plot plotPeaksX = Plot.plot(Plot.plotOpts(). title("Peak Detection on X"). @@ -100,10 +104,11 @@ public class Main { windowPeaksX.set(plotPeaksX.draw()); - Peaks pY = new Peaks(yAutoCorr, 50, 0.1f, 0, false); + Peaks pY = new Peaks(yAutoCorr, peakWidth, 0.1f, 0, false); + int yOffset = yAutoCorr.length / 2; LinkedList peaksY = pY.getPeaksIdx(); - double[] dPeaksYX = IntStream.range(0, peaksY.size()).mapToDouble(i -> (peaksY.get(i) - 512)).toArray();//peaks.stream().mapToDouble(i->i).toArray(); + double[] dPeaksYX = IntStream.range(0, peaksY.size()).mapToDouble(i -> (peaksY.get(i) - yOffset)).toArray();//peaks.stream().mapToDouble(i->i).toArray(); double[] dPeaksYY = IntStream.range(0, peaksY.size()).mapToDouble(i -> (yAutoCorr[peaksY.get(i)])).toArray(); Plot plotPeaksY = Plot.plot(Plot.plotOpts(). title("Peak Detection on Y"). @@ -114,10 +119,11 @@ public class Main { windowPeaksY.set(plotPeaksY.draw()); - Peaks pZ = new Peaks(zAutoCorr, 50, 0.1f, 0, false); + Peaks pZ = new Peaks(zAutoCorr, peakWidth, 0.1f, 0, false); + int zOffset = zAutoCorr.length / 2; LinkedList peaksZ = pZ.getPeaksIdx(); - double[] dPeaksZX = IntStream.range(0, peaksZ.size()).mapToDouble(i -> (peaksZ.get(i) - 512)).toArray();//peaks.stream().mapToDouble(i->i).toArray(); + double[] dPeaksZX = IntStream.range(0, peaksZ.size()).mapToDouble(i -> (peaksZ.get(i) - zOffset)).toArray();//peaks.stream().mapToDouble(i->i).toArray(); double[] dPeaksZY = IntStream.range(0, peaksZ.size()).mapToDouble(i -> (zAutoCorr[peaksZ.get(i)])).toArray(); Plot plotPeaksZ = Plot.plot(Plot.plotOpts(). title("Peak Detection on Z"). @@ -142,10 +148,10 @@ public class Main { } // line is not visible here. - double meanBPM = bpmEstimator.getMeanBpm(); - double medianBPM = bpmEstimator.getMedianBPM(); + //double meanBPM = bpmEstimator.getMeanBpm(); + //double medianBPM = bpmEstimator.getMedianBPM(); //System.out.println("MEAN BPM: " + Math.round(meanBPM)); - System.out.println("MEDIAN BPM: " + Math.round(medianBPM)); + //System.out.println("MEDIAN BPM: " + Math.round(medianBPM)); } catch (IOException e) { e.printStackTrace(); diff --git a/java/src/main/java/bpmEstimation/AccelerometerWindowBuffer.java b/java/src/main/java/bpmEstimation/AccelerometerWindowBuffer.java index 889ce95..09103a8 100644 --- a/java/src/main/java/bpmEstimation/AccelerometerWindowBuffer.java +++ b/java/src/main/java/bpmEstimation/AccelerometerWindowBuffer.java @@ -8,14 +8,14 @@ import java.util.ArrayList; */ public class AccelerometerWindowBuffer extends ArrayList { - private static int mWindowSize; - private static int mOverlapSize; - private int mOverlapCounter; + private static int mWindowSize; // in ms + private static int mOverlapSize; // in ms + private long mOverlapCounter; public AccelerometerWindowBuffer(int windowSize, int overlap){ mWindowSize = windowSize; mOverlapSize = overlap; - mOverlapCounter = 1; + mOverlapCounter = 0; } //TODO: add exception handling. falseArgument if ad has no numeric x,y,z @@ -26,20 +26,33 @@ public class AccelerometerWindowBuffer extends ArrayList { return false; } - boolean r = super.add(ad); - if (size() > mWindowSize){ - removeRange(0, size() - mWindowSize); + // current - last to increment overlap time + if(!isEmpty()){ + mOverlapCounter += ad.ts - getYongest().ts; } - ++mOverlapCounter; + //add element + boolean r = super.add(ad); + if ((getYongest().ts - getOldest().ts) > mWindowSize){ + + long oldestTime = getYongest().ts - mWindowSize; + for(int i = 0; i < size(); ++i) { + if (get(i).ts > oldestTime) { + break; + } + remove(i); + } + } return r; } public boolean isNextWindowReady(){ - if((size() > mWindowSize / 2) && mOverlapCounter > mOverlapSize){ - mOverlapCounter = 1; + if(!isEmpty()){ + if(((getYongest().ts - getOldest().ts) > mWindowSize / 2) && mOverlapCounter > mOverlapSize){ + mOverlapCounter = 0; - return true; + return true; + } } return false; } diff --git a/java/src/main/java/bpmEstimation/BpmEstimator.java b/java/src/main/java/bpmEstimation/BpmEstimator.java index ac90867..8440bdd 100644 --- a/java/src/main/java/bpmEstimation/BpmEstimator.java +++ b/java/src/main/java/bpmEstimation/BpmEstimator.java @@ -51,13 +51,15 @@ public class BpmEstimator { AccelerometerInterpolator interp = new AccelerometerInterpolator(mBuffer, sampleRate); - double[] xAutoCorr = new AutoCorrelation(interp.getX(), 1024).getCorr(); - double[] yAutoCorr = new AutoCorrelation(interp.getY(), 1024).getCorr(); - double[] zAutoCorr = new AutoCorrelation(interp.getZ(), 1024).getCorr(); + double[] xAutoCorr = new AutoCorrelation(interp.getX(), mBuffer.size()).getCorr(); + double[] yAutoCorr = new AutoCorrelation(interp.getY(), mBuffer.size()).getCorr(); + double[] zAutoCorr = new AutoCorrelation(interp.getZ(), mBuffer.size()).getCorr(); - Peaks pX = new Peaks(xAutoCorr, 50, 0.1f, 0, false); - Peaks pY = new Peaks(yAutoCorr, 50, 0.1f, 0, false); - Peaks pZ = new Peaks(zAutoCorr, 50, 0.1f, 0, false); + //find a peak within range of 250 ms + int peakWidth = (int) Math.round(250 / sampleRate); + Peaks pX = new Peaks(xAutoCorr, peakWidth, 0.1f, 0, false); + Peaks pY = new Peaks(yAutoCorr, peakWidth, 0.1f, 0, false); + Peaks pZ = new Peaks(zAutoCorr, peakWidth, 0.1f, 0, false); mBpmHistory_X.add(pX.getBPM(sampleRate)); mBpmHistory_Y.add(pY.getBPM(sampleRate)); @@ -80,9 +82,12 @@ public class BpmEstimator { mResetCounter = 0; } else { - int resetAfter = (int) Math.round(mResetLimit_ms / (mBuffer.getOverlapSize() * sampleRate)); + int resetAfter = (int) Math.round(mResetLimit_ms / (mBuffer.getOverlapSize())); if(++mResetCounter > resetAfter){ mBpmHistory.clear(); + + mBuffer.clear(); + mMvg.clear(); mResetCounter = 0; } return -1; diff --git a/java/src/main/java/utilities/MovingFilter.java b/java/src/main/java/utilities/MovingFilter.java index e4f883d..5263ed9 100644 --- a/java/src/main/java/utilities/MovingFilter.java +++ b/java/src/main/java/utilities/MovingFilter.java @@ -30,4 +30,9 @@ public class MovingFilter { public double getMedian() { return Utils.median(mSamples); } + + public void clear(){ + mSamples.clear(); + mTotal = 0d; + } } diff --git a/matlab/AutoCorrMethodNew_Watch.m b/matlab/AutoCorrMethodNew_Watch.m index 90f9c5a..ed967e9 100644 --- a/matlab/AutoCorrMethodNew_Watch.m +++ b/matlab/AutoCorrMethodNew_Watch.m @@ -42,7 +42,8 @@ %files = dir(fullfile('../../measurements/lgWear/', '*.csv')); -files = dir(fullfile('../../measurements/wearR/', '*.csv')); +%files = dir(fullfile('../../measurements/wearR/', '*.csv')); +files = dir(fullfile('../../measurements/peter_failed/', '*.csv')); for file = files' @@ -51,7 +52,7 @@ for file = files' %draw the raw acc data m_idx = []; - m_idx = (measurements(:,2)==2); + m_idx = (measurements(:,2)==10); m = measurements(m_idx, :); %Interpolate to generate a constant sample rate to 250hz (4ms per sample) @@ -76,13 +77,15 @@ for file = files' figure(3); plot(m(:,1),m(:,5)) %z legend("z", "location", "eastoutside"); + + waitforbuttonpress(); %save timestamps timestamps = m(:,1); data = m(:,3); %only z %TODO: Different window sizes for periods under 16.3 s - window_size = 4096; %about 2 seconds using 2000hz, 16.3 s using 250hz + window_size = 2048; %about 2 seconds using 2000hz, 16.3 s using 250hz overlap = 256; bpm_per_window_ms = []; bpm_per_window = [];