智能手机计步算法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

加速度大小,值为a4c26d1e5885305701be709a3d33442f.png,类型为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附近变化。

a4c26d1e5885305701be709a3d33442f.png

图 1. Length字段波形图

特征提取

由于收集的数据包含有噪声,特别是在两个动作切换之间Length字段值的波动比较大,比如慢走和上楼梯的过程。这里使用快速傅里叶变换(FFT)来处理Length字段的数据,波形图如图2。纵轴已向下平移9.8。

a4c26d1e5885305701be709a3d33442f.png

图 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毫秒)之内

a4c26d1e5885305701be709a3d33442f.png

图 3. 模型满足的条件

步数识别

我们把建立的模型用来检验在坐的士环境下所采集的数据,波形图如图4.

a4c26d1e5885305701be709a3d33442f.png

图 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毫秒。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue点击按钮怎么跳转图片_vue-router组件里面点击一个按钮跳转到一个新的组件该怎么实现...

展开全部直接修改地址栏中的路由地址即可&#xff1a;{{msg}}var testLogin Vue.component("login",{template:这是我的登录页面})var testRegister Vue.component("register",{template:这是我的注册页面})//配置路由词典//对象数组const myRoutes [//…

Arduino教程资料汇总(8月22日悄悄跟新了一下)

http://www.geek-workshop.com/thread-985-1-1.html 本帖最后由 迷你强 于 2013-8-31 12:36 编辑 F-101 arduino基础套件使用资料 Arduino入门教程--课前准备--Arduino驱动安装及1.0 IDE菜单介绍Arduino入门教程--第一课--板载Led闪烁实验Arduino入门教程--第二课--第一次面包板…

HTML5/CSS3系列教程:HTML5 区域(Sectioning)的重要性

日期&#xff1a;2013-2-4 来源&#xff1a;GBin1.com 不管你以前在web页面布局中如何称呼它们 - “区域”还是“块”&#xff0c;我们一直都在布局中将页面分成可视的不同区域。但真正的问题在于我们并没有使用任何正确的工具来实现。一般情况下我们使用典型的网格来划分页头…

CoreAnimation —— CAReplicatorLayer(拷贝图层)

2019独角兽企业重金招聘Python工程师标准>>> CAReplicatorLayer是一个layer容器&#xff0c;会对其中的subLayer进行一些差异处理&#xff08;它的子layer都可以拷贝&#xff09; 属性&#xff1a; //拷贝的次数 property NSInteger instanceCount; //是否开启景深效…

