Java 加速度传感器的移动平均法
我试图为总体加速制作简单的移动平均线。简单地说,移动平均法应该取4个TotalAccelerate向量的样本,并在运行时对它们进行平均。然后按一个样本移位,然后取下四个样本的平均值,依此类推。 我写的代码不起作用。它崩溃的原因我不知道。我应该使用一个单独的线程来进行计算吗?如果您能编写一个伪代码,我将不胜感激Java 加速度传感器的移动平均法,java,android,arrays,android-studio,Java,Android,Arrays,Android Studio,我试图为总体加速制作简单的移动平均线。简单地说,移动平均法应该取4个TotalAccelerate向量的样本,并在运行时对它们进行平均。然后按一个样本移位,然后取下四个样本的平均值,依此类推。 我写的代码不起作用。它崩溃的原因我不知道。我应该使用一个单独的线程来进行计算吗?如果您能编写一个伪代码,我将不胜感激 double TotalAccelerate; ArrayList<Double> listPeaks; //for Accelermeter sm = (SensorMana
double TotalAccelerate;
ArrayList<Double> listPeaks;
//for Accelermeter
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensorText = (TextView) findViewById(R.id.sensor);
accelermeter = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sm.registerListener(this, accelermeter, SensorManager.SENSOR_DELAY_NORMAL);
mDetector = new GestureDetectorCompat(this, new MyGestureListener());
@Override
public final void onSensorChanged(SensorEvent event) {
// The light sensor returns a single value.
// Many sensors return 3 values, one for each axis.
//If my ToggleButton Ischecked and isListening=true.(at Oncreate method)
if (isListening) {
double xx = event.values[0];
double yy = event.values[1];
double zz = event.values[2];
//The result will be one vector of array
TotalAccelerate = Math.round(Math.sqrt(Math.pow(xx, 2)
+ Math.pow(yy, 2)
+ Math.pow(zz, 2)));
Log.i(DEBUG, "Accelerometer = " + TotalAccelerate);
listPeaks.add(TotalAccelerate);
//findPeaks(listPeaks);
Log.i(DEBUG, "list values " + listPeaks);
//Find moving average - window size= 4
MovingAverage ma = new MovingAverage(4);
ma.newNum(TotalAccelerate);
float valueAfterMovingAverage = (float) ma.getAvg();
sensorText.setText((int) valueAfterMovingAverage);
}
}
public Queue<Double> window = new LinkedList<Double>();
public int p;
public double sum;
///Moving Average class.
public class MovingAverage {
public MovingAverage(int period) {
assert period > 0 : "Period must be a positive integer";
p = period;
}
public void newNum(double num) {
sum += num;
window.add(num);
if (window.size() > p) {
sum -= window.remove();
}
}
public double getAvg() {
if (window.isEmpty()) return 0; // technically the average is undefined
return sum / window.size();
}
}
更改此行:
sensorText.setText((int) valueAfterMovingAverage);
致:
sensorText.setText((int) valueAfterMovingAverage);
sensorText.setText(String.valueOf((int) valueAfterMovingAverage));