Java 如何解释Android中检测震动事件背后的数学原理?

Java 如何解释Android中检测震动事件背后的数学原理?,java,android,sensors,motion,shake,Java,Android,Sensors,Motion,Shake,我在网上看到很多答案,它们都有相似的复制粘贴代码,但没有一个真正解释了它们使用的数学。我在TutorialPoint上有一个指向代码的URL,它与我在stackoverflow上看到的答案相同。但是,有人可以向我解释这部分代码: private final SensorEventListener mSensorListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEven

我在网上看到很多答案,它们都有相似的复制粘贴代码,但没有一个真正解释了它们使用的数学。我在TutorialPoint上有一个指向代码的URL,它与我在stackoverflow上看到的答案相同。但是,有人可以向我解释这部分代码:

   private final SensorEventListener mSensorListener = new SensorEventListener() {
  @Override
  public void onSensorChanged(SensorEvent event) {
     float x = event.values[0];
     float y = event.values[1];
     float z = event.values[2];
     mAccelLast = mAccelCurrent;
     mAccelCurrent = (float) Math.sqrt((double) (x * x + y * y + z * z));
     float delta = mAccelCurrent - mAccelLast;
     // What is this doing?
     mAccel = mAccel * 0.9f + delta;
     if (mAccel > 12) {
        Toast.makeText(getApplicationContext(), "Shake event detected", Toast.LENGTH_SHORT).show();
     }
  }
这条线要干什么

mAccel = mAccel * 0.9f + delta;
0.9f是从哪里来的?为什么我们要把它乘以它本身,再加上增量?我的物理能力不强,所以对我来说不明显


我查看了代码,也查看了您链接的tutorialspoint页面。我在算法中看到了3个步骤:

  • mAccelCurrent
    计算为加速度的当前绝对值
  • delta
    计算为当前和以前绝对加速度值之间的差值。这样做是为了消除恒定的加速度值(重力)和振动运动(加速度变化)
  • mAccel
    计算为
    delta
    ,一阶滤波系数为0.9,根据调用该函数的时间,它可以是高值或低值(如果经常调用,则为低值)。你说得对,
    0.1f
    乘法看起来缺少,但是如果你查看受保护的
    void onCreate
    函数中的代码,你可以看到
    mAccel
    初始化为
    10f
    。换句话说,
    mAccel
    delta
    指数平滑的10倍
  • 然后将结果与12进行比较,在我看来,12是一个任意值

  • 如果愿意,您可以使用0.1乘法,它足以将其比较的值减少10倍(1.2而不是12)

    我查看了代码,也在您链接的tutorialspoint页面上。我在算法中看到了3个步骤:

  • mAccelCurrent
    计算为加速度的当前绝对值
  • delta
    计算为当前和以前绝对加速度值之间的差值。这样做是为了消除恒定的加速度值(重力)和振动运动(加速度变化)
  • mAccel
    计算为
    delta
    ,一阶滤波系数为0.9,根据调用该函数的时间,它可以是高值或低值(如果经常调用,则为低值)。你说得对,
    0.1f
    乘法看起来缺少,但是如果你查看受保护的
    void onCreate
    函数中的代码,你可以看到
    mAccel
    初始化为
    10f
    。换句话说,
    mAccel
    delta
    指数平滑的10倍
  • 然后将结果与12进行比较,在我看来,12是一个任意值

  • 如果您愿意,您可以使用0.1乘法,它足以将其比较的值减少10倍(1.2而不是12)

    这可能是阻尼,
    0.9
    称为阻尼比/系数。它用于稳定输出,因此值不会突然改变。另外,
    mAccelCurrent
    是用毕达哥拉斯定理计算的。但是他们的数学看起来是错误的,如果这真的是阻尼,它应该是类似于
    mAccel=mAccel*0.9f+mAccelCurrent*0.1f
    。它们似乎也不是。@Nicolas在这里是0.9任意的?是和否,通常阻尼比在0.85之间,为什么是0.1f@尼古拉斯很可能是阻尼,
    0.9
    称为阻尼比/系数。它用于稳定输出,因此值不会突然改变。另外,
    mAccelCurrent
    是用毕达哥拉斯定理计算的。但是他们的数学看起来是错误的,如果这真的是阻尼,它应该是类似于
    mAccel=mAccel*0.9f+mAccelCurrent*0.1f
    。它们似乎也不是。@Nicolas在这里是0.9任意的?是和否,通常阻尼比在0.85之间,为什么是0.1f@尼古拉斯