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

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

Например, если пользователь стучит один раз по поверхности, запустите метод А. Если пользователь стучит два раза, запустите метод Б.

У меня есть все, что мне нужно, чтобы это произошло, за исключением логики в методе 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
    }
}

Думаю, главный вопрос в том, как обнаружить вибрации? Почти все остальные примеры в сети посвящены тому, как обнаруживать тряску и движение.


person Markus Olsson    schedule 17.12.2014    source источник


Ответы (1)


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

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

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

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

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

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

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

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

person Gabe Sechan    schedule 17.12.2014
comment
Спасибо за ваш очень информативный ответ. Прочитав ваш ответ, я лучше понял проблему и решение. Есть много проблем, о которых я не подумал, это потребует некоторых экспериментов. Я надеялся, что есть простой способ сделать это. - person Markus Olsson; 17.12.2014