Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Определение фактов заправок по датчику уровня топлива
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
KillJoy
Есть сигнал с датчика уровня топлива в баке. Нужно определить все факты заправок. ( выделены зеленым на графике ). Я пробовал использовать метод скользящего среднего для сглаживания данных и интерполяцию кубическими сплайнами, но при этом пики (факты заправок) смещаются вправо. Задача в следующем - нужно игнорировать маленькие всплески (<30 литров) и при этом определять большие всплески (>30 литров).

mcheb
Вы же сами ответили на свой вопрос
Santik
Метод скользящего среднего - это КИХ фильтр. На малых порядках имеет отвратительную АЧХ. Большие порядки приводят к существенной временной задержке сигнала, или как говорит ТС "сдвигаются вправо". Эту задержку конечно можно скомпенсировать сдвинув после фильтрации картинку влево на число отсчётов, равное порядку фильтра.
Но более грамотно - использовать антикаузальные фильтры - ведь для этой задачи фильтрация в реальном времени не стоит.
Делается просто - берется вектор данных - фильтруется (любым фильтром) - выходной вектор реверсируется во времени (первая выборка становится последней и т.д.)- снова фильтруется тем же фильтром- и выходной вектор снова реверсируется. Таким образом временной сдвиг, создаваемый фильтром компенсируется, а АЧХ возводится в квадрат. Сплошные преимущества, короче. laughing.gif
Но определённые требования к фильтру всё же есть. Он должен иметь коэффициент передачи в полосе пропускания - как можно ближе к 1. (иначе 0.9*0.9=0.81 - АЧХ фильтра в полосе пропускания из-за возведения в квадрат может здорово испортится.
Наиболее подходящими фильтрами для антикаузальной фильтрации является фильтр Баттерворта и фильтр Чебышева 2-го рода.
Естественно, можно фильтровать и с помощью преобразования Фурье (это тоже антикаузальный фильтр получится).
Главное для данной задачи - правильно определить частоту среза ФНЧ , иначе ступеньки сигнала, соответствующие заправкам - будут сглаживаться.
Ну а далее надо продифференцировать отфильтрованные данные по времени.

Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
Serg76
Достаточно хорошо различные выбросы и всплески обрабатываются медианными фильтрами, надо просто подобрать нужную апертуру, кроме того, отсутствует задержка на выходе.
x736C
Нельзя ли тут обойтись без фильтра?
Что-то типа 30 < x(n) – x(n-1)


UPD: Хотя заправка с включенным регистратором растянется более, чем на один шаг.
MrYuran
Обычно наоборот, скачки вниз ловят sm.gif
Santik
Цитата(MrYuran @ Nov 18 2015, 12:17) *
Обычно наоборот, скачки вниз ловят sm.gif

Ну для этого отрицательные значения dV/dt просто надо умножить на 10 :-)
И вообще, если иметь профиль высот по трассе,то, вероятно, по изменению расхода топлива возможно определить где в какой момент машина находилась.
Хотя для этих целей проще наравне с датчиком уровня топлива записывать датчик уклона.
MSP430F
Судя по приведенному Вами графику, логика определения факта заправки совершенно прозрачна. Применение какого-либо сложного цифрового фильтра мне не кажется целесообразным. Логики if ((X[i] - X[i - 1]) > 30 ) вполне достаточно. Вот только мне непонятен выброс на Вашем рисунке левее первой заправки. Его надо отфильтровать. Надо бы разобраться с природой его возникновения. Что-то мне подсказывает, что он - это скорее помеха или какой-то глюк датчика уровня. Или, допустим, это резкое движение кузова вверх-вниз на лежачем полицейском или на яме на дороге. Тогда не проще ли делать измерения чаще, например раз в 10 секунд, а затем просто усреднить серию измерений за 1-5 минут. Тогда факт заправки можно будет определить с точность 1-5 минут. Вам же не нужна точность до 1 секунды ? wink.gif
При этом проверять скачок на 30 литров надо будет усредненные значения, не соседние, а отстоящие друг от друга на 1 период усреднения, чтобы избежать попадания на саму заправку.
KillJoy
Цитата(MSP430F @ Nov 18 2015, 20:02) *
Судя по приведенному Вами графику, логика определения факта заправки совершенно прозрачна. Применение какого-либо сложного цифрового фильтра мне не кажется целесообразным. Логики if ((X[i] - X[i - 1]) > 30 ) вполне достаточно. Вот только мне непонятен выброс на Вашем рисунке левее первой заправки. Его надо отфильтровать. Надо бы разобраться с природой его возникновения. Что-то мне подсказывает, что он - это скорее помеха или какой-то глюк датчика уровня. Или, допустим, это резкое движение кузова вверх-вниз на лежачем полицейском или на яме на дороге. Тогда не проще ли делать измерения чаще, например раз в 10 секунд, а затем просто усреднить серию измерений за 1-5 минут. Тогда факт заправки можно будет определить с точность 1-5 минут. Вам же не нужна точность до 1 секунды ? wink.gif
При этом проверять скачок на 30 литров надо будет усредненные значения, не соседние, а отстоящие друг от друга на 1 период усреднения, чтобы избежать попадания на саму заправку.

Данные с датчика снимаются раз в 5 минут. На приведенном выше графике данные за 5 суток. Вот еще пример данных за 1 сутки.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.