Акселерометр Android фильтрует? - PullRequest
5 голосов
/ 20 января 2011

Я видел много примеров фильтрации значений акселерометра, чтобы отменить гравитацию (фильтр верхних частот).

Но большинство из них были 1-го порядка, который, как говорят, прост, но отстает и не самый лучший (хотя я ничего не знаю о фильтрах или DSP).

Кто-то здесь сказал, что существует лучшее решение, используемое в DSP для определения движения. К сожалению, я даже не представляю, что это будет, так как я полностью посторонний в поле.

Я надеюсь, что кто-нибудь может сказать хотя бы тип фильтров, которые можно использовать при работе с датчиком. Конечно, даже краткое введение в конкретный алгоритм будет очень приятно:)

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 20 января 2011

Вы можете попробовать FIR или IIR фильтр более высокого порядка, который может дать вам более резкий переход в частотной области. Но более продвинутым методом является использование адаптивного фильтра Калмана. Вот одна статья об акселерометрах и фильтрах Калмана .

2 голосов
/ 20 января 2011

DSP Guide - это то, что вы ищете.Он дает основную «теорию», а также математику, лежащую в основе цифровой обработки сигналов и работ.

http://www.dspguide.com/ch14.htm Это хорошая отправная точка

Проверьте это.

И, исходя из личного опыта, фильтр 1-го порядка будет достаточно хорошим для большинства простых приложений.Хотя это полностью зависит от конкретного применения

1 голос
/ 20 января 2011

Вы хотите использовать класс Android SensorListener(). Например, «The Schwartz Unsheathed» - это проект Android с открытым исходным кодом, размещенный на Google Code, который выглядит весьма полезным (написанный Кларком Шеффом).

Вы можете проверить его источник через SVN http://code.google.com/p/the-schwartz-unsheathed/source/checkout или просто просмотреть его в Интернете. Источник разбит на Activity ( TheSchwartz.java ) и View ( GraphView.java ). GraphView.java содержит SensorListener() ad onSensorChanged() классы, в которых происходит обработка акселерометром. Строки 284 и 285:

magnitude = (float)Math.sqrt(values[0]*values[0]+values[1]*values[1]+values[2]*values[2]);
magnitude = Math.abs(magnitude - SensorManager.GRAVITY_EARTH);

Значение magnitude оценивается для отсутствия движения, «удара» или «качания» телефона Android. Я понимаю, что это не фильтрует данные в смысле обработки сигналов, но показывает способ классификации данных датчиков. Надеюсь, это поможет.

...