Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 加速度传感器的移动平均法_Java_Android_Arrays_Android Studio - Fatal编程技术网

Java 加速度传感器的移动平均法

Java 加速度传感器的移动平均法,java,android,arrays,android-studio,Java,Android,Arrays,Android Studio,我试图为总体加速制作简单的移动平均线。简单地说,移动平均法应该取4个TotalAccelerate向量的样本,并在运行时对它们进行平均。然后按一个样本移位,然后取下四个样本的平均值,依此类推。 我写的代码不起作用。它崩溃的原因我不知道。我应该使用一个单独的线程来进行计算吗?如果您能编写一个伪代码,我将不胜感激 double TotalAccelerate; ArrayList<Double> listPeaks; //for Accelermeter sm = (SensorMana

我试图为总体加速制作简单的移动平均线。简单地说,移动平均法应该取4个TotalAccelerate向量的样本,并在运行时对它们进行平均。然后按一个样本移位,然后取下四个样本的平均值,依此类推。 我写的代码不起作用。它崩溃的原因我不知道。我应该使用一个单独的线程来进行计算吗?如果您能编写一个伪代码,我将不胜感激

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));