该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

现在 好一点的 都有陀螺仪,系统实现了计步

没有的,那个计算出来的 不是很准。

根据波动的阈值范围来判定,

代码 贴给你 注释也很清楚了

抱歉,您的贴子超过5000字,建议您精简或分段后再提交

删了一部分废弃的方法

public class StepDcretor implements SensorEventListener {

//存放三轴数据

float[] oriValues = new float[3];

final int valueNum = 4;

//用于存放计算阈值的波峰波谷差值

float[] tempValue = new float[valueNum];

int tempCount = 0;

//是否上升的标志位

boolean isDirectionUp = false;

//持续上升次数

int continueUpCount = 0;

//上一点的持续上升的次数,为了记录波峰的上升次数

int continueUpFormerCount = 0;

//上一点的状态,上升还是下降

boolean lastStatus = false;

//波峰值

float peakOfWave = 0;

//波谷值

float valleyOfWave = 0;

//此次波峰的时间

long timeOfThisPeak = 0;

//上次波峰的时间

long timeOfLastPeak = 0;

//当前的时间

long timeOfNow = 0;

//当前传感器的值

float gravityNew = 0;

//上次传感器的值

float gravityOld = 0;

//动态阈值需要动态的数据,这个值用于这些动态数据的阈值

final float initialValue = (float) 1.7;

//初始阈值

float ThreadValue = (float) 2.0;

private final String TAG = "StepDcretor";

/**

* 0-准备计时 1-计时中 2-准备为正常计步计时 3-正常计步中

*/

private int CountTimeState = 0;

public static int CURRENT_SETP = 0;

public static int TEMP_STEP = 0;

private int lastStep = -1;

// 加速计的三个维度数值

public static float[] gravity = new float[3];

public static float[] linear_acceleration = new float[3];

//用三个维度算出的平均值

public static float average = 0;

private Timer timer;

// 倒计时4秒,4秒内不会显示计步,用于屏蔽细微波动

private long duration = 4000;

private TimeCount time;

OnSensorChangeListener onSensorChangeListener;

public interface OnSensorChangeListener {

void onChange();

}

public StepDcretor(Context context) {

super();

}

public void onAccuracyChanged(Sensor arg0, int arg1) {

}

public OnSensorChangeListener getOnSensorChangeListener() {

return onSensorChangeListener;

}

public void setOnSensorChangeListener(

OnSensorChangeListener onSensorChangeListener) {

this.onSensorChangeListener = onSensorChangeListener;

}

public void onSensorChanged(SensorEvent event) {

Sensor sensor = event.sensor;

synchronized (this) {

if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

calc_step(event);

}

}

}

synchronized private void calc_step(SensorEvent event) {

average = (float) Math.sqrt(Math.pow(event.values[0], 2)

+ Math.pow(event.values[1], 2) + Math.pow(event.values[2], 2));

DetectorNewStep(average);

}

/*

* 检测步子,并开始计步

* 1.传入sersor中的数据

* 2.如果检测到了波峰,并且符合时间差以及阈值的条件,则判定为1步

* 3.符合时间差条件,波峰波谷差值大于initialValue,则将该差值纳入阈值的计算中

* */

public void DetectorNewStep(float values) {

if (gravityOld == 0) {

gravityOld = values;

} else {

if (DetectorPeak(values, gravityOld)) {

timeOfLastPeak = timeOfThisPeak;

timeOfNow = System.currentTimeMillis();

if (timeOfNow - timeOfLastPeak >= 200

&& (peakOfWave - valleyOfWave >= ThreadValue) && timeOfNow - timeOfLastPeak <= 2000) {

timeOfThisPeak = timeOfNow;

//更新界面的处理,不涉及到算法

preStep();

}

if (timeOfNow - timeOfLastPeak >= 200

&& (peakOfWave - valleyOfWave >= initialValue)) {

timeOfThisPeak = timeOfNow;

ThreadValue = Peak_Valley_Thread(peakOfWave - valleyOfWave);

}

}

}

gravityOld = values;

}

private void preStep() {

if (CountTimeState == 0) {

// 开启计时器

time = new TimeCount(duration, 700);

time.start();

CountTimeState = 1;

Log.v(TAG, "开启计时器");

} else if (CountTimeState == 1) {

TEMP_STEP++;

Log.v(TAG, "计步中 TEMP_STEP:" + TEMP_STEP);

} else if (CountTimeState == 3) {

CURRENT_SETP++;

if (onSensorChangeListener != null) {

onSensorChangeListener.onChange();

}

}

}

