0

我开发了一个起诉 android 的步骤检测应用程序。在那里,我过滤了我的传感器数据(加速度计数据 x、y、z),需要使用 5 点平滑算法对信号进行平滑处理。我在一篇研究论文中看到了它。我已经搜索了该算法,但找不到可以与 android(java) 一起使用的合适资源。任何人都可以帮助我实现这一目标。

这是我获取加速度计数据并使用低通滤波器过滤的代码

package com.android.gait;

import org.achartengine.GraphicalView;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorListener;

import android.hardware.SensorManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MainActivity extends Activity implements SensorEventListener{

    static final float ALPHA = 0.15f;
    private int count=0;
    private static GraphicalView view;
    private LineGraph line = new LineGraph();
    private static Thread thread;
    private SensorManager mSensorManager;
    private Sensor mAccelerometer;
    TextView title,tv,tv1,tv2;
    RelativeLayout layout;
    private double a;
    static float m = 0;
    private float p,q,r;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //get the sensor service
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        //get the accelerometer sensor
        mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        //get layout
        layout = (RelativeLayout)findViewById(R.id.relative);
        LinearLayout layout = (LinearLayout) findViewById(R.id.layoutC);
        view= line.getView(this);
        layout.addView(view);
        //get textviews
        title=(TextView)findViewById(R.id.name);
        tv=(TextView)findViewById(R.id.xval);
        tv1=(TextView)findViewById(R.id.yval);
        tv2=(TextView)findViewById(R.id.zval);

        thread = new Thread(){
            int iniX=0;  
            public void run()
            {
                while(true)
                {

                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    iniX=+1;

                    line.addNewPoint(iniX,m);
                    view.repaint();
                }
            }  


        };

        thread.start();


    }

    public final void onAccuracyChanged(Sensor sensor, int accuracy)
    {
        // Do something here if sensor accuracy changes.
    }
    @Override
    public final void onSensorChanged(SensorEvent event)
    {
        count=+1;
        // Many sensors return 3 values, one for each axis.


        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];



        float[] first={x,y,z};
        float[] larst={p,q,r};

    larst= lowPass(first,larst);
    //double FY= b.Filter(y);
    //double FZ= b.Filter(z);

    //get merged value
            m = (float) Math.sqrt(larst[0]*larst[0]+larst[1]*larst[1]+larst[2]*larst[2]);



        //display values using TextView
        title.setText(R.string.app_name);
        tv.setText("X axis" +"\t\t"+larst[0]);
        tv1.setText("Y axis" + "\t\t" +larst[1]);
        tv2.setText("Z axis" +"\t\t" +larst[2]);
    }

    @Override
    protected void onResume()
    {
        super.onResume();
        mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    }
    @Override
    protected void onPause()
    {
        super.onPause();
        mSensorManager.unregisterListener(this);
    }

    public void LineGraphHandler(View view){



    }

    //Low pass filter
    protected float[] lowPass( float[] input, float[] output ) {
        if ( output == null ) return input;

        for ( int i=0; i<input.length; i++ ) {
            output[i] = output[i] + ALPHA * (input[i] - output[i]);
        }
        return output;
    }
    /*@Override
    public void onStart(){
        super.onStart();    
        view= line.getView(this);
        setContentView(view);
    }*/

}
4

1 回答 1

1

n 点平滑算法简单地返回当前存储的 n 个数据点的平均值。

在您的情况下,n = 5。假设您已经存储了 5 个数据点,按从旧到新的顺序排列:

当前数据:1、3、5、4、9(最近读取的数据为 9)

进一步假设您现在读入数据点 7。所有数据现在都向左推了一个位置,最旧的数据点被完全删除。现在的数据点是:

当前数据:3、5、4、9、7

现在计算这些值的平均值,(3+5+4+9+7)/5 = 5.6,这是新的平滑值。每次添加新值时,都应计算并读取新的平滑值。您读取的值流都被平滑了。

请注意,实际上,如果您在数据点和 1/5 的系数之间执行卷积,则离散 FIR 滤波器(您提到的)会执行精确的平滑(平均)操作。也就是说,我上面描述的平均值 (3+5+4+9+7)/5 与 (3, 5, 4, 9, 7) 和 (1/5, 1) 的卷积完全相同/5、1/5、1/5、1/5)。卷积计算为 3 * 1/5 + 5 * 1/5 + 4 * 1/5 + 9 * 1/5 + 7 * 1/5 = 5.6

于 2013-08-21T03:46:15.640 回答