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

 
 
 
Reply to this topicStart new topic
> Как внести иннерционность в измерение?
hwdev
сообщение Dec 2 2008, 19:11
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 334
Регистрация: 1-09-06
Из: Москва
Пользователь №: 20 008



Есть измерительная система, измеряемый параметр имеет свойство "дрожать" около динамически меняющейся средней точки. Т.е. например значение параметра начинает нарастать, но нарастание это происходит "шаг вперед и 2 назад, потом наоборот". Или остановится около какого-то значения и давай болтаться.

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

Спасибо!
Go to the top of the page
 
+Quote Post
Deka
сообщение Dec 2 2008, 21:06
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 248
Регистрация: 18-07-06
Из: Сочи
Пользователь №: 18 890



Про готовый код не скажу, но применяется такое например в электронных спидометрах. Какая-то разновидность усреднения... где-то видел на форуме. Попробуйте поиск.
Go to the top of the page
 
+Quote Post
Stanislav
сообщение Dec 2 2008, 21:17
Сообщение #3


Гуру
******

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



Цитата(hwdev @ Dec 2 2008, 22:11) *
...Дайте, пожалуйста, ссылку на теорию с примерами или сюда напишите готовый код.
Спасибо!
Простейшая адаптивная система:

,

где - выходные отсчёты; - входные отсчёты (измерения); - константа адаптации.


--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 2 2008, 21:26
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



В зависимости от наличия имеющихся ресурсов (ОЗУ) и равномерности отсчетов можно посоветовать простое скользящее среднее (SMA) или экспоненциальное (EMA). Про них даже в справке к MS Excel можно почитать.
Go to the top of the page
 
+Quote Post
hwdev
сообщение Dec 3 2008, 06:36
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 334
Регистрация: 1-09-06
Из: Москва
Пользователь №: 20 008



Цитата(Deka @ Dec 3 2008, 00:06) *
Про готовый код не скажу, но применяется такое например в электронных спидометрах. Какая-то разновидность усреднения... где-то видел на форуме. Попробуйте поиск.

Да, только у меня электронный тахометр. Дрожит зараза wacko.gif
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 3 2008, 10:17
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(hwdev @ Dec 2 2008, 23:11) *
или сюда напишите готовый код.


Паскаль устроит?

Код
Function TempQuick(mVolt,K:integer):integer;

var LI:longint;
    Temp1:integer;
begin
//рассчитали
  Temp1:=....

//положили в буфер
  TempBuf[TempBufIndex]:=Temp1;

//изменили индекс
  Inc(TempBufIndex);
  If TempBufIndex>TempBufSize then
    begin
      TempBufIndex:=1;
      TempBufReady:=True;
    end;
//сложили буфер
  LI:=0;
  If TempBufReady then  EndIndex:=tempBufSize
                  else  EndIndex:=TempBufIndex-1;
  FOr MyBufIndex:=1 to EndIndex DO  LI:=LI + TempBuf[MyBufIndex];
  If LI<0 then LI:=0;
//поделили на количество элементов
  LI:=LI div EndIndex;
//вернули
  TempQuick:=Integer(LI);
end;


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
drovik
сообщение Dec 3 2008, 11:19
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 7-05-07
Пользователь №: 27 573



А что такое К в данном примере ? Или это какой-то доп параметр, "не имеющий отношения к делу" ? И не будет ли прыгать значение от того, что периодически (при сбросе индекса) за среднее значение берем только что измеренное ? Или я чего-то не догоняю ?
Go to the top of the page
 
+Quote Post
777777
сообщение Dec 4 2008, 07:11
Сообщение #8


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Stanislav @ Dec 3 2008, 00:17) *
Простейшая адаптивная система:

,

где - выходные отсчёты; - входные отсчёты (измерения); - константа адаптации.

А почему >0.5? Можно и меньше, нужно лишь, чтобы этот коэффициент был больше нуля.
В программе эта формула кодируется так:

y += (xn - y)*alpha;

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

Можно даже вычслить этот коэффициент, если известна требуемая постоянная времени

,

где - период следования входных отсчётов; - требуемая постоянная фильтра в секундах. Эта формула реализует цифровой аналог RC-цепочки с постоянной времени ,

Сообщение отредактировал 777777 - Dec 4 2008, 07:37
Go to the top of the page
 
+Quote Post
Stanislav
сообщение Dec 4 2008, 07:42
Сообщение #9


Гуру
******

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



Цитата(777777 @ Dec 4 2008, 10:11) *
А почему >0.5? Можно и меньше, нужно лишь, чтобы этот коэффициент был больше нуля.
Чтобы было хоть какое-нить сглаживание.
Можно и меньше, но это не имеет смысла. Вообще, обычно выбирают в районе 0,9 и больше.

Цитата(777777 @ Dec 4 2008, 10:11) *
...В программе эта формула кодируется так:

y += (xn - y)*alpha;

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

Кстати, забыл написать.
Инициализировать адаптивную систему можно так:
,
т.е., выбрать в качестве начального приближения первый же входной отсчёт, а потом уже усреднять. Иначе долго ждать придётся. smile.gif


--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
Go to the top of the page
 
+Quote Post
hwdev
сообщение Dec 4 2008, 15:40
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 334
Регистрация: 1-09-06
Из: Москва
Пользователь №: 20 008



Цитата(Stanislav @ Dec 4 2008, 10:42) *
Чтобы было хоть какое-нить сглаживание.
Можно и меньше, но это не имеет смысла. Вообще, обычно выбирают в районе 0,9 и больше.

Ну да, то же самое.

Кстати, забыл написать.
Инициализировать адаптивную систему можно так:
,
т.е., выбрать в качестве начального приближения первый же входной отсчёт, а потом уже усреднять. Иначе долго ждать придётся. smile.gif

Спасибо!
Буду применять. А как этот алгоритм переделать в целые числа? Алгоритм всё таки на контроллере будет крутиться, не пентиум smile.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 4 2008, 16:04
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(hwdev @ Dec 4 2008, 20:40) *
А как этот алгоритм переделать в целые числа? Алгоритм всё таки на контроллере будет крутиться, не пентиум smile.gif
Если коэффициент будет константой, а диапазон изменения параметра заранее известен, то дробный коэффициент можно представить как целое число домноженное на 2^N. После умножения достаточно будет арифметическими сдвигами на N разрядов вправо привести результат к правильному значению.
Go to the top of the page
 
+Quote Post
Stanislav
сообщение Dec 4 2008, 17:05
Сообщение #12


Гуру
******

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



Цитата(rezident @ Dec 4 2008, 19:04) *
Если коэффициент будет константой, а диапазон изменения параметра заранее известен, то дробный коэффициент можно представить как целое число домноженное на 2^N. После умножения достаточно будет арифметическими сдвигами на N разрядов вправо привести результат к правильному значению.
Я бы ещё посоветовал использовать для накопления результата Yn арифметику повышенной (двойной) точности, чтобы не было потери разрядов при усечении (округлении).


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

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

 


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


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