c语言用数组写密码程序,想程序高手求助--用C语言来编辑一个输入密码的程序...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼/*--------实现密码的隐式输入-----------------*/inputpw(char *password,int len) /*len为密码长度*/{int i0; /*密码数组索引值,同时也表示记录已显示*的数目*/char ch;fflush(stdin); /*清洗流&#xff0c;以防妨碍密码正确输入…

ps流 转发_RTP协议全解析(H264码流和PS流)(转)

&lbrack;LeetCode&rsqb; Arranging Coins 排列硬币You have a total of n coins that you want to form in a staircase shape, where every k-th row must ha ...使用Jenkins可持续集成maven项目首先下载最新的Jenkins的war包,放在tomcat的webapps的目录下,然后运行,例…

android 接收短信代码,短信接收功能实现的代码

其中包含了widget必备的要素以及对应文件分别为&#xff1a;appwidgetprovider--------------------------SmsWidget.javawidget的config--------------------------SmsWidgetConfig.javawidget引发的app-------------------------SmsAider.javaappwidgetproviderinfo---------…

使用MeanJS Yeoman Generator

1、首先全局安装该生成器 sudo npm install -g generator-meanjs 2、为项目创建一个路径 mkdir xmen && cd xmen 3、创建app yo meanjs 根据提示&#xff0c;输入应用名&#xff0c;描述&#xff0c;关键词&#xff0c;是否创建crud例子。。 4、运行app sudo NODE_ENVd…

Entity Framework With Oracle

虽然EF6都快要出来了&#xff0c;但是对于Oracle数据库&#xff0c;仍然只能用DB first和Model First来编程&#xff0c;不能用Code First真是一个很大的遗憾啊。 好了&#xff0c;废话少说&#xff0c;我们来看看EF中是如何用DB first和Model First来对Oracle编程的。 首先我们…

(三)Maven仓库介绍与本地仓库配置

1.Maven本地仓库/远程仓库的基本介绍 示意图&#xff1a; 本地仓库是指存在于我们本机的仓库&#xff0c;在我们加入依赖时候&#xff0c;首先会跑到我们的本地仓库去找&#xff0c;如果找不到则会跑到远程仓库中去找。对于依赖的包大家可以从这个地址进行搜索&#xff1a;http…

大数据时代下的迁移学习_继深度学习后,下一个热点技术是迁移学习

最早提出大数据时代到来的是知名咨询公司麦肯锡&#xff0c;麦肯锡称&#xff1a;“数据&#xff0c;已经渗透到当今每一个行业和业务职能领域&#xff0c;成为重要的生产因素。人们对于海量数据的挖掘和运用&#xff0c;预示着新一波生产率增长和消费者盈余浪潮的到来。”其实…

手机广告投放(phone advertising)唯一标识

手机标示&#xff0c;为了识别用户&#xff0c;方面advertising。 使用设备id&#xff0c;相当于暴露用户隐私。慢慢已不允许使用。、 &#xff08;长时间跟踪用户无异于暴露用户隐私&#xff0c;虽然大量数据适合兴趣建模&#xff0c;广告个性化推荐。但复杂多样会降低总体的准…

android分辨率比例成像,像素不是唯一 决定成像效果你必知的真相

像素并不是唯一如今不少人在选购一部手机时&#xff0c;非常重视手机摄像头的像素大小&#xff0c;因为一部高像素的手机可以为不少喜爱拍照的人省去买单反的费用&#xff0c;而且携带起来也非常方便。不过&#xff0c;手机并不能与专业的单反相机相比&#xff0c;成像效果并不…

vim——打开多个文件、同时显示多个文件、在文件之间切换

打开多个文件&#xff1a; 1.vim还没有启动的时候&#xff1a; 在终端里输入 vim file1 file2 ... filen便可以打开所有想要打开的文件 2.vim已经启动 输入 :open file 可以再打开一个文件&#xff0c;并且此时vim里会显示出file文件的内容。 同时显示多个文件&#xff1a; :s…

Android底部导航栏实现(一)之BottomNavigationBar

BottomNavigationBar这个控件的使用之前已经写过&#xff0c;这里不再赘述&#xff0c;详情请参考BottomNavigationBar的使用。 下面直接上代码&#xff1a; 初始化及相关设置&#xff1a; mBottomNavigationBar (BottomNavigationBar) view.findViewById(R.id.bottom_navigat…

jq 组装数组_Jquery 数组操作

1、数组的创建var arrayObj new Array(); //创建一个数组var arrayObj new Array([size]); //创建一个数组并指定长度&#xff0c;注意不是上限&#xff0c;是长度var arrayObj new Array([element0[, element1[, ...[, elementN]]]]); 创建一个数组并赋值要说明的是&…

android 官方说明文档,Android官方文档翻译-Accessibility

标签元素向用户提供解释每个可互动元素的意义和目的有用且形象的标签是非常重要的。这些标签允许屏幕阅读者(比如 TalkBack )正确向用户解释每个控制器的功能。你可以使用一下两个方法提供元素的标签&#xff1a;当展示在 Activity 的整个生命周期中都不会改变样式的静态元素时…

USACO 2.4.1 The Tamworth Two

牛和农夫按照固定的走法在10x10的地图中走&#xff0c;每分钟走一步&#xff0c;求经过几分钟相遇。永远不能相遇输出0. 纯模拟的题。 判断永远不能相遇的方法是如果遇到了一个先前的状态&#xff0c;那么肯定存在循环&#xff0c;必定不能相遇。 程序中把状态表示为牛和农夫的…

013,spring boot下JedisCluster客户端的配置,连接Redis集群

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff0c;pom依赖添加&#xff1a; <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <type>jar</typ…

android控件使用大全,Android常见控件使用详解

本文实例为大家分享了六种Android常见控件的使用方法&#xff0c;供大家参考&#xff0c;具体内容如下1、TextView 主要用于界面上显示一段文本信息2、Button 用于和用户交互的一个按钮控件//为Button点击事件注册一个监听器public class Click extends Activity{private Butto…