Среднее значение

Пользовательские блоки дополняющие возможности стандартных блоков из разделов Математика и Алгебра, а так-же различные цифровые фильтры
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Ответить
edyapd
Капитан
Сообщения: 768
Зарегистрирован: 20.09.2019{, 11:38}
Репутация: 65
Имя: Эдуард

Среднее значение

#1

Сообщение edyapd » 14.11.2019{, 19:25}

Блоки созданы на основе https://flprog.ru/downloads/usersblocks ... znachenie/
Простое скользящее среднее (Simple Moving Average)
Взвешенное скользящее среднее (Weighted Moving Average)

Блок работает следующим образом:
По переднему фронту считывается значение со входа input. Буфер значений сдвигается от последнего к первому. И полученное значение заносится в последнюю ячейку.
При накоплении в буфере количества значений заданных в Параметрах пользователя вычисляется среднее этих значений.

Отличие этих блоков от исходного в том, что среднее высчитывается каждый раз, при поступлении нового значения.
В этой теме есть блок "скользящее среднее на 8 значений". В этих же блоках можно задавать свои параметры, сколько значений использовать для усреднения.
Чем отличается Простое скользящее среднее от Взвешенное скользящее среднее: При простом среднем все значения одинаково влияют на результат. При взвешенном среднем последнее значение влияет на результат больше, предыдущие чуть меньше и самое первое меньше всех.
Вложения
Простое_скользящее_среднее_float_(CODE).ubi
(17.89 КБ) 294 скачивания
Взвешенное_скользящее_среднее_float_(CODE).ubi
(18.25 КБ) 291 скачивание

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Среднее значение

#2

Сообщение Sancho » 15.11.2019{, 11:46}

edyapd, Вопрос по блоку "Простое скользящее среднее (Simple Moving Average)"- зачем всегда писать в последнюю ячейку и постоянно двигать массив, да ещё флоатовский?
У Вас есть указатель, index, пользуйтесь им, вносите в массив по кольцу.
Но, кстати, сакральный смысл его в Вашем блоке, и вот эта строка:
if ( index < (Количество замеров - 1 ) ) { index++; return; }
мне совсем не понятен, т.е. абсолютно.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

edyapd
Капитан
Сообщения: 768
Зарегистрирован: 20.09.2019{, 11:38}
Репутация: 65
Имя: Эдуард

Среднее значение

#3

Сообщение edyapd » 15.11.2019{, 12:05}

Sancho, дело в том, что я не знаю С от слова совсем. Я могу как попугай повторить то, что уже кем-то написано. Могу чуток подправить. Но пока с трудом могу представить, как двигать индекс по кольцу, да ещё не запутаться в этом. Да и старался два блока делать по одной технологии. А в WMA, при движении индекса, возникли бы сложности с весом значений.
Sancho писал(а):
15.11.2019{, 11:46}
if ( index < (Количество замеров - 1 ) ) { index++; return; }
В этой строке дожидаюсь, когда весь массив заполнится, прежде чем выводить среднее. Иначе это будет среднее непонятно от чего.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Среднее значение

#4

Сообщение Sancho » 15.11.2019{, 12:31}

Подобие - не всегда хорошо, особенно с необоснованными, абсолютно лишними, манипуляциями.
Да ещё и с float.
edyapd писал(а):
15.11.2019{, 12:05}
В этой строке дожидаюсь, когда весь массив заполнится, прежде чем выводить среднее. Иначе это будет среднее непонятно от чего.
Но, по Вашему, у меня до заполнения будет на выходе блока ноль, а это тоже значение, и возможно очень далёкое от замеров. Пример: на входе значения в районе 1000, замеров 10. В данном раскладе 9 замеров 0, потом 1000. А при удалении данной строки: 100, 200, 300 и т.д. - хотя-бы не скачкообразно. Тем более, не известно как будут использоваться результаты.
Или хотя-бы "насквозь":
if ( index < (Количество замеров - 1 ) ) { output = value; index++; return; }
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

edyapd
Капитан
Сообщения: 768
Зарегистрирован: 20.09.2019{, 11:38}
Репутация: 65
Имя: Эдуард

Среднее значение

#5

Сообщение edyapd » 15.11.2019{, 12:46}

Sancho, Тут можно долго спорить, как и когда правильно выводить результат.
Я почему взялся за эти блоки вообще. Поставил датчик BME280 и мне не понравилось, что на выходе резкие скачки. Особенно влажность и давление. Нашёл блок среднее на сайте. Поставил, стало лучше, но в том блоке хоть вход и выход обозначены как float, внутренние переменные int. И это давало погрешность. Вот и взялся переделать под себя. Выложил, подумав, что может ещё кому будет интересно.

Лет пять назад, я писал роботов (чисто для себя) для торговли на бирже. Так вот там среднее начиналось выдаваться, только после того, как было получено не меньше значений, чем было указано. Взял чисто по аналогии.
Sancho писал(а):
15.11.2019{, 12:31}
Да ещё и с float.
Float мне нужен был для десятых температуры. Если кому-то не нужен float то из переделок там только заменить все float на int

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Среднее значение

#6

Сообщение Sancho » 15.11.2019{, 12:50}

Sancho писал(а):
15.11.2019{, 12:31}
Подобие - не всегда хорошо, особенно с необоснованными, абсолютно лишними, манипуляциями.
Да ещё и с float.
речь была об этом:
edyapd писал(а):
15.11.2019{, 12:05}
Но пока с трудом могу представить, как двигать индекс по кольцу, да ещё не запутаться в этом. Да и старался два блока делать по одной технологии. А в WMA, при движении индекса, возникли бы сложности с весом значений.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

edyapd
Капитан
Сообщения: 768
Зарегистрирован: 20.09.2019{, 11:38}
Репутация: 65
Имя: Эдуард

Среднее значение

#7

Сообщение edyapd » 15.11.2019{, 13:09}

Sancho, вы хорошо знакомы с С. Можете мне сказать, сколько времени займёт перенос значения float из одной ячейки массива в другую. Я вполне согласен с вами, что контроллер, который не предназначен для вычисления с плавающей запятой будет долго их обсчитывать, но копирование четырёх байт разве может занять так уж много времени?

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Среднее значение

#8

Сообщение Sancho » 15.11.2019{, 13:11}

edyapd, При 10 размерах - 40. Вопрос в другом - зачем?
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

edyapd
Капитан
Сообщения: 768
Зарегистрирован: 20.09.2019{, 11:38}
Репутация: 65
Имя: Эдуард

Среднее значение

#9

Сообщение edyapd » 15.11.2019{, 13:15}

Sancho писал(а):
15.11.2019{, 13:11}
При 10 размерах - 40
Прошу прощения, не понял.
Sancho писал(а):
15.11.2019{, 13:11}
Вопрос в другом - зачем?
Ну так я же уже объяснил, что не знаю С. Мне проще доработать то, что уже работает.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Среднее значение

#10

Сообщение Sancho » 15.11.2019{, 13:18}

edyapd писал(а):
15.11.2019{, 13:15}
Прошу прощения, не понял.

Код: Выделить всё

for(int i = 1; i < Количество замеров ; i++ ) { array[i - 1] = array[i]; }
размерность массива 10, по 4 байта на флоат - 4=36, сори, перегнул.
edyapd писал(а):
15.11.2019{, 13:15}
Мне проще доработать то, что уже работает.
Вопрос снят.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

edyapd
Капитан
Сообщения: 768
Зарегистрирован: 20.09.2019{, 11:38}
Репутация: 65
Имя: Эдуард

Среднее значение

#11

Сообщение edyapd » 15.11.2019{, 13:44}

Sancho писал(а):
15.11.2019{, 13:18}
размерность массива 10, по 4 байта на флоат.
Дошло. Просто я спрашивал про то, сколько это займёт по времени или по тактам. То есть, сколько можно сэкономить если пустить индекс по кругу.
Если честно, то когда то мог сам легко посчитать, сколько тактов займёт подпрограмма, но эти времена были очень давно, когда я писал на Ассемблере.

Ответить

Вернуться в «Блоки для рассчетов и цифровые фильтры»