/*

* 检测波峰

* 以下四个条件判断为波峰:

* 1.目前点为下降的趋势:isDirectionUp为false

* 2.之前的点为上升的趋势:lastStatus为true

* 3.到波峰为止,持续上升大于等于2次

* 4.波峰值大于1.2g,小于2g

* 记录波谷值

* 1.观察波形图,可以发现在出现步子的地方,波谷的下一个就是波峰,有比较明显的特征以及差值

* 2.所以要记录每次的波谷值,为了和下次的波峰做对比

* */

public boolean DetectorPeak(float newValue, float oldValue) {

lastStatus = isDirectionUp;

if (newValue >= oldValue) {

isDirectionUp = true;

continueUpCount++;

} else {

continueUpFormerCount = continueUpCount;

continueUpCount = 0;

isDirectionUp = false;

}

if (!isDirectionUp && lastStatus

&& (continueUpFormerCount >= 2 && (oldValue >= 11.76 && oldValue < 19.6))) {

peakOfWave = oldValue;

return true;

} else if (!lastStatus && isDirectionUp) {

valleyOfWave = oldValue;

return false;

} else {

return false;

}

}

/*

* 阈值的计算

* 1.通过波峰波谷的差值计算阈值

* 2.记录4个值,存入tempValue[]数组中

* 3.在将数组传入函数averageValue中计算阈值

* */

public float Peak_Valley_Thread(float value) {

float tempThread = ThreadValue;

if (tempCount < valueNum) {

tempValue[tempCount] = value;

tempCount++;

} else {

tempThread = averageValue(tempValue, valueNum);

for (int i = 1; i < valueNum; i++) {

tempValue[i - 1] = tempValue[i];

}

tempValue[valueNum - 1] = value;

}

return tempThread;

}

/*

* 梯度化阈值

* 1.计算数组的均值

* 2.通过均值将阈值梯度化在一个范围里

* */

public float averageValue(float value[], int n) {

float ave = 0;

for (int i = 0; i < n; i++) {

ave += value[i];

}

ave = ave / valueNum;

if (ave >= 8)

ave = (float) 4.3;

else if (ave >= 7 && ave < 8)

ave = (float) 3.3;

else if (ave >= 4 && ave < 7)

ave = (float) 2.3;

else if (ave >= 3 && ave < 4)

ave = (float) 2.0;

else {

ave = (float) 1.3;

}

return ave;

}

class TimeCount extends CountDownTimer {

public TimeCount(long millisInFuture, long countDownInterval) {

super(millisInFuture, countDownInterval);

}

@Override

public void onFinish() {

// 如果计时器正常结束,则开始计步

time.cancel();

CURRENT_SETP += TEMP_STEP;

lastStep = -1;

// CountTimeState = 2;

Log.v(TAG, "计时正常结束");

timer = new Timer(true);

TimerTask task = new TimerTask() {

public void run() {

if (lastStep == CURRENT_SETP) {

timer.cancel();

CountTimeState = 0;

lastStep = -1;

TEMP_STEP = 0;

Log.v(TAG, "停止计步:" + CURRENT_SETP);

} else {

lastStep = CURRENT_SETP;

}

}

};

timer.schedule(task, 0, 3000);

CountTimeState = 3;

}

@Override

public void onTick(long millisUntilFinished) {

if (lastStep == TEMP_STEP) {

Log.v(TAG, "onTick 计时停止");

time.cancel();

CountTimeState = 0;

lastStep = -1;

TEMP_STEP = 0;

} else {

lastStep = TEMP_STEP;

}

}

}

//废弃的算法

// private void oldCalStep(SensorEvent event) {

// // 用低通滤波器分离出重力加速度

// gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];

// gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];

// gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

//

}

android 加速传感器计步,哪位大哥哥有 安卓手机加速度传感器的计步器源码,,...相关推荐

  1. android 快传 源码_安卓APP仿茄子快传源码,Android项目源码类似茄子快传的快传项目包括服务端...

    适用范围:安卓APP仿茄子快传源码,Android项目源码类似茄子快传的快传项目包括服务端 演示地址:(以截图为准) 运行环境:Android+PC+web 其他说明: 本项目是一个基于安卓的类似茄子 ...

  2. JavaScript实现按位运算符乘以无符号数multiplyUnsigned算法(附完整源码)

    JavaScript实现按位运算符乘以无符号数multiplyUnsigned算法(附完整源码) multiplyUnsigned.js完整源代码 multiplyUnsigned.js完整源代码 e ...

  3. Android安卓成品项目 购物商城系统源码apk

    Android安卓成品项目 购物商城系统源码apk 安卓源码,成品项目,单机不联网项目,包含项目报告 登录注册,展示和修改个人信息,全部商家列表,讨论功能,添加购物车,联系,付款,查看订单记录,账户充 ...

  4. android计步器开源,开源Android项目pedometer计步器源码

    [实例简介] 开源Android项目计步器源码,打开软件后,手握手机,可根据你走路时胳膊摆的次数准确测试出你走了多少步,有意思吧,而且这个项目的源码是开源的,分iPhone版和Android版,此为a ...

  5. java计算机毕业设计ssm基于大数据的汽车流量监控cvej1(附源码、数据库)

    java计算机毕业设计ssm基于大数据的汽车流量监控cvej1(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也 ...

  6. android做拨号程序代码,Android开发手机拨号程序实现实例源码介绍

    Android开发手机拨号程序实现实例源码介绍,在上一篇文章中,我们实现了第一个程序:helloWorld,并成功测试完成.还给大家介绍了Android项目结构和说明.现在写一个手机拨号程序: 首先, ...

  7. web前端期末大作业:文化网站设计——中国风文化html源码(6个页面) HTML+CSS+JavaScript...

    web前端期末大作业:文化网站设计--中国风文化html源码(6个页面) HTML+CSS+JavaScript 期末作业HTML代码 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到 ...

  8. 酷派android是什么系统版本,酷派大神X7的手机系统是什么?能升级安卓5.0吗?

    酷派大神X7的手机系统是什么 大神X7搭载了最新的Cool UI 6.0(基于Android 4.4.2)系统界面. 大神X7采用了Super AMOLED材质的屏幕,尺寸为5.2英寸,分辨率为主流的 ...

  9. 手机加速度传感器在Android横竖屏切换中的应用

    文章目录 如何判断手机的横竖屏 使用加速度计实现 接口使用 使用加速度计和磁力计获取手机倾斜角度 加速度传感器在Android横竖屏切换中的应用 如何判断手机的横竖屏 这个问题依赖与手机上的传感器 一 ...

最新文章

  1. (C++)第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。
  2. Oracle后台进程
  3. 小的人工智能企业应如何解决算力服务器
  4. memcached python客户端编写实践
  5. 871 最低加油次数
  6. ABAP程序性能优化
  7. Hibernate执行原理总结
  8. 100% .NET Control_自动完成Combobox的XComBo控件(VB.NET)
  9. 将不确定变为确定~真的是SqlDataReader引起的超时?
  10. 生成chm文档工具- Sandcastle -摘自网络
  11. python倒三角形_python写个三角形的问题
  12. 在矩池云上使用A6000/3090跑ikatago说明
  13. 终极人机大战要来了?AI打星际2即将直播,DeepMind暴雪发出神秘预告
  14. Biztalk2009安装全过程截图,x64平台需要手动更改运行模式
  15. 2021年全国电子设计竞赛题目
  16. Hadoop的特性和版本
  17. oracle vm 强制关机,[已解决]Virtualbox安装archlinux过程中客户机和宿主机全部卡死...
  18. 【JZOJ 3397】雨天的尾巴
  19. 《人工智能及其应用》练习题
  20. Microsoft.Office.Interop.Excel # Microsoft Excel xx.0 Object Library 引用

热门文章

  1. Linux系统SPI驱动总结(一)
  2. 理解:L1正则先验分布是Laplace分布,L2正则先验分布是Gaussian分布
  3. 【Source教程】游戏SDK工具的下载安装与使用方法
  4. tomcat启动时错误:Failed to start component [StandardEngine[Catalina].StandardHost[localhost].错误
  5. 计算机语言都是相通的,各类编程语言是不是都有互通的部分?
  6. 写个脚本,一键打开软件文档(Windows)
  7. IT服务目录简介及其如何搭建
  8. Power bi 3.8 分区图
  9. 搞不懂DMP是什么?看这里就够了
  10. 深入理解计算机基础——ECH