您好!欢迎光临工博士商城

台湾嘉准工博士专卖

产品:203    

咨询热线:18597848426

QQ QQ
您当前的位置:首页 » F&C嘉准新闻中心 » 传感器3种常用算法处理,请收藏!(含代码)
产品分类
F&C嘉准新闻中心
传感器3种常用算法处理,请收藏!(含代码)
发布时间:2020-04-14        浏览次数:173        返回列表
 在传感器使用中,我们常常需要对传感器数据进行各种整理,让应用获得更好的效果,以下介绍几种常用的简单处理方法:

 

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  }

点击查看更多精彩资讯:台湾嘉准

 

本文摘自:网络  2020-04-14


分享到: 


 

联系热线:18597848426   联系人:曾成龙 联系地址:湖南省长沙市高新区兴工国际产业园2栋

技术和报价服务:星期一至星期六8:00-22:00 台湾嘉准工博士专卖