Страница 1 из 1

Поиск выбросов

Добавлено: 19 дек 2015, 21:09
Artem.spb
Очередная модификация прибора у заказчика привела к тому, что прога перестала работать. Нужна помощь знатоков.
Задача: отслеживать сигнал с порта. Как только он отклоняется от нормы на заданную величину, начать запись в лог, и писать пока не вернётся обратно.
Вот сигнал с выпадами
signal.png
В проге уже есть настройка величин выпадов (максимум отклонения от нормы для начала записи). Сначала был ещё и базовый уровень (норма).
В очередной эволюции прибора появилась главная сложность: базовый уровень плавает. Т.е. Сейчас он для верхнего графика ~47975, а через час может стать 48200.
Поэтому от нормы, задаваемой руками пришлось отказаться.
Предпоследняя эволюция была такой:
Считаю скользящее среднее (глубину задаёт пользователь). И есть предельное отклонение. Как только текущая точка сильно убежала от среднего, начинаю писать. При этом запомнил текущую норму (пока пишу, значение среднего не обновляется). Вернулся в допуск, перестаю записывать лог и снова считаю скользящее.
Но сейчас сигнал такой, что среднее плавно его догоняет, и запуска записи не происходит.
Посоветуйте, как быть.
Пока прихожу к тому, что среднее надо считать ещё и с запаздыванием. Т.е. для проверки на вшивость брать среднее в N точек, которое было M точек назад.

Re: Поиск выбросов

Добавлено: 19 дек 2015, 21:29
IvanLis
Artem.spb писал(а):Предпоследняя эволюция была такой:
Считаю скользящее среднее (глубину задаёт пользователь). И есть предельное отклонение. Как только текущая точка сильно убежала от среднего, начинаю писать. При этом запомнил текущую норму (пока пишу, значение среднего не обновляется). Вернулся в допуск, перестаю записывать лог и снова считаю скользящее.
Но сейчас сигнал такой, что среднее плавно его догоняет, и запуска записи не происходит.
Посоветуйте, как быть.
Пока прихожу к тому, что среднее надо считать ещё и с запаздыванием. Т.е. для проверки на вшивость брать среднее в N точек, которое было M точек назад.
Я бы попробовал:
1. Поиграть с "глубиной", в твоем случае ее видимо нужно увеличить, что бы "скользящее" не догоняло сигнал при его резком изменении.
2. При подсчете "скользящей средней" не учитывать аномальные значения выбросов. Т.е. как только был зафиксирован выброс, то подменять реальные значения на ... :think: например последнее "нормальное" значение. Когда сигнал вернулся в норму, то начинаем "скармливать" снова реальные значения.

3. Более научный способ. Посчитать первую и вторую производные, посмотреть статистику, построить гистограммы, определить аномальные значения "скорости" и "ускорения" по модулю, после чего определить критерий принятия решения. Можно даже прикинуть ошибки первого и второго рода.

Re: Поиск выбросов

Добавлено: 19 дек 2015, 22:00
alerm
IvanLis, могу ошибаться, вторая производная определят рост и падение графика, с замедлением и ускорением, в данной задаче они не играют ни какой роли.

Re: Поиск выбросов

Добавлено: 19 дек 2015, 22:24
IvanLis
alerm писал(а):IvanLis, могу ошибаться, вторая производная определят рост и падение графика, с замедлением и ускорением, в данной задаче они не играют ни какой роли.
Ну сразу утверждать нельзя, но возможно Вы и правы.
Хотя вторая производная, это ускорение - скорость изменения скорости, может что и покажет.

Re: Поиск выбросов

Добавлено: 20 дек 2015, 11:06
Borjomy_1
По второму графику вряд-ли что-то сделать удастся, а вот по первому
Если паразитные отклонения всегда идут в сторону уменьшения, то нужно не скользящее среднее, а скользящий максимум. Только окно делать таким, чтобы паразитный выброс всегда в него укладывался, либо сохранять это значение до достижения нормы.

Re: Поиск выбросов

