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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Усрднение значений фазы
Oldring
сообщение Aug 20 2010, 11:58
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #17


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

Группа: Свой
Сообщений: 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
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #19


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

Группа: Свой
Сообщений: 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
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 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
Stanislav
сообщение Aug 27 2010, 20:42
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987



Цитата(amusin @ Aug 20 2010, 10:38) *
Есть более красивые варианты?
Осредните сперва компоненты сигнального вектора по отдельности, а потом уж находите его фазу.
Способ "осреднения" можно выбрать, исходя из статистических характеристик сигнала и требуемой СКО погрешности оценки фазы.
Осреднение значения фазового угла после его вычисления, в общем случае, будет давать оценку, далекую от оптимальной в смысле СКО на заданной выборке.


--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
Go to the top of the page
 
+Quote Post

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

 


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


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