gpt4 book ai didi

android - 使用 Android 加速度计检测振动

转载 作者:搜寻专家 更新时间:2023-11-01 08:46:45 26 4
gpt4 key购买 nike

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

例如,如果用户在表面上敲了一次,则运行方法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
}
}

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

最佳答案

真正的答案——你需要学习 DSP 才能获得好的结果。这是一个非常重要的问题。

快速概览 - 当振动发生时,您会看到正弦衰减波形(主振动后的衰减信号称为“振铃”,这对我们来说是一件坏事 - 这意味着我们需要将振铃分开来自实际结果)。可以检测到这一点,并根据寻找向下矢量振幅的快速变化(无论哪个现在有重力)发出振动信号。波峰的相对高度应该是爆震的相对强度。

因此检测一次敲门声相当容易。不容易的事情:

*区分敲门声和穿过房间的脚步声——两者都会引起震动。他们看起来一样。您可以通过频率分析和过滤器将其过滤掉

*在短时间内说出两次敲门与一次敲门。第二次敲门声往往较弱,很难与第一次敲门声区分开来。也可能对第一波有相消干涉。

*准确说明爆震发生的时间。会有一个可能不是恒定的时间延迟,并且试图弄清楚它意味着试图找到一个确切的峰值。很难处理噪音。

*在嘈杂的环境中说出敲门声(振动噪音,不是声音)。同样,您需要过滤。

我确实在某种程度上做到了这一点。我认为主要是失败了。我们能够很好地检测到爆震,但根本无法滤除噪音。当然,我们正在寻找极小的(1 个手指)敲击声,如果您正在寻找尖锐的敲击声,那么问题会更少,因为尖峰与噪音水平相比会更大。如果您期待一次尖锐的敲击,那么寻找大尖峰并在 N 毫秒后忽略次级尖峰的基础知识可能对您来说就足够了。如果不是,您将在这上面花费大量时间。

关于android - 使用 Android 加速度计检测振动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27516390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com