传感器常用算法处理

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

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

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

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

二、加权平滑

   使用算法如下:

    (新值) = (旧值)*(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;
}

三、抽取突变

       采用上面加权平滑的逆算法。
       实现代码如下:

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];
}

四、简单移动平均线

     保留传感器数据流中最近的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.length;++i){
               circularBuffer[i] = 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);
    }
}

五、备注

参考资料:《Android传感器高级编程》


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值