关于传感器取30平均值来过滤

来源:互联网 发布:软件开发ppt 编辑:程序博客网 时间:2024/05/19 16:04
1.4.4 加速度传感器运用实例
    
在这里,我们对Low-Pass Filter和High-pass filter实例进行说明。在实际的运用中在什么样的场合下如何使用这两个过滤器,通过例程我们进行很好的理解。程序列表1-6列表1-7是摇晃手机表示图片的应用程序的代码(运行结果如图1-6)。在这个例程中作成ShakeActivity类和管理抽样数据的ValueHolder类。ShakeActivity类和ValueHolder类的关系如图1-7所示。
     

图1-6 摇动手机并表示图片的例程

列表1-6 摇动手机并表示图片的例程1

package com.mamezou.android.shake;

import java.util.Arrays;

public class ValueHolder {                    
//..................①
private static final float BLANK = -999;
private int size;
private float[] values;
private int position = 0;
public ValueHolder(int size) {
    this.size = size;
    values = new float[size];
    clear();
}
private void clear() {
    Arrays.fill(values, BLANK);
}
public boolean add(float value) {
    values[position] = value;
    if(size -1 == position) {
      position = 0;
      return true;
    } 
    position ++;
    return false;
}
// 取得中间值的方法
public float getMedian() {                    
//..................②
    float[] tmp = values.clone();
    Arrays.sort(tmp);
    int len = tmp.length;
    int first = 0;
    for (int i = 0; i < len; i++) {
      first = i;
      if(tmp[i] != BLANK) break;
    }
    return tmp[(len - first) / 2 + first];
}
}

要点如下所示

①ValueHolder类管理用size指定的抽样数据

②返回保存的抽样数据的中间值。

列表1-6 摇动手机并表示图片的例程2

package com.mamezou.android.shake;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;

public class ShakeActivity extends Activity implements SensorEventListener {
private SensorManager sensorManager;
private ValueHolder x;
private ValueHolder y;
private ValueHolder z;
private View layout;
// Android君的画像
private BitmapDrawable andy;

private static final int ELEMENT_COUNT = 30;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
    layout = (View) findViewById(R.id.layout);
    andy = (BitmapDrawable) getResources().getDrawable(R.drawable.andy);
}
@Override
protected void onResume() {
    super.onResume();
    sensorManager.registerListener(this,
    sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
        SensorManager.SENSOR_DELAY_FASTEST);
    x = new ValueHolder(ELEMENT_COUNT);
    y = new ValueHolder(ELEMENT_COUNT);
    z = new ValueHolder(ELEMENT_COUNT);
}
@Override
protected void onStop() {
    sensorManager.unregisterListener(this);
    super.onStop();
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void onSensorChanged(SensorEvent e) {
    float sensorValueX = e.values[SensorManager.DATA_X];
    float sensorValueY = e.values[SensorManager.DATA_Y];
    float sensorValueZ = e.values[SensorManager.DATA_Z];
    x.add(sensorValueX);
    y.add(sensorValueY);
    z.add(sensorValueZ);
    float valueX = sensorValueX - x.getMedian();
    float valueY = sensorValueX - x.getMedian();
    float valueZ = sensorValueX - x.getMedian();
    andy.setAlpha(15 * (int)(Math.abs(valueX) + Math.abs(valueY) + Math.abs(valueZ))); 
//..................①
    layout.setBackgroundDrawable(andy);
}
}

要点如下所示

①对3个轴的High-pass filter的值,画像的阿尔法值进行操作。按照这样做,手机强烈摇动的时候Android画像被表示。High-pass filter处理对只是对手机倾斜,画面不被表示。只对手机进行摇动的时候画像才表示。

全部源码下载

例程下载 例程名称 Android 加速度传感器运用实例 代码下载 大小 35.2 KB 下载

Shake.zip

原创粉丝点击