每秒计算加速度计的移动

时间:2017-04-09 16:42:41

标签: java algorithm accelerometer sensor

我试图按照如何计算加速度计数据移动的示例。我想要做的是在Java中实现following algorithm

  

每秒(32个样本)使用以下方法汇总加速度数据:

     

sum + = max3(abs(buffX [i] - prevX),abs(buffY [i] - prevy),abs(buffZ [i] - prevZ));

< p>然后过滤输出:

  平均=平均* 0.9 +(总和/ 32)* 0.1;

我对这类工作并不熟悉,所以我对如何将编写的算法转换为Java代码有一些疑问。看看我试图解决这个问题:

calculateMovementG = new Runnable() {
    @Override
    public void run() {
        if (isRecording) {

            double sum = 0.0;

            for (int i = 1; i < accelRawValues.size(); i++) {
                sum += Math.abs(accelRawValues.get(i).getX() - accelRawValues.get(i - 1).getX());
                sum += Math.abs(accelRawValues.get(i).getY() - accelRawValues.get(i - 1).getY());
                sum += Math.abs(accelRawValues.get(i).getZ() - accelRawValues.get(i - 1).getZ());
            }

            double result = 0.0;
            result = result * 0.9 + (sum/accelRawValues.size() - 1) * 0.1;

            if(result > 3.0) movementData.add(new GsrConverted(result, accelRawValues.get(0).getTimestamp()));

            accelRawValues.clear();

            //repeat every second
            accelHandler.postDelayed(calculateMovementG, 1000);

        } else Log.i(TAG, "isRecording flag false, stopping thread.");
    }
};

我从此算法获得的最低值类似于0.08,而如果我大力握手,我可以获得非常高的值13.50。加速度计安装在手腕上。

当使用官方软件时,我会在文档显示的-2.0和2.0之间获得。如何调整记录的算法(此问题顶部的链接)以获得此范围内的值?

我不清楚&#34; max3&#34;的含义,以及算法第一行中不同abs之间的逗号。我将abs解释为Math.abs。我已在 1 初始化了计数器i,以便无法获得ArrayIndexOutOfBoundsException

感谢您通过评论和解答获得任何帮助!

1 个答案:

答案 0 :(得分:0)

  • max3(abs(buffX [i] - prevX),abs(buffY [i] - prevy),abs(buffZ [i] - prevZ))只是max(max(abs(buffX [i]) - prevX),abs(buffY [i] - prevy)),abs(buffZ [i] - prevZ))。

  • double result = 0.0; result = result * 0.9 + (sum/accelRawValues.size() - 1) * 0.1;中的
  • 你将结果设置为0.0,因此结果* 0.9总是为0,但在算法中没有明确说明,但我认为结果应该是前一次迭代的结果(但我不确定)。
    (sum/accelRawValues.size() - 1)我认为应该是 (sum/ (accelRawValues.size() - 1) )因为它不是一回事。

试试这个

calculateMovementG = new Runnable() {
@Override
public void run() {
    if (isRecording) {

        double sum = 0.0;

        for (int i = 1; i < accelRawValues.size(); i++) {
            int absX = Math.abs(accelRawValues.get(i).getX() - accelRawValues.get(i - 1).getX());
            int absY = Math.abs(accelRawValues.get(i).getY() - accelRawValues.get(i - 1).getY());
            int absZ = Math.abs(accelRawValues.get(i).getZ() - accelRawValues.get(i - 1).getZ());
            sum += Math.max(Math.max(absX, absY), absZ)
        }

        double result = // get the result of the previous iteration
        result = result * 0.9 + (sum/ (accelRawValues.size() - 1)) * 0.1;

        if(result > 3.0) movementData.add(new GsrConverted(result, accelRawValues.get(0).getTimestamp()));

        accelRawValues.clear();

        //repeat every second
        accelHandler.postDelayed(calculateMovementG, 1000);

    } else Log.i(TAG, "isRecording flag false, stopping thread.");
}

};