首页>商情资讯>行业标准

传感器3种常用算法处理,收藏!

2020-6-22 9:30:00
  • 在传感器使用中,我们常常需要对传感器数据进行各种整理,让应用获得更好的效果。

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

1.加权平滑:平滑和均衡传感器数据,减小偶然数据突变的影响;

2.抽取突变:去除静态和缓慢变化的数据背景,强调瞬间变化;

3.简单移动平均线:保留数据流最近的K个数据,取平均值;

01加权平滑

使用算法如下:

(新值) = (旧值)*(1 - a) + X *_a其中a为设置的权值,X为最新数据,程序实现如下:

float ALPHA = 0.1f;_

public void onSensorChanged(SensorEvent event){

x = event.values[0];_

y = event.values[1];_

z = event.values[2];_

mLowPassX = lowPass(x,mLowPassX);_

mLowPassY = lowPass(x,mLowPassY);_

mLowPassZ = lowPass(x,mLowPassZ);_

}

private float lowPass(float current,float last){

return last *_(1.0f - ALPHA) + current *_ALPHA;_

}

02抽取突变采用上面加权平滑的逆算法

实现代码如下:

public void onSensorChanged(SensorEvent event){

final float ALPHA = 0.8;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];filteredValues[0] = event.values[0] - gravity[0];_

filteredValues[1] = event.values[1] - gravity[1];_

filteredValues[2] = event.values[2] - gravity[2];_

}

03简单移动平均线

保留传感器数据流中最近的K个数据,返回它们的平均值。k表示平均“窗口”的大小;

实现代码如下:

public class MovingAverage{

private float circularBuffer[];_//保存传感器最近的K个数据

private float avg;_//返回到传感器平均值

private float sum;_//数值中传感器数据的和

private float circularIndex;_//传感器数据数组节点位置

private int count;public MovingAverage(int k){

circularBuffer = new float[k];_

count= 0;_

circularIndex = 0;_

avg = 0;_

sum = 0;_

}

public float getValue(){

return arg;_

}

public long getCount(){

return count;_

}

private void primeBuffer(float val){

for(int i=0;i

circularBuffer = val;_

sum += val;_

}

}

private int nextIndex(int curIndex){

if(curIndex + 1 >= circularBuffer.length){

return 0;_

}

return curIndex + 1;_

}

public void pushValue(float x){

if(0 == count++){

primeBuffer(x);_

}

float lastValue = circularBuffer[circularIndex];_

circularBuffer[circularIndex] = x;_//更新窗口中传感器数据

sum -= lastValue;_//更新窗口中传感器数据和

sum += x;_

avg = sum / circularBuffer.length;_//计算得传感器平均值

circularIndex = nextIndex(circularIndex);_

}

}

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』