基于智能手机的加速计进行计步实现。

来源:互联网 发布:oracle需要使用的端口 编辑:程序博客网 时间:2024/04/30 08:07

最近在研究如何使用 IPHONE手机进行计步,网上找了些资料,基本上是基于加速计原理。至于什么是加速计,加速计的使用原理大家就到google 上了,这里不讲这部份。

在研究中,根据自己搜到的资料,有使用差分法,离散,快速傅里叶变换来进行过滤提取,但是,由于我毕业多年了,这些大学里的算法,我也忘得七七八八了,现在看到这些就有点乱,一时间都识不了这些数学符号了,想要看懂这些,对我来说,可能需要一个来到两周的复习,估计可以免强看懂这些算法吧。但目前也没有心思来复习了,因此自己根据自己的一些粗方法,然后一步步缩小识别范围来提取最终的走路步数。

下面计一下我的方法:希望能对和我一样,对数学已经忘记多年的朋友能有帮助,至于对算法高手的就不要见笑了。

准备工作,为了能更好的分析走路的频率,我自己写了个监控,采集数据模块。见图:


有了这个观察工具之后,就可以进行必要的分析了。

1。利用重力感应的加速计进行数据采集,想必大家用过加速计的话,可以看到得到的数据向量值相对较小,变化也特别细,(x,y,z)。

2。对加速计的数据进行处理,当然我这也是使用目前传统的做法,sqrt(x2*y2*z2); 但我对这个数据进行了放大20倍进行观察。

3。关键:这里需要对采集到的数据进行观察。见我的采集数据分析。

手拿iphone平放在手撑上,极力保持走路中平行不易受震动影响(主要是想在这种小震动能不能测出步数)见图:


从图中的蓝色线可以看到几乎是比较平整的线形分布。

再来看将手机放在上衣口袋里时采集到数据进行分析:


数据中这里是两步,有明显的步调波动。

下面再来看一下放在裤代里产生的步调频率,如图:


其中波峰较大的(蓝色),是有手机在代的脚的落脚点,右这的哪个小波峰是没有手机的落脚点。可见在行走过程中会产生这样一个周期性的变化。


4。现在分析出数据图样之后,一个问题就是如何从这些不规测的数据中提正确提取出步调。

因此这里会用到滤波,大家可以从图中看到红色线条部分,就是我进行滤波之后得出的图样,我把所有波峰虑为高信号输入,波谷滤为低信号输入

因此经滤波后就可以看到一高一低的信号,但信号中还是有波杂波,(什么意思呢?)就是因滤波之后,原来多个连续波峰有可能被变为一高一低的连续频率。

因此在这里需要检测出步调产生的连续波峰。这也是比较难提取的地方了。通常说波峰对于尖角波峰波从可以利用  data[N-1] <data[N],data[N]>data[N+1]可以得到第N点是波峰,同样波谷也可以用data[N-1]>data[N],data[N]<data[N+1],但是经滤波后产生的不是尖角波峰,而是阶梯波峰,哪么就不能彩用上面的方式进行提取了。

几图:


5。进行步数提取,从上面的步骤后,可以看到经最后的滤波后有小小的杂波。哪现在就是要对这些杂波进行分析取样,变为最终的符会人的走路周期。我这里也没有很好的算法进行提取,只是利用连续的波峰时间差进行区分,如当前收到的为低信号时,下一个数据为高信号,哪么在这个变化点记录下此时的低信号时间点,同时记下高信号的时间点。先看图样吧,光文字有点乱。



如何判断为连续波峰(目的用于作为一个步数大小进行计算。)如上图,在第一步变化区时记录下LowBeginTime记为ls ,HighBeginTime记为hs,当第一次变化后,一直在高信号区输出,认为信号源是没有变化的,这时只需要刷新高信号的时间点即可,一直等到第二次变化区出现(由高信号变为低信号)这时需要及时记录下变化时的高信号时间点hs1, 和低信号的时间点ls1,然后就是低信号不变,一直输入到第三次变化区,这时又会碰到一个高信号的时间点,hs2,得用hs2-hs1之间的时间差如果小于X阀值则认为是连续的。此时如果这两个波峰被判断为连接哪么低信号就需要被刷新到ls2了。如果被判断不为连续,哪么此时ls1-ls就是一个步数所变化时间T,如果T在人的频率范围,哪么就可以作为一步计算了。这个判断方法的好处在于可以将人为的不断摇手机产生的频率时,这里不会作为步数计算。但如果手摇手机产生的震动频率与人的步调差不多的情况下,还是会进行计算步数的,这是目前采用加速 计不可避免的误计。



以上经本人亲自己测试,以不同方式走路,除去启动前的和结束时的噪波干扰,基本能正确算出走路的步数。


这是个人的开发经验总结,(利用加速 计原理的)。如果还有其它方法使用智能手机进行计步原,请多指教。别如果有看不懂的,也可以联系我,进行研究。

0 0
原创粉丝点击