Обнаружение вибрации с помощью акселерометра 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 ответ:
Реальный ответ-вам нужно изучить DSP, чтобы получить хорошие результаты. Это нетривиальная проблема.
Краткий обзор-когда возникает вибрация, вы увидите синусоидальную ослабляющую волновую картину (ослабляющий сигнал после основной вибрации называется "звон" и является плохой вещью для нас - это означает, что нам нужно отделить звон от реальных результатов). Это может быть обнаружено и вибрация сигнализируется на основе поиска быстрых изменений амплитуды на нисходящем векторе (в зависимости от того, какая из них имеет гравитацию в данный момент). Относительная высота пика волны должна быть относительной силой удара.
Так что обнаружить один стук довольно легко. Вещи, которые не так просты:
* Определение разницы между стуком и шагами по комнате - и то, и другое вызывает вибрацию. Они будут выглядеть одинаково. Вы можете отфильтровать его с помощью частотного анализа и фильтров*говорить два стука против одного стука в короткий промежуток времени. Второй стук, как правило, слабее, и будет трудно отличить звон от первого стука. Он также может иметь разрушительную интерференцию с первой волной.
* точно сказать, когда раздался стук. Там будет временная задержка, которая может быть не постоянной, и попытка выяснить это означает попытку найти точный пик. Трудно справиться с шумом.
*говорить стук в шумной окружающей среде (вибрационно шумно, не звук). Опять же, вам понадобится фильтрация.
У меня на самом деле сделал это, в некотором роде. И провалился в основном, я думаю. Мы хорошо улавливали стуки, но совсем не отфильтровывали шум. Конечно, мы искали очень маленькие (1 палец) удары, если вы ищете резкие удары, у вас будет меньше проблем, так как Спайк будет больше по сравнению с уровнем шума. Если вы ожидаете одного резкого удара, вам может быть достаточно основ поиска больших спайков и игнорирования вторичных спайков в течение N миллисекунд после этого. Если это не так, то ты ... я собираюсь потратить на это много времени.