使用Android加速度计检测振动

时间:2014-12-17 00:22:25

标签: android accelerometer sensor detect vibration

我试图检测设备所在表面的敲击模式。

例如,如果用户在曲面上敲击一次,请运行方法A.如果用户敲了两次,请运行方法B.

除了onSensorChanged方法中的逻辑之外,我拥有实现这一目标所需的一切。 这是我现在的代码:

@Override
public void onSensorChanged(SensorEvent event) {
    float x = event.values[0];
    float y = event.values[1];
    float z = event.values[2];

    //Check time interval, not sure if this is correct though.
    long actualTime = System.currentTimeMillis();
    if ((actualTime - lastUpdate) > 100) {
        long diffTime = (actualTime - lastUpdate);
        lastUpdate = actualTime;

        //This is where the magic should happen
    }
}

我想主要问题是,如何检测振动?网上几乎所有其他例子都是关于如何检测震动和移动。

1 个答案:

答案 0 :(得分:3)

真正的答案 - 您需要学习DSP以获得良好的效果。这是一个非常重要的问题。

快速概览 - 当振动发生时,您将看到正弦衰减波形图(主振动后的衰减信号被称为"振铃"对我们来说是一件坏事 - 这意味着我们需要将振铃与实际结果分开)。这可以被检测并且基于寻找向下矢量上的幅度的快速变化(此时具有重力的任何一个)来发信号通知振动。波峰的相对高度应该是爆震的相对强度。

因此检测一次敲击相当容易。事情并不容易:

*讲述整个房间的敲门声和脚步声之间的差异 - 都会引起震动。他们看起来一样。您可以通过频率分析和过滤器过滤出来

*在短时间内敲响两次敲门声。第二次敲击往往较弱,并且难以区分第一次敲击的响铃。它也可能对第一波产生破坏性干扰。

*确切地说当发生爆震时。将会有一个时间延迟可能不会是恒定的,并试图找出它意味着试图找到一个确切的峰值。噪音很难。

*在嘈杂的环境中敲击(震动嘈杂,不发声)。再次,您需要过滤。

我实际上已经这样做了一些。我认为大多数都失败了。我们能够很好地发现爆震,但根本不能过滤噪音。当然我们正在寻找极小的(1指)敲击,如果你正在寻找尖锐的饶舌,你会遇到更少的问题,因为与噪音水平相比,穗会更大。如果您期待一次尖锐的敲击,那么寻找大尖峰并在之后N毫秒忽略次级尖峰的基础可能就足够了。如果你没有花费大量时间在这上面。