Java 如何解释Android中检测震动事件背后的数学原理?
我在网上看到很多答案,它们都有相似的复制粘贴代码,但没有一个真正解释了它们使用的数学。我在TutorialPoint上有一个指向代码的URL,它与我在stackoverflow上看到的答案相同。但是,有人可以向我解释这部分代码: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
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倍李>
如果愿意,您可以使用0.1乘法,它足以将其比较的值减少10倍(1.2而不是12)我查看了代码,也在您链接的tutorialspoint页面上。我在算法中看到了3个步骤:
mAccelCurrent
计算为加速度的当前绝对值delta
计算为当前和以前绝对加速度值之间的差值。这样做是为了消除恒定的加速度值(重力)和振动运动(加速度变化)mAccel
计算为delta
,一阶滤波系数为0.9,根据调用该函数的时间,它可以是高值或低值(如果经常调用,则为低值)。你说得对,0.1f
乘法看起来缺少,但是如果你查看受保护的void onCreate
函数中的代码,你可以看到mAccel
初始化为10f
。换句话说,mAccel
是delta
指数平滑的10倍李>
如果您愿意,您可以使用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@尼古拉斯