我开发了一个步进检测应用程序起诉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);
}*/
}
答案 0 :(得分:0)
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