forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Фильтрация данных (http://forum.boolean.name/showthread.php?t=15384)

Lestar 29.08.2011 19:42

Фильтрация данных
 
Имеем девайс с акселерометром,с которого мы снимаем вектор.Но кроме вектора мы получаем еще и мусор в виде дельты.То есть даже если девайс лежит и не шевелится,в каждом фрейме мы получаем различное значение вектора.Каким образом отфильтровать мусор ? Средневзвешенное значение не проходит.

ffinder 29.08.2011 23:26

Ответ: Фильтрация данных
 
нужен low-pass filter (отрезает высокие частоты и оставляет низкие)
Цитата:

В основном, используются два фильтра — высокочастотный (high-pass) и низкочастотный (low-pass). Эти фильтры можно использовать для отсеивания эффектов «дрожания»,
медленных поворотов и т.д.

Низкочастотный фильтр используется для нахождения ориентации устройства, высокочастотный — для определения тряски.

Самый простой низкочастотный фильтр реализует следующий код:
#define FILTERFACTOR 0.1
value = (newAcceleration * FILTERFACTOR) + (previousValue * (1.0 - FILTERFACTOR));
previousValue = value;

Самый простой высокочастотный фильтр реализует следующий код:

#define FILTERFACTOR 0.1
value = newAcceleration - (newAcceleration * FILTERFACTOR) + (previousValue * (1.0 - FILTERFACTOR));
previousValue = value;
взято отсюда: http://habrahabr.ru/blogs/macosxdev/65148/

Lestar 31.08.2011 12:59

Ответ: Фильтрация данных
 
Цитата:

Сообщение от ffinder (Сообщение 200528)
Самый простой низкочастотный фильтр реализует следующий код:
#define FILTERFACTOR 0.1
value = (newAcceleration * FILTERFACTOR) + (previousValue * (1.0 - FILTERFACTOR));
previousValue = value;

Самый простой высокочастотный фильтр реализует следующий код:

#define FILTERFACTOR 0.1
value = newAcceleration - (newAcceleration * FILTERFACTOR) + (previousValue * (1.0 - FILTERFACTOR));
previousValue = value;

Попробовал.Особого эффекта он не дает.На то он по видимому и самый простой.Начал рассматривать это и это

ViNT 31.08.2011 13:52

Ответ: Фильтрация данных
 
Акселерометр цифровой или аналоговый? Если аналоговый, то скорее всего это шум АЦП. Выход - просто игнорировать пару младших разрядов.

Lestar 31.08.2011 15:09

Ответ: Фильтрация данных
 
Аналоговый.Каким образом игнорировать?

moka 31.08.2011 18:33

Ответ: Фильтрация данных
 
Получил, проверил, есть что нада - обработал, то что не нада - проигнорировал.
Получил, проверил, есть только то что не нада - проигнорировал.

Чтобы определить что нада а что нет, у тебя же есть спецификация бинарных данных, так? Так вот и пляши от неё.

ViNT 31.08.2011 18:36

Ответ: Фильтрация данных
 
Цитата:

Сообщение от Lestar (Сообщение 200709)
Аналоговый.Каким образом игнорировать?

Допустим, разрядность АЦП - 10 бит (АЦП МК ATMega8).
Напряжение вычисляется по формуле V=Val*Vref/(2^n-1), где n - разрядность АЦП, Val-значение, снимаемое с АЦП, Vref - опорное напряжение.
Чтобы отсечь шумы, сдвигаем Val на 2 бита вправо, а разрядность (n) уменьшаем на те же 2. То есть, вместо V=Val*Vref/1023 пишем V=(Val shr 2)*Vref/255. Таким образом, получаем 8-разрядный АЦП вместо 10-разрядного, зато отсекаются шумы.

Lestar 31.08.2011 20:39

Ответ: Фильтрация данных
 
Цитата:

Сообщение от MoKa (Сообщение 200730)
Чтобы определить что нада а что нет, у тебя же есть спецификация бинарных данных, так?

Я (конкретно мой случай)имею только в вектору.Я не имею доступ к девайсу.

impersonalis 31.08.2011 20:52

Ответ: Фильтрация данных
 
Установи диапазон частот шума. Впиши соответствующий фильтр
http://ru.wikipedia.org/wiki/Линейная_фильтрация например покури.
Ну и ключевое слово для поиска "ЦОС" (цифровая обработка сигнала - дисциплина такая в ВУЗах есть).

Шум АЦП, как уже говорилось, подавляется игнорированием младших разрядов. Хотя и тут бы можно было провести спектральный анализ снятых данных (для уточнения картины) - делов то.

moka 31.08.2011 20:57

Ответ: Фильтрация данных
 
Цитата:

Сообщение от Lestar (Сообщение 200748)
Я (конкретно мой случай)имею только в вектору.Я не имею доступ к девайсу.

Так а в чём проблема тогда? Не трогай этот вектор, не парься о нём..

Я как понял тут вовсе никакой проблемы с акселерометром, лишь с логикой приложения..

Lestar 31.08.2011 21:33

Ответ: Фильтрация данных
 
Я снимаю с девайса через прослойку вектор.Вектор с шумами.Как я уже писал выше,даже при лежащем девайсе значение вектора изменяется в пределах +/- 30%.Мне эти колебания нужно сгладить/отфильтровать до вменяемых значений.К самому девайсу/прослойке доступа нет.Я могу оперировать только значением вектора.

impersonalis 31.08.2011 21:41

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

http://ru.wikipedia.org/wiki/Дискрет...азование_Фурье

impersonalis 18.05.2013 23:14

Ответ: Фильтрация данных
 
Кстати фильтрацию можно реализовать с помощью этой библиотеки. (Во 2-ом посте приводится упрощённое частное решение).
// на случай, если кто-то вновь будет искать решение проблемы


Часовой пояс GMT +4, время: 00:17.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot