我试图按照如何计算加速度计数据移动的示例。我想要做的是在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
。
感谢您通过评论和解答获得任何帮助!
答案 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.");
}
};