dit1679
dit1679

Reputation: 74

Smoothing algorithm with android

I have developed a step detection app suing android. There I have filtered my sensor data(accelerometer data x, y, z) and need to smooth the signal with 5-point smoothing algorithm. I saw it in a research paper. I have search about that algorithm and couldn't find a proper resource which can use with android(java). Any one can give me a help that hove can I achieve this.

here is my code to get accelerometer data and filtered with low-pass-filter

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);
    }*/

}

Upvotes: 0

Views: 1250

Answers (1)

stackoverflowuser2010
stackoverflowuser2010

Reputation: 40909

An n-point smoothing algorithm simply returns the average of the currently-stored n data points.

In your case, n=5. Suppose you have already stored 5 data points kept in order of oldest to newest:

Current data: 1, 3, 5, 4, 9 (where the most recently read data was 9)

Suppose further that you now read in the data point 7. All the data is now pushed by one position to the left, with the oldest data point being removed completely. The data points now are:

Current data: 3, 5, 4, 9, 7

Now calculate the average of those values, (3+5+4+9+7)/5 = 5.6, which is the new smoothed value. Every time you add a new value, you should calculate and read a new smoothed value. The stream of the values you read are all smoothed.

Note that, in fact, a discrete FIR filter (which you mentioned) performs the exact smoothing (averaging) operation if you are performing convolution between the data points and coefficients of 1/5. That is, the averaging that I described above, (3+5+4+9+7)/5, is exactly the same as a convolution of (3, 5, 4, 9, 7) and (1/5, 1/5, 1/5, 1/5, 1/5). The convolution computation would be 3 * 1/5 + 5 * 1/5 + 4 * 1/5 + 9 * 1/5 + 7 * 1/5 = 5.6

Upvotes: 1

Related Questions