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

问题描述 投票:0回答:1

我在网上看到了很多答案,而且它们都有相似的复制粘贴代码,但是没有一个人对它们使用的数学有任何解释。我在tutorialspoint上有一个指向该代码的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是从哪里来的,为什么我们要自己乘以0.9f并加上增量?我的身体不强,所以对我来说并不明显。

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

java android sensor motion shake
1个回答
0
投票

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

  1. [mAccelCurrent计算为当前的加速度绝对值
  2. delta被计算为当前加速度绝对值与先前加速度绝对值之差。这样做是为了消除恒定的加速度值(重力)并放大震动(加速度的变化)。
  3. mAccel被计算为exponential smoothingdelta,具有0.9系数的一阶滤波,取决于调用此函数的时间,可以为高值或低值(如果为经常调用,这是一个较低的值)。没错,0.1f乘法似乎丢失了,但是如果查看受保护的void onCreate函数中的代码,则可以看到mAccel已初始化为10f。换句话说,mAcceldelta的指数平滑的10倍。
  4. 然后将结果与12进行比较,这对我来说是一个任意值。

如果愿意,可以使用0.1乘法,将与其相比较的值也减小10倍就足够了(1.2而不是12)

© www.soinside.com 2019 - 2024. All rights reserved.