Android中传感器数据的平均功能

时间:2013-05-31 23:35:54

标签: android math average android-sensors

我正在尝试从SensorManager获取的传感器数据中构建加权平均值。 我的问题是,轴承,俯仰和滚动具有最大值,当我正好在这一点时,值从0到359或向后交换。 我的平均值目前仅仅是所有值的加法和一个除以值的数量。

假设我得到了值:1,359,350,10 在这种情况下,我希望平均值为0.我如何更改方程式才能获得此功能?

我是否必须检查到0/360的“最近”距离并使用此值而不是实际值?

如果我的值大约为180,这也会带来一些麻烦:

160,200 - >平均值必须是180,但是我的最近距离的想法是160,因为200 + 160 = 360。

我该如何解决这个问题?

编辑:这是我从SensorManager获得的值。

  • 0 <=方位角<360
  • 180℃; =节距LT; = 180
  • 90℃; =&辊LT; = 90

Edit2:抱歉,我忘了提到我使用的是加权平均值:

double sum = 0;
for int i = 0; i < max; i++
   sum += value[i] * (i / (triangular_number(max))
return sum

2 个答案:

答案 0 :(得分:1)

我发现了一个blog post

简要总结一下:您必须计算所有aizmuth值的正弦值和aizmuth值的余弦的平均值,然后将这些平均值放在atan2函数中,然后在必要时使结果为正通过添加2 * PI。不要忘记将度数值转换为弧度,反之亦然。

答案 1 :(得分:1)

要计算角度的平均值,请使用以下

public static final float averageAngle(float[] terms, int totalTerm)
{
    float sumSin = 0;
    float sumCos = 0;
    for (int i = 0; i < totalTerm; i++)
    {
        sumSin += Math.sin(terms[i]);
        sumCos += Math.cos(terms[i]);
    }
    return (float) Math.atan2(sumSin / totalTerm, sumCos / totalTerm);
}