我试图检测设备所在表面的敲击模式。
例如,如果用户在曲面上敲击一次,请运行方法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
}
}
我想主要问题是,如何检测振动?网上几乎所有其他例子都是关于如何检测震动和移动。
答案 0 :(得分:3)
真正的答案 - 您需要学习DSP以获得良好的效果。这是一个非常重要的问题。
快速概览 - 当振动发生时,您将看到正弦衰减波形图(主振动后的衰减信号被称为"振铃"对我们来说是一件坏事 - 这意味着我们需要将振铃与实际结果分开)。这可以被检测并且基于寻找向下矢量上的幅度的快速变化(此时具有重力的任何一个)来发信号通知振动。波峰的相对高度应该是爆震的相对强度。
因此检测一次敲击相当容易。事情并不容易:
*讲述整个房间的敲门声和脚步声之间的差异 - 都会引起震动。他们看起来一样。您可以通过频率分析和过滤器过滤出来
*在短时间内敲响两次敲门声。第二次敲击往往较弱,并且难以区分第一次敲击的响铃。它也可能对第一波产生破坏性干扰。
*确切地说当发生爆震时。将会有一个时间延迟可能不会是恒定的,并试图找出它意味着试图找到一个确切的峰值。噪音很难。
*在嘈杂的环境中敲击(震动嘈杂,不发声)。再次,您需要过滤。
我实际上已经这样做了一些。我认为大多数都失败了。我们能够很好地发现爆震,但根本不能过滤噪音。当然我们正在寻找极小的(1指)敲击,如果你正在寻找尖锐的饶舌,你会遇到更少的问题,因为与噪音水平相比,穗会更大。如果您期待一次尖锐的敲击,那么寻找大尖峰并在之后N毫秒忽略次级尖峰的基础可能就足够了。如果你没有花费大量时间在这上面。