Добавлено: 21 дек 2015, 11:03
kiparym
Предлагаю попробовать другой метод регистрации импульсов. Вместо средней скользящей, применить скользящую линейную аппроксимацию. По углу наклона линии можно регистрировать импульс. По сравнению со средней скользящей, данный способ обладает меньшим отставанием.
p.s. Линия обладает фильтрующей способностью, отсекая НЧ и ВЧ составляющие, повторяя свойства 1ой производной.

Re: Поиск выбросов

Добавлено: 21 дек 2015, 14:20
Artem.spb
IvanLis писал(а): 1. Поиграть с "глубиной", в твоем случае ее видимо нужно увеличить, что бы "скользящее" не догоняло сигнал при его резком изменении.
2. При подсчете "скользящей средней" не учитывать аномальные значения выбросов. Т.е. как только был зафиксирован выброс, то подменять реальные значения на ... :think: например последнее "нормальное" значение. Когда сигнал вернулся в норму, то начинаем "скармливать" снова реальные значения.
в целом на глубине 400-500 есть шанс поймать
Borjomy_1 писал(а):Если паразитные отклонения всегда идут в сторону уменьшения, то нужно не скользящее среднее, а скользящий максимум. .
это как? максимум из последних N штук?
kiparym писал(а):Вместо средней скользящей, применить скользящую линейную аппроксимацию.
гм
надо потестить

Re: Поиск выбросов

Добавлено: 21 дек 2015, 19:39
IvanLis
Artem.spb писал(а):гм
надо потестить
Артем, ты выложи записи сигналов, желательно txt.
Те которые полностью, не только аномальные.
У кого будет время, могут попробовать реализовать свои идеи.

Re: Поиск выбросов

Добавлено: 21 дек 2015, 22:02
Artem.spb
1.txt - то ючто нужно обнаруживать
7.txt содержит аномальные выбросы (скорее всего, глюк железа), их надо игнорировать.
выглядят они так:
1.jpg

Re: Поиск выбросов

Добавлено: 22 дек 2015, 11:19
kiparym
Сильно не вникал в цель задачи – нет времени перед Новым годом, но попробую помочь.
7.txt содержит аномальные выбросы (скорее всего, глюк железа), их надо игнорировать.
Для удаления импульсных помех воспользуйтесь «Median Filter.vi » с коэффициентом left rank>4.
1.txt - то что нужно обнаруживать
Для выделения импульсов можно воспользоваться, как говорил ранее, скользящей линией. Организация скользящей линейной аппроксимации на основе стандартных функций LW, потребует значительного времени обработки, т.к. на каждом шаге скольжения, функция будет обрабатывать входной массив заново. Для организации алгоритма скользящей линии, достаточно обрабатывать только первую и последнюю точку линии, а результат корректировать. Для этих целей и была разработана самодельная SUBVI – можете пользоваться (режим работы- Point By Point). Фазовая задержка на выходе блока фиксированная и зависит только от выбранной длины линии.

Re: Поиск выбросов

Добавлено: 24 дек 2015, 23:19
Artem.spb
kiparym писал(а): Для выделения импульсов можно воспользоваться, как говорил ранее, скользящей линией. Организация скользящей линейной аппроксимации на основе стандартных функций LW, потребует значительного времени обработки, т.к. на каждом шаге скольжения, функция будет обрабатывать входной массив заново. Для организации алгоритма скользящей линии, достаточно обрабатывать только первую и последнюю точку линии, а результат корректировать. Для этих целей и была разработана самодельная SUBVI – можете пользоваться (режим работы- Point By Point). Фазовая задержка на выходе блока фиксированная и зависит только от выбранной длины линии.
Спасибо, воспользовался.
пока железа нет, в бою не потестить. да и код, который работает непонятно как (закрыто паролем) немного боязно использовать, но пока устраивает.

Re: Поиск выбросов

Добавлено: 25 дек 2015, 08:48
kiparym
...да и код, который работает непонятно как (закрыто паролем) немного боязно использовать
Если вас интересует содержание SUBVI, то пороль «KISA_44».
Думаю, что самостоятельно разобраться в алгоритме, будет затруднительно.
За основу программы был взят модуль «Linear Fit Coefficients PtByPt.vi» из библиотеки LW.

Re: Поиск выбросов

Добавлено: 25 дек 2015, 13:37
Artem.spb
ок, спасибо.
воспользуюсь, если в процессе эксплуатации будут непонятки.