搜索
热搜: ROHM 模拟 车载
查看: 4132|回复: 10

[分享] 常用的传感器3种算法处理

  [复制链接]

该用户从未签到

546

主题

547

帖子

0

精华

金牌会员

最后登录
2021-3-15
发表于 2020-3-31 10:44:07 | 显示全部楼层 |阅读模式
本帖最后由 gaosmile 于 2020-3-31 10:47 编辑

在传感器使用中,我们常常需要对传感器数据进行各种整理,让应用获得更好的效果,以下介绍几种常用的简单处理方法:

1.加权平滑:平滑和均衡传感器数据,减小偶然数据突变的影响;
2.抽取突变:去除静态和缓慢变化的数据背景,强调瞬间变化;
3.简单移动平均线:保留数据流最近的K个数据,取平均值;

加权平滑,使用算法如下:
(新值) = (旧值)*(1 - a) + X * a其中a为设置的权值,X为最新数据,程序实现如下:

  1. float ALPHA = 0.1f;
  2. public void onSensorChanged(SensorEvent event){
  3. x = event.values[0];
  4. y = event.values[1];
  5. z = event.values[2];
  6. mLowPassX = lowPass(x,mLowPassX);
  7. mLowPassY = lowPass(x,mLowPassY);
  8. mLowPassZ = lowPass(x,mLowPassZ);
  9. }
  10. private float lowPass(float current,float last){
  11. return last * (1.0f - ALPHA) + current * ALPHA;
  12. }
复制代码


抽取突变采用上面加权平滑的逆算法
实现代码如下:

  1. public void onSensorChanged(SensorEvent event){
  2. final float ALPHA = 0.8;gravity[0] = ALPHA * gravity[0] + (1-ALPHA) * event.values[0];
  3. gravity[1] = ALPHA * gravity[1] + (1-ALPHA) * event.values[1];
  4. gravity[2] = ALPHA * gravity[2] + (1-ALPHA) * event.values[2];filteredValues[0] = event.values[0] - gravity[0];
  5. filteredValues[1] = event.values[1] - gravity[1];
  6. filteredValues[2] = event.values[2] - gravity[2];
  7. }
复制代码


简单移动平均线
保留传感器数据流中最近的K个数据,返回它们的平均值。k表示平均“窗口”的大小;
实现代码如下:

  1. public class MovingAverage{
  2. private float circularBuffer[]; //保存传感器最近的K个数据
  3. private float avg; //返回到传感器平均值
  4. private float sum; //数值中传感器数据的和
  5. private float circularIndex; //传感器数据数组节点位置
  6. private int count;public MovingAverage(int k){
  7. circularBuffer = new float[k];
  8. count= 0;
  9. circularIndex = 0;
  10. avg = 0;
  11. sum = 0;
  12. }
  13. public float getValue(){
  14. return arg;
  15. }
  16. public long getCount(){
  17. return count;
  18. }
  19. private void primeBuffer(float val){
  20. for(int i=0;i<circularbuffer.length;++i){
  21. circularBuffer[i] = val;
  22. sum += val;
  23. }
  24. }
  25. private int nextIndex(int curIndex){
  26. if(curIndex + 1 >= circularBuffer.length){
  27. return 0;
  28. }
  29. return curIndex + 1;
  30. }
  31. public void pushValue(float x){
  32. if(0 == count++){
  33. primeBuffer(x);
  34. }
  35. float lastValue = circularBuffer[circularIndex];
  36. circularBuffer[circularIndex] = x; //更新窗口中传感器数据
  37. sum -= lastValue; //更新窗口中传感器数据和
  38. sum += x;
  39. avg = sum / circularBuffer.length; //计算得传感器平均值
  40. circularIndex = nextIndex(circularIndex);
  41. }
  42. }
复制代码

回复

使用道具 举报

该用户从未签到

16

主题

2095

帖子

0

精华

金牌会员

最后登录
2024-4-27
发表于 2020-4-4 17:42:08 | 显示全部楼层
谢谢分享
回复

使用道具 举报

该用户从未签到

1347

主题

6657

帖子

0

精华

论坛元老

最后登录
2020-7-26
发表于 2020-4-8 13:16:37 | 显示全部楼层
学习学习新知识学习学习新知识
回复 支持 反对

使用道具 举报

该用户从未签到

1347

主题

6657

帖子

0

精华

论坛元老

最后登录
2020-7-26
发表于 2020-4-8 13:17:06 | 显示全部楼层
学习学习新知识学习学习新知识
回复 支持 反对

使用道具 举报

该用户从未签到

1347

主题

6657

帖子

0

精华

论坛元老

最后登录
2020-7-26
发表于 2020-4-8 13:17:29 | 显示全部楼层
学习学习新知识学习学习新知识
回复 支持 反对

使用道具 举报

该用户从未签到

1347

主题

6657

帖子

0

精华

论坛元老

最后登录
2020-7-26
发表于 2020-4-8 13:18:07 | 显示全部楼层
学习学习新知识学习学习新知识
回复 支持 反对

使用道具 举报

该用户从未签到

1347

主题

6657

帖子

0

精华

论坛元老

最后登录
2020-7-26
发表于 2020-4-8 13:18:33 | 显示全部楼层
学习学习新知识学习学习新知识
回复 支持 反对

使用道具 举报

该用户从未签到

1347

主题

6657

帖子

0

精华

论坛元老

最后登录
2020-7-26
发表于 2020-4-8 13:19:02 | 显示全部楼层
学习学习新知识
回复 支持 反对

使用道具 举报

该用户从未签到

1347

主题

6657

帖子

0

精华

论坛元老

最后登录
2020-7-26
发表于 2020-4-8 13:19:24 | 显示全部楼层
学习学习新知识
回复 支持 反对

使用道具 举报

该用户从未签到

1347

主题

6657

帖子

0

精华

论坛元老

最后登录
2020-7-26
发表于 2020-4-8 13:19:43 | 显示全部楼层
学习学习新知识学习学习新知识
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条

Archiver|手机版|小黑屋|罗姆半导体技术社区

GMT+8, 2024-4-27 12:32 , Processed in 0.161778 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表