智能手机计步算法c语言实现,【转载】智能手机计步器算法的实现
现
在的智能手机嵌入了一些微小的传感器,比如重力传感器、光传感器、声音传感器等。如何有效地利用这些传感器来开发一些应用,是一个值得深入研究的课题。比
如开发医疗健康的应用、运动量监视器等。本文采用htc Touch Pro
智能手机的重力传感器来开发一款监视步数的程序,程序的关键在于计步模型的建立。由于程序算法还存在一定的问题,在本文最后的“存在问题”给出。如有问题请不吝指出。
智能手机
所
谓的智能手机是指,具有独立的操作系统,用户可以自行安装第三方应用软件,通过此类程序来对手机的功能进行扩充,并可以通过移动通讯网络来实现无线网络接
入的手机,它实际上就是一台迷你的个人电脑。智能手机的操作系统主要有:Windows Mobile, iPhone,
BlackBerry, Linux等。
步数识别系统
步数识别系统是指运行在移动手机上,能够监视用户走了多少步的应用程序。它一般由以下3个部分构成:
· 传感器模块,用来采集传感器数据;
· 特征提取模块,处理和分析原始数据,并进行特征提取、建立模型;
· 步数识别模块,把所提取的特征用来识别步数。
硬件设备
重
力传感器(G-Sensor)又称为加速度传感器,用来感知加速度的变化,它使用三维方向的加速度分量来表示。G-Sensor被用在很多智能设备当中,
比如IBM的高端笔记本电脑内置了G-Sensor,在发生剧烈的拉动时(如跌落),立即启动硬盘保护,避免硬盘损害。再如Apple 的
iPhone
使用G-Sensor来感知手机屏幕的方向,当在观看视频时手机横放,屏幕自动跟着旋转,这使得用户体验大大增加。本文采用htc Touch
Pro手机上的G-Sensor,同样也适用于htc 其它型号的G-Sensor。
方案实现
日
常生活当中,人们使用手机一般是拿在手上,放在裤兜里,女士也经常把它放在包里。因为手机外界环境总是很复杂的,裤兜有松有紧,放在松裤兜的手机比放在紧
的更容易抖动,产生的噪音也更多。为了使该算法尽可能的适用于不同的应用环境,需要对大部分的使用环境进行测试。首先,由4个人(8个或更多也可以)各自
对不同手机使用环境进行数据收集,因为人们在同样的场合使用手机的习惯是不一样的。其次,对采集来的这些数据分别进行特征提取。最后,使用提取的特征模型
进行识别检验。
数据采集
htc Touch Pro G-Sensor提供的数据如表1所示。
表1. htc Touch Pro G-Sensor 提供的数据
字段
含义
X
加速度在手机坐标X方向的分量大小,类型为 double
Y
加速度在手机坐标Y方向的分量大小,类型为double
Z
加速度在手机坐标Y方向的分量大小,类型为double
Length
加速度大小,值为,类型为double
Xangle
加速度在手机坐标X方向的分量与地平面的夹角,范围为 -180°~180°,类型为 int
Yangle
加速度在手机坐标Y方向的分量与地平面的夹角,范围为 -180°~180°,类型为 int
DateTime
采样的时间,不是G-Sensor提供的,为了方便算法计算保留采样的时间,类型为double
本
文算法采用的采样频率为20HZ,采样环境有:慢走、快走、跑步、骑自行车、坐的士、坐公交、坐电梯(上/下)、坐地铁、上下楼梯。其中,有走路的采集走
100
步的数据(慢走、快走等),不是走路的采集1分钟的数据。由于开始和结束的时候放置手机(放口袋、包里)会有一些波动,不是我们想要的,因此这两个时间段
的数据可以删去,或不考虑。手机放在口袋,收集的原始Length字段数据,在Excel
2007上绘制波形图如图1。横轴为每个采样点的索引,纵轴为Length值大小,也就是加速度大小,值在9.8附近变化。
图 1. Length字段波形图
特征提取
由于收集的数据包含有噪声,特别是在两个动作切换之间Length字段值的波动比较大,比如慢走和上楼梯的过程。这里使用快速傅里叶变换(FFT)来处理Length字段的数据,波形图如图2。纵轴已向下平移9.8。
图 2. 经过FFT处理的Length字段波形图
我
们发现上面经过FFT处理的波形表现出一定的规则,就是在一定的时间间格内总有一个波谷,我们称这个点为“踩点”(如图3中的1、2、3、4点),也就是
加速度最小的时刻(脚往下踩,手机相对有一个往下“掉”的过程)。另外,图3上A点也是波谷,但这一点是一个波动点,需要排除。所以踩点还必须小于一定的
值-Threshold。当脚抬起来的时候(“起点”),身体对手机的作用力会增大,加速度也增大。所以起点必须大于Threshold,大于
Threshold的都称为起点,因为我们只关心状态的变化。通常地,走路的时候步与步之间的有一定的时间间隔,走快些间隔小,走慢些间隔大。如果是跑的
话,人类的极限是1秒种跑5步,也就是1步0.2秒。从起点到踩点状态变化1次就是走了1步。所以,我们建立包含如下2个要素的模型M:
1. Length满足一定阀值,比如 –Threshold < Length
< Threshold
2. 两个连续踩点的时间间隔必须在Timespan (200~2000毫秒)之内
图 3. 模型满足的条件
步数识别
我们把建立的模型用来检验在坐的士环境下所采集的数据,波形图如图4.
图 4. 用模型检验的士环境下的数据
我
们可以看到后面的一段时间是比较平稳的,前面有一些波动,这些波动导致了错误的识别,识别为走路。我们可以改进这个模型,增加一个约束条件:在监视了连续
k(比如3)个踩点后才开始计步,所以从图3上标号为4的点开始计步。这样的约束就可以把大部分的抖动给去掉。把最终的模型用来检验所采集的不同环境下的
数据得到的计步结果还是比较准确的。
存在问题
如 果拿着手机左右摇摆,采集的数据经过FFT
处理后的波形也符合上面的模型,但这并不是走路的状态,产生了错误的计步。直觉上认为这可以通过监视Xangle,Yangle
两个字段(在某一范围来回变化)来预防这种情况的发生。但使用htc G-Sensor采集的这两个字段的数据得到的效果并不好。
经验教训
以 上模型使用的数据只有Length字段,其它字段并没有用到。实际上,在决定只使用 Length
字段建立模型之前,有尝试使用Xangle,Yangle,并推导出Zangle(htc
G-Sensor没有给出这个字段),使用这三个角度的状态变化来辅助判断计步。事实上这三个量的数值并不可靠,比如把手机水平放置,做左右摇摆,得到的
Xangle,Yangle 的范围变化有超过 30°的。另外,也可以尝试使用Samsung,iPhone
上的G-Sensor,但本文并没有实现该想法。
总结
使
用智能手机来计步这个课题比较新颖,而且很容易实现个人健康监视的手机助理。收集不同使用环境下的数据是一个比较耗时的过程,需要由不同的人员在不同的环
境下收集。整个计步的关键过程在于模型的建立,而且必须满足使用手机的任意性和处理不同环境下的噪声。所使用的算法也比较简单,用FFT
来处理原始数据,设立一定的阀值和时间间隔,然后监视过程的变化(踩点->起点->踩点)。其中采样率、Length阀值和时间间隔等参数的
设置也是需要一个一个调试的,在本文的程序里采样率为20HZ,Threshold取1,时间间隔在200~2000毫秒。
智能手机计步算法c语言实现,【转载】智能手机计步器算法的实现相关推荐
- 红包的分配算法php,php仿微信红包分配算法的实现方法,红包算法
php仿微信红包分配算法的实现方法,红包算法 本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @para ...
- php 红包算法教程,php仿微信红包分配算法的实现方法
php仿微信红包分配算法的实现方法 本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @param int ...
- 国密算法:利用python进行sm2非对称算法的实现,国密算法库gmssl的使用
我们继续来进行国密算法的演示. 本篇演示sm2非对称算法的实现,国密算法库gmssl的使用. 一 sm2算法的特点: sm2: 即椭圆曲线公钥密码算法,是由国家密码管理局发布的: 非对称加密算法,即有 ...
- 红包的分配算法php,php仿微信红包分配算法的实现方法,红包算法_PHP教程
php仿微信红包分配算法的实现方法,红包算法 本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @para ...
- KMP算法中next数组的理解与算法的实现(java语言)
KMP 算法我们有写好的函数帮我们计算 Next 数组的值和 Nextval 数组的值,但是如果是考试,那就只能自己来手算这两个数组了,这里分享一下我的计算方法吧. 计算前缀 Next[i] 的值: ...
- k近邻算法_机器学习之K近邻分类算法的实现
K近邻算法(k-nearest neighbors, KNN)是最基本的机器学习算法之一.所谓的K,就是距离最近的K个邻居的意思.其实,KNN在我们平常的生活中也会不自主的应用,比如,俗语说的&quo ...
- 密码学03--go语言与非对称加密RSA算法的实现
目录 1.对称加密的弊端 2.非对称加密 2.1 非对称加密使用场景 2.2 区分公私钥 2.3 非对称加密通信流程 2.4 非对称加密与对称加密 3.非对称加密RSA算法 3.1 RSA算法 3.2 ...
- 用python写行列式_用Python开发线性代数算法(一) | 手写行列式算法的实现
和往年不同,今年的"五一"假期,没有出去游玩.一个原因是疫情还没有过去,小心点为好:另一个原因就是最近天气太热,懒得出门 .当然了,不出门也不能窝在被窝里看片儿,作为四十多岁的大叔 ...
- 基于ICP算法的三维点云数据拼接算法的实现
1.问题描述: 通过合并比例因子引入标准迭代最近点(ICP)算法中,我将配准问题转化为一个7D的约束优化问题非线性空间.然后,我们应用奇异值分解(SVD)一种迭代求解此类优化问题的方法.最后,建立了一 ...
最新文章
- R语言ggplot2可视化气泡图:无填充色的气泡图、自定义填充色的气泡图
- hdu 2459 (后缀数组+RMQ)
- c# winform做简单的折线图(VS2017)
- android拍照识别人脸,Android 人脸识别拍照demo
- python连接oracle进行监控_使用Python脚本zabbix自定义key监控oracle连接状态
- myeclipse如何换一个漂亮的主题
- Java动态代理与静态代理
- 那年学过的Java笔记三核心类库三
- 如何用Linux搭建家庭云服务,使用ownCloud在Linux安装你的个人云服务 私有云的搭建...
- 基于SMB文件共享传播的新型蠕虫病毒***的紧急防范
- SGI和Intel计划在2018年以前,将超级计算机速度提高500倍
- mac 2018 idea 无法 import导入或打开maven 项目
- postgresql 数据库连接数查询
- 2021年进销存管理软件商户门店使用热度前十名排行榜
- python中while循环只能用来实现无限循环的编程_while循环只能实现无限循环的编程...
- linux常用的基本指令
- 用Java实现目录复制(包含此目录下的所有文件与目录)
- 遥感卫星影像数据全色波段和多光谱波段
- 研究GigE Vision(未完待续)
- ftp文件服务器能记录操作吗,ftp服务器操作记录
热门文章
- 《深入理解Java虚拟机》读书笔记八
- 关于'java' 不是内部或外部命令,也不是可运行的程序 或批处理文件 和 错误: 找不到或无法加载主类 helloworld的问题...
- 交换机老化测试和性能测试方法收集
- iOS开发 - Swift实现清除缓存功能
- 《Two Days DIV + CSS》读书笔记——CSS选择器
- Sublime Text 2 入门及技巧
- 10 个最佳的网站分析方法
- 强大的APIClound云修复——告别繁琐的编译打包流程
- Activiti中的关于子流程中的并发节点标记处理
- 理解git结构与简单操作(四)合并分支的方法与策略