реклама на сайте
подробности

 
 
> Усрднение значений фазы
amusin
сообщение Aug 20 2010, 06:38
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 120
Регистрация: 2-09-05
Из: Екатеринбург
Пользователь №: 8 165



Есть измерения фазы в диапазоне 0...359 градусов.
Допустим, показания болтаются около отметки 0 градусов:
половина значений в первом квадранте, половина - в четвертом.
Среднее арифметическое даст примерно 180 градусов, что неверно.

Пока видится одно решение:
сохраняем массив измерений,
доворачиваем измерения настолько, чтобы сектор "болтанки" не лежал на угле 0 градусов.
Решение не нравится тем, что надо копить данные в ОЗУ.

Есть более красивые варианты?

Сообщение отредактировал amusin - Aug 20 2010, 06:38
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
thermit
сообщение Aug 20 2010, 11:55
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



Цитата
Oldring:
Это не усреднение, а фильтрация IIR фильтром первого порядка.


Усреднение - тоже фильтрация однородным фиром. Этот однородный фир проще заменить ииром без потери качества.
Хотя, есть любители преодолевать трудности...
Go to the top of the page
 
+Quote Post
Oldring
сообщение Aug 20 2010, 11:58
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(thermit @ Aug 20 2010, 15:55) *
Усреднение - тоже фильтрация однородным фиром. Этот однородный фир проще заменить ииром без потери качества.
Хотя, есть любители преодолевать трудности...


С некоторой небольшой потерей качества.
И проще как раз не заменять фильтром, а просто суммировать, если не требуется постоянное плавное обновление отсчетов. Всё равно нужна сравнимая разрядность суммы.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Aug 20 2010, 12:28
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565



Ребят. Я в научных терминах не силён. Но предложенный мной алгоритм - усредняет.
Код примерно следующий:
Код
#define L 16

signed short W[L]; //must be cleared
signed short F=0;  //0..359
signed int S=0;    //-179L...180L
signed int N=0;    //0...L-1
signed short GetPhaseDiff(signed short A)
{
static signed short Old;
signed short B;
B=A-Old;
if (B>180)  B=B-360;
if (B<-179) B=B+360;
Old=A;
return B;
}

void PhaseCalc(signed short A)
{
signed short B;
B=GetPhaseDiff(A);  //-179...180
//-----------------window filter of B
S=S-W[N]+B;W[N]=B;
N=N+1; if (N>=L) N=0;
S=S-S/65536;               //stekanie
if (S>(180*L)) S=180*L;   //perepolnenie
if (S<(-179*L)) S=-179*L; //perepolnenie
//-----------------F update
F=F+S/L;
if (F<0) F=F+360;
if (F>359) F=F-360;
}

На рисунке - красным идеальная фаза, синим - снятая датчиком, зелёным - отфильтрованная окном с длиной 16.
Эскизы прикрепленных изображений
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  PhaseFilter.zip ( 742 байт ) Кол-во скачиваний: 18
 
Go to the top of the page
 
+Quote Post
Oldring
сообщение Aug 20 2010, 12:48
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(_4afc_ @ Aug 20 2010, 16:28) *
Код примерно следующий:


Просто кошмар!
Во-первых, на многих микроконтроллерах int 16-битный, поэтому алгоритм будет как-то работать, только если число точек в окне не превышает порядка 150. Кстати, такого буфера окна автор вопроса хотел избежать.

Во-вторых, F - это кумулятивная сумма от среднего, но не само среднее. Зачем она вам вобще нужна?

В-третьих, любому программисту известно, что "стекание" будет работать только при превышении модулем S величины 65535.

В-четвертых, "переполнение" S может наблюдаться только в том случае, если каким-то образом поработает немного "стекание", а иначе оно возникнуть не может.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Aug 20 2010, 13:13
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565



Цитата(Oldring @ Aug 20 2010, 16:48) *
Во-первых, на многих микроконтроллерах int 16-битный, поэтому алгоритм будет как-то работать, только если число точек в окне не превышает порядка 150. Кстати, такого буфера окна автор вопроса хотел избежать.

Прикол в том, что результат GetPhaseDiff() уже можно фильтровать любым фильтром.
Собственно GetPhaseDiff() и есть ответ на вопрос заданный вначале темы.
В данном случае B отлично отфильтрован 16 точечным скользящим окном.
Переменная S может быть любой разрядности, было бы желание.
Цитата(Oldring @ Aug 20 2010, 16:48) *
Во-вторых, F - это кумулятивная сумма от среднего, но не само среднее. Зачем она вам вобще нужна?

Я таких умных словей как "кумулятивная сумма от среднего" не знаю.
Если окно не нужно - его можно не использовать. Тупо складывайте значения B и делите на их количество - узнаете среднее изменение фазы за всё время наблюдения.
Цитата(Oldring @ Aug 20 2010, 16:48) *
В-третьих, любому программисту известно, что "стекание" будет работать только при превышении модулем S величины 65535.

Обычно S у меня с фиксированной точкой как и В. Например 16.16.
Цитата(Oldring @ Aug 20 2010, 16:48) *
В-четвертых, "переполнение" S может наблюдаться только в том случае, если каким-то образом поработает немного "стекание", а иначе оно возникнуть не может.

В реальной жизни чего только не бывает, при реализации алгоритмов ЦОС на конкретном железе.
Приведённый код - показывает идею, и как использовать результат GetPhaseDiff().
Go to the top of the page
 
+Quote Post
Oldring
сообщение Aug 20 2010, 13:18
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(_4afc_ @ Aug 20 2010, 17:13) *
Обычно S у меня с фиксированной точкой как и В. Например 16.16.


В коде написано int. Арифметика - целочисленная. Где вы там вообразили запятую - значения не имеет.

Цитата(_4afc_ @ Aug 20 2010, 17:13) *
чего только не бывает, при реализации алгоритмов ЦОС на конкретном железе.


На работающем - не бывает.
На неработающем - лучше не работать, всё равно хорошо не получится.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- amusin   Усрднение значений фазы   Aug 20 2010, 06:38
- - Oldring   Цитата(amusin @ Aug 20 2010, 10:38) Есть ...   Aug 20 2010, 07:05
|- - amusin   Цитата(Oldring @ Aug 20 2010, 13:05) Спа...   Aug 20 2010, 07:20
- - Fat Robot   усрядняете cos(phi) и sin(phi). в конце - 4-х квад...   Aug 20 2010, 07:09
- - _4afc_   Цитата(amusin @ Aug 20 2010, 10:38) Есть ...   Aug 20 2010, 07:25
|- - Oldring   Цитата(_4afc_ @ Aug 20 2010, 11:25) Вариа...   Aug 20 2010, 08:17
|- - _4afc_   Цитата(_4afc_ @ Aug 20 2010, 11:25) Для б...   Aug 20 2010, 08:56
|- - fontp   QUOTE (_4afc_ @ Aug 20 2010, 12:56) Верне...   Aug 20 2010, 10:11
||- - Oldring   Цитата(fontp @ Aug 20 2010, 14:11) первый...   Aug 20 2010, 10:43
||- - fontp   QUOTE (Oldring @ Aug 20 2010, 14:43) Чушь...   Aug 20 2010, 10:54
|- - Oldring   Цитата(_4afc_ @ Aug 20 2010, 12:56) Не ви...   Aug 20 2010, 11:11
|- - fontp   QUOTE (Oldring @ Aug 20 2010, 15:11) CODE...   Aug 20 2010, 11:32
|- - Oldring   Цитата(fontp @ Aug 20 2010, 15:32) Посмот...   Aug 20 2010, 11:47
- - thermit   Цитатаamusin: Есть измерения фазы в диапазоне 0......   Aug 20 2010, 11:35
- - Stanislav   Цитата(amusin @ Aug 20 2010, 10:38) Есть ...   Aug 27 2010, 20:42


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 13:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016