Просмотр полной версии : Фильтр пиковых значений
tomas111
12.10.2018, 10:16
Добрый день, понимаю что тема не нова. И скорее всего есть уже написанная библиотека только надо найти.
Для аналогово датчика REAl требуется данная фильтрация что бы исключить ложные пиковые данные.
Как я вижу данный блок:
Вход BOOL (* Активация ФБ / можно и без него *)
Вход REAL (* приходит входное значение *)
Вход WORD (* количество измерений *)
Выход REAL (* выходная переменная отфильтрованная *)
Внутри должен быть регулирующийся массив в котором складываются значения. и выбирает самые близкие.
39168
погуглите тему линейная регрессия, возможно поможет
tomas111
12.10.2018, 10:55
погуглите тему линейная регрессия, возможно поможет
Нее это немного не то. У меня есть ФБ средних значений. Но иногда показания с датчика выходят за пределы и получается что линейная регрессия показывает не то что надо...
блок средних значений это же не по методу наименьших квадратов, да и вообще зная медиану и отсекая от обработки значения превышающие определенный порог как можно повернуть тренд не туда
tomas111
12.10.2018, 12:25
блок средних значений это же не по методу наименьших квадратов, да и вообще зная медиану и отсекая от обработки значения превышающие определенный порог как можно повернуть тренд не туда
Да Вы правы. Но в том то и смысл перед ФБ средних значений поставить дополнительный который откидывает значения.
Я подумал и наверное будет выглядеть так:
Вход BOOL (* Активация ФБ / можно и без него *)
Вход REAL (* приходит входное значение *)
Вход WORD (* количество измерений *)
Вход REAL (* отклонение от нормы +/- *)
Выход REAL (* выходная переменная отфильтрованная *)
Этому блоку не хватает значения отклонения. Который я добавил выше. На самом деле я не пойму как работать с массивом данных... Как убрать из массива "ненужные/ за предельные" показания.
пересчитайте массив за предыдущий цикл используя например pivot (https://en.wikipedia.org/wiki/Pivot_point_(technical_analysis)), всё что за пределами первых линии можно отбрасывать
tomas111
12.10.2018, 13:37
пересчитайте массив за предыдущий цикл используя например pivot (https://en.wikipedia.org/wiki/Pivot_point_(technical_analysis)), всё что за пределами первых линии можно отбрасывать
Хорошая статья, написано что зачастую это средняя арифметическое.
А я хотел бы все же что бы всё происходило не по средней а по пику. Может подскажите какие есть идеи с библиотеками ? Может надо просто поискать...
так зачем Вам пик, если он не нужен, перед тем как заносить значение в массив, вычисляете пивот, и в массив задаете значение пропущенное через LIMIT, где границы диапазона будут линии пивота и текущее значение, тогда сам массив уже будет лишен всплесков
tomas111
12.10.2018, 16:38
Не совсем понятно, как? Буду не против более подробного ответа.
Для аналогово датчика REAl требуется данная фильтрация что бы исключить ложные пиковые данные.
39168
Я думаю для решения данной задачи подойдёт Медианный фильтр.
Медианная фильтрация — эффективная процедура обработки сигналов, подверженных воздействию импульсных помех.
Реализация на ST очень хорошо описана в книге Петрова "Программируемые контроллеры. Стандартные языки и приёмы прикладного проектирования" стр 217, погуглите.
tomas111
15.10.2018, 11:18
в проекте слегка заморочено, в эмуляции, не стартуя, нажмите шесть раз CTRL+F5 и увидите как на скрине, что новое значение ниже нижней границы и вместо него записывается нижний край пивота
Какая целевая платформа? Ругается codesys...
tomas111
15.10.2018, 11:57
наверное 100K-L
Да открыл. Вопрос а если будет изменения на входе блока от 0.0 до 100.0 как тогда поведет? На самом деле думал уже как сделать но подводные камни обнаруживаю...
умножте выход генератора на сто, вот и будут значения от 0.0 до 100.0
а лучше чего нибудь свое придумайте, чтоб обычно был маленький разброс, а только иногда большие отклонения
ЗЫ виноват, просто на сто умножить не получиться, в функции pivot я не стал делать границы диапазонов REAL, а просто от 0 до 1, поэтому корректно не работал при умножении, поправил
tomas111
29.10.2018, 14:25
Выбыл из колеи. Надо посмотреть! Хотя в спешке написал по своему. Но проверить не успел.
tomas111
06.12.2018, 17:21
умножте выход генератора на сто, вот и будут значения от 0.0 до 100.0
а лучше чего нибудь свое придумайте, чтоб обычно был маленький разброс, а только иногда большие отклонения
ЗЫ виноват, просто на сто умножить не получиться, в функции pivot я не стал делать границы диапазонов REAL, а просто от 0 до 1, поэтому корректно не работал при умножении, поправил
Открыл проект, но увидел что он начинает отрисовывать не с самого начала... Почему?
40243
фильтрация что бы исключить ложные пиковые данные.
39168
Вроде, это называлось треугольным фильтром ( или фильтром треугольника) ...
tomas111
07.12.2018, 16:00
Вроде, это называлось треугольным фильтром ( или фильтром треугольника) ...
Гуглил по названию, но что то не чего не нашёл...
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot