Обнаружение вибрации с помощью акселерометра Android


Я пытаюсь обнаружить закономерности стука на поверхности, на которой находится устройство.

Например, если пользователь стучит один раз по поверхности, запустите метод 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 2

1 ответ:

Реальный ответ-вам нужно изучить DSP, чтобы получить хорошие результаты. Это нетривиальная проблема.

Краткий обзор-когда возникает вибрация, вы увидите синусоидальную ослабляющую волновую картину (ослабляющий сигнал после основной вибрации называется "звон" и является плохой вещью для нас - это означает, что нам нужно отделить звон от реальных результатов). Это может быть обнаружено и вибрация сигнализируется на основе поиска быстрых изменений амплитуды на нисходящем векторе (в зависимости от того, какая из них имеет гравитацию в данный момент). Относительная высота пика волны должна быть относительной силой удара.

Так что обнаружить один стук довольно легко. Вещи, которые не так просты:

* Определение разницы между стуком и шагами по комнате - и то, и другое вызывает вибрацию. Они будут выглядеть одинаково. Вы можете отфильтровать его с помощью частотного анализа и фильтров

*говорить два стука против одного стука в короткий промежуток времени. Второй стук, как правило, слабее, и будет трудно отличить звон от первого стука. Он также может иметь разрушительную интерференцию с первой волной.

* точно сказать, когда раздался стук. Там будет временная задержка, которая может быть не постоянной, и попытка выяснить это означает попытку найти точный пик. Трудно справиться с шумом.

*говорить стук в шумной окружающей среде (вибрационно шумно, не звук). Опять же, вам понадобится фильтрация.

У меня на самом деле сделал это, в некотором роде. И провалился в основном, я думаю. Мы хорошо улавливали стуки, но совсем не отфильтровывали шум. Конечно, мы искали очень маленькие (1 палец) удары, если вы ищете резкие удары, у вас будет меньше проблем, так как Спайк будет больше по сравнению с уровнем шума. Если вы ожидаете одного резкого удара, вам может быть достаточно основ поиска больших спайков и игнорирования вторичных спайков в течение N миллисекунд после этого. Если это не так, то ты ... я собираюсь потратить на это много времени.