如何解释在 Android 中检测摇晃事件背后的数学原理?

How to interpret the math behind detecting a shake event in Android?

我在网上看到很多答案,它们都有类似的复制粘贴代码,但 none 确实对他们使用的数学有解释。我对 tutorialspoint 上的代码有一个 URL,这与我在 Whosebug 上看到的答案相同。但是有人可以向我解释这部分代码吗:

   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 是从哪里来的,为什么我们要将它自相乘并加上 delta?我的物理不强,所以对我来说不是很明显。

https://www.tutorialspoint.com/how-to-detect-shake-event-in-android-app

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

  1. mAccelCurrent计算为当前加速度的绝对值
  2. delta 计算为当前加速度绝对值与先前加速度绝对值之差。这样做是为了摆脱恒定的加速度值(重力)并放大摇晃运动(加速度的变化)。
  3. mAccel 计算为 deltaexponential smoothing,一阶滤波,系数为 0.9,根据调用此函数的时间,可以高值或低值(如果被频繁调用,则为低值)。你说得对 0.1f 乘法看起来丢失了,但是如果你查看受保护的 void onCreate 函数中的代码,你会看到 mAccel 在 [=17= 处初始化].换句话说,mAcceldelta 的指数平滑的 10 倍。
  4. 然后将结果与 12 进行比较,12 在我看来是一个任意值。

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