PDA

Просмотр полной версии : Фильтр пиковых значений



tomas111
12.10.2018, 10:16
Добрый день, понимаю что тема не нова. И скорее всего есть уже написанная библиотека только надо найти.
Для аналогово датчика REAl требуется данная фильтрация что бы исключить ложные пиковые данные.
Как я вижу данный блок:
Вход BOOL (* Активация ФБ / можно и без него *)
Вход REAL (* приходит входное значение *)
Вход WORD (* количество измерений *)

Выход REAL (* выходная переменная отфильтрованная *)

Внутри должен быть регулирующийся массив в котором складываются значения. и выбирает самые близкие.

39168

capzap
12.10.2018, 10:37
погуглите тему линейная регрессия, возможно поможет

tomas111
12.10.2018, 10:55
погуглите тему линейная регрессия, возможно поможет

Нее это немного не то. У меня есть ФБ средних значений. Но иногда показания с датчика выходят за пределы и получается что линейная регрессия показывает не то что надо...

capzap
12.10.2018, 11:36
блок средних значений это же не по методу наименьших квадратов, да и вообще зная медиану и отсекая от обработки значения превышающие определенный порог как можно повернуть тренд не туда

tomas111
12.10.2018, 12:25
блок средних значений это же не по методу наименьших квадратов, да и вообще зная медиану и отсекая от обработки значения превышающие определенный порог как можно повернуть тренд не туда

Да Вы правы. Но в том то и смысл перед ФБ средних значений поставить дополнительный который откидывает значения.
Я подумал и наверное будет выглядеть так:

Вход BOOL (* Активация ФБ / можно и без него *)
Вход REAL (* приходит входное значение *)
Вход WORD (* количество измерений *)
Вход REAL (* отклонение от нормы +/- *)

Выход REAL (* выходная переменная отфильтрованная *)

Этому блоку не хватает значения отклонения. Который я добавил выше. На самом деле я не пойму как работать с массивом данных... Как убрать из массива "ненужные/ за предельные" показания.

capzap
12.10.2018, 12:37
пересчитайте массив за предыдущий цикл используя например 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)), всё что за пределами первых линии можно отбрасывать

Хорошая статья, написано что зачастую это средняя арифметическое.
А я хотел бы все же что бы всё происходило не по средней а по пику. Может подскажите какие есть идеи с библиотеками ? Может надо просто поискать...

capzap
12.10.2018, 13:42
так зачем Вам пик, если он не нужен, перед тем как заносить значение в массив, вычисляете пивот, и в массив задаете значение пропущенное через LIMIT, где границы диапазона будут линии пивота и текущее значение, тогда сам массив уже будет лишен всплесков

tomas111
12.10.2018, 16:38
Не совсем понятно, как? Буду не против более подробного ответа.

_Pavel_
12.10.2018, 21:09
Для аналогово датчика REAl требуется данная фильтрация что бы исключить ложные пиковые данные.
39168

Я думаю для решения данной задачи подойдёт Медианный фильтр.
Медианная фильтрация — эффективная процедура обработки сигналов, подверженных воздействию импульсных помех.
Реализация на ST очень хорошо описана в книге Петрова "Программируемые контроллеры. Стандартные языки и приёмы прикладного проектирования" стр 217, погуглите.

tomas111
15.10.2018, 11:18
в проекте слегка заморочено, в эмуляции, не стартуя, нажмите шесть раз CTRL+F5 и увидите как на скрине, что новое значение ниже нижней границы и вместо него записывается нижний край пивота

Какая целевая платформа? Ругается codesys...

capzap
15.10.2018, 11:25
наверное 100K-L

tomas111
15.10.2018, 11:57
наверное 100K-L

Да открыл. Вопрос а если будет изменения на входе блока от 0.0 до 100.0 как тогда поведет? На самом деле думал уже как сделать но подводные камни обнаруживаю...

capzap
15.10.2018, 11:59
умножте выход генератора на сто, вот и будут значения от 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

Slev
06.12.2018, 20:34
фильтрация что бы исключить ложные пиковые данные.
39168
Вроде, это называлось треугольным фильтром ( или фильтром треугольника) ...

tomas111
07.12.2018, 16:00
Вроде, это называлось треугольным фильтром ( или фильтром треугольника) ...

Гуглил по названию, но что то не чего не нашёл...