Есть массив значений, поступающих с какого-то источника. По сути это должна быть периодическая
функция, последовательность минимумов и максимумов с немного изменяющимися во времени частотой,
амплитудой.
Необходимо в реальном времени(допустимо с небольшим известным запаздыванием) определять моменты
возникновения min и max, расстояния м/д ними, амплитуду и т.п.
Проблема в том, что имееются сильный шум и помехи, которые не позволяют всё это просто определять.
Т.е. постоянно возникают локальные минимумы и максимумы. См. рис. 1.
Простыми фильтрами я это несколько сглаживаю, но этого недостаточно. Дальнейшее сглаживание приводит
к недопустимой потере информации. Всякие сложные фильтры, разложения и т.п. не подходят, поскольку
всё должно быть в реальном масштабе времени.
Что в этом случае можно сделать? Ведь совершенно очевидно( из рисунка ), что информация о наличии
мин. и мах. имеется и извлечь её возможно.
Спасибо!
Рис. 1:
Re: Поиск максимумов и минимумов функйии.
От:
Аноним
Дата:
21.06.05 21:01
Оценка:
Здравствуйте, DDzuba, Вы писали:
DD>Здравствуйте!
DD>Есть массив значений, поступающих с какого-то источника. По сути это должна быть периодическая DD>функция, последовательность минимумов и максимумов с немного изменяющимися во времени частотой, DD>амплитудой. DD>Необходимо в реальном времени(допустимо с небольшим известным запаздыванием) определять моменты DD>возникновения min и max, расстояния м/д ними, амплитуду и т.п.
DD>Проблема в том, что имееются сильный шум и помехи, которые не позволяют всё это просто определять. DD>Т.е. постоянно возникают локальные минимумы и максимумы. См. рис. 1. DD>Простыми фильтрами я это несколько сглаживаю, но этого недостаточно. Дальнейшее сглаживание приводит DD>к недопустимой потере информации. Всякие сложные фильтры, разложения и т.п. не подходят, поскольку DD>всё должно быть в реальном масштабе времени.
DD>Что в этом случае можно сделать? Ведь совершенно очевидно( из рисунка ), что информация о наличии DD>мин. и мах. имеется и извлечь её возможно.
DD>Спасибо!
DD>Рис. 1: DD>
Здравствуйте. Могу попробовать предлжить следующий алгоритм:
1. Построить нейронную сеть для обучения.
2. Подавать на вход зашумленные значения и идеальный вариант.
3. После обучения подавать на реальные значения, получая на выходе отфильтрованый вариант. дальше изучать саму кривую.
DDzuba wrote: > Здравствуйте! > > Есть массив значений, поступающих с какого-то источника. По сути это > должна быть периодическая > функция, последовательность минимумов и максимумов с немного > изменяющимися во времени частотой, > амплитудой. > Необходимо в реальном времени(допустимо с небольшим известным > запаздыванием) определять моменты > возникновения min и max, расстояния м/д ними, амплитуду и т.п. > > Проблема в том, что имееются сильный шум и помехи, которые не позволяют > всё это просто определять. > Т.е. постоянно возникают локальные минимумы и максимумы. См. рис. 1. > Простыми фильтрами я это несколько сглаживаю, но этого недостаточно. > Дальнейшее сглаживание приводит > к недопустимой потере информации. Всякие сложные фильтры, разложения и > т.п. не подходят, поскольку > всё должно быть в реальном масштабе времени. > > Что в этом случае можно сделать? Ведь совершенно очевидно( из рисунка ), > что информация о наличии > мин. и мах. имеется и извлечь её возможно. > > Спасибо!
Во-первых можно оценить период и выбирать лишь те экстремумы, которые не
превзойдены за четверть периода в обе стороны (параметры ведь меняются
немного). Можно также оценить амплитуду и делать так: набирать
максимумы/минимумы, пока разность между соседними не станет больше, чем
может быть из-за шума, а потом взять минимум/максимум из отобранного.
Правда, для этого надо, чтобы шум не создавал слишком много
максимумов/минимумов на участках перепадов (по рисунку это так).
Оценить период/амплитуду можно найдя все перепады начального отрезка, и
посмотрев на самые большие (сначала все перепады — большие; потом храним
максимум "маленьких" и минимум/максимум случавшихся "больших". При
перепаде, большем 3*максимум "больших" делаем max_small:=max_big;
min_big:=last; max_big:=last. Что делать с попадающими в зазор ближе к
маленьким — не знаю).
Здравствуйте, DDzuba, Вы писали:
DD>Здравствуйте!
DD>Есть массив значений, поступающих с какого-то источника. По сути это должна быть периодическая DD>функция, последовательность минимумов и максимумов с немного изменяющимися во времени частотой, DD>амплитудой. DD>Необходимо в реальном времени(допустимо с небольшим известным запаздыванием) определять моменты DD>возникновения min и max, расстояния м/д ними, амплитуду и т.п.
DD>Проблема в том, что имееются сильный шум и помехи, которые не позволяют всё это просто определять. DD>Т.е. постоянно возникают локальные минимумы и максимумы. См. рис. 1. DD>Простыми фильтрами я это несколько сглаживаю, но этого недостаточно. Дальнейшее сглаживание приводит DD>к недопустимой потере информации. Всякие сложные фильтры, разложения и т.п. не подходят, поскольку DD>всё должно быть в реальном масштабе времени.
DD>Что в этом случае можно сделать? Ведь совершенно очевидно( из рисунка ), что информация о наличии DD>мин. и мах. имеется и извлечь её возможно.
DD>Спасибо!
DD>Рис. 1: DD>
Можно попробовать промоделировать сигнал суммой 2-3 синусоид с постоянно меняющимися амплитудами и фазами. И фильтронуть это дело линиаризованным Калманом или чем по-круче.
Здравствуйте, DDzuba, Вы писали:
DD>Здравствуйте!
DD>Есть массив значений, поступающих с какого-то источника. По сути это должна быть периодическая DD>функция, последовательность минимумов и максимумов с немного изменяющимися во времени частотой, DD>амплитудой. DD>Необходимо в реальном времени(допустимо с небольшим известным запаздыванием) определять моменты DD>возникновения min и max, расстояния м/д ними, амплитуду и т.п.
DD>Проблема в том, что имееются сильный шум и помехи, которые не позволяют всё это просто определять. DD>Т.е. постоянно возникают локальные минимумы и максимумы. См. рис. 1. DD>Простыми фильтрами я это несколько сглаживаю, но этого недостаточно. Дальнейшее сглаживание приводит DD>к недопустимой потере информации. Всякие сложные фильтры, разложения и т.п. не подходят, поскольку DD>всё должно быть в реальном масштабе времени.
DD>Что в этом случае можно сделать? Ведь совершенно очевидно( из рисунка ), что информация о наличии DD>мин. и мах. имеется и извлечь её возможно.
DD>Спасибо!
DD>Рис. 1: DD>
Можно считать скользящую автокорреляцию, по ней определять текущий период и приближенно предсказывать следующий экстремум по предыдущему (или нескольким предыдущим), после чего уточнять его локально.
А локальное уточнение можно провести, построив, скажем, квадратичную аппроксимацию по методу наименьших квадратов вблизи экстремума и приняв экстремум параболы за истинный экстремум.
Здравствуйте, DDzuba, Вы писали:
DD>Здравствуйте!
DD>Есть массив значений, поступающих с какого-то источника. По сути это должна быть периодическая DD>функция, последовательность минимумов и максимумов с немного изменяющимися во времени частотой, DD>амплитудой. DD>Необходимо в реальном времени(допустимо с небольшим известным запаздыванием) определять моменты DD>возникновения min и max, расстояния м/д ними, амплитуду и т.п.
DD>Проблема в том, что имееются сильный шум и помехи, которые не позволяют всё это просто определять. DD>Т.е. постоянно возникают локальные минимумы и максимумы. См. рис. 1. DD>Простыми фильтрами я это несколько сглаживаю, но этого недостаточно. Дальнейшее сглаживание приводит DD>к недопустимой потере информации. Всякие сложные фильтры, разложения и т.п. не подходят, поскольку DD>всё должно быть в реальном масштабе времени.
DD>Что в этом случае можно сделать? Ведь совершенно очевидно( из рисунка ), что информация о наличии DD>мин. и мах. имеется и извлечь её возможно.
DD>Спасибо!
Самый простой вариант -- построить сглаженое среднее этой функции и искать min и max от среднего.
Они совпадут с глобальными min-max исходной функции
Формула такая:
f_{sglagen}(x) = int_{x-d}^{x+d} f(t) dt
ну а d выбрать сильно больше периода маленьких колебаний.
Здравствуйте, DDzuba, Вы писали:
DD>Здравствуйте!
DD>Есть массив значений, поступающих с какого-то источника. По сути это должна быть периодическая DD>функция, последовательность минимумов и максимумов с немного изменяющимися во времени частотой, DD>амплитудой. DD>Необходимо в реальном времени(допустимо с небольшим известным запаздыванием) определять моменты DD>возникновения min и max, расстояния м/д ними, амплитуду и т.п.
DD>Проблема в том, что имееются сильный шум и помехи, которые не позволяют всё это просто определять. DD>Т.е. постоянно возникают локальные минимумы и максимумы. См. рис. 1. DD>Простыми фильтрами я это несколько сглаживаю, но этого недостаточно. Дальнейшее сглаживание приводит DD>к недопустимой потере информации. Всякие сложные фильтры, разложения и т.п. не подходят, поскольку DD>всё должно быть в реальном масштабе времени.
DD>Что в этом случае можно сделать? Ведь совершенно очевидно( из рисунка ), что информация о наличии DD>мин. и мах. имеется и извлечь её возможно.
Я так понимаю, что нужно обрабатывать достаточно длительный сигнал. Могу посоветовать использовать эллиптический фильтр (фильтр Кауэра). Он имеет очень крутой спад АЧХ в полосе задерживания при малом порядке. Однако это фильтр с БИХ. Можешь построить его в Matlab в FDATool, а потом взять коэффициенты числителя и знаменателя и использовать их в своей программе.
Здравствуйте, lepsai, Вы писали:
L>А что за задача?
Едет по рельсам тележка. На ней передатчик и приёмник.
То, что отражается от земли, поступает ко мне на АЦП.
Те бугры, которые я считаю — шпалы. Но там ещё много чего
лишнего есть: щебёнка, железяки всякие, мусор.
Надо чётко определять шпалы.
Я делал так: линейный фильтр или несколько фильтров, затем интерполяция, затем определение пересечения функции первой производной с абсцис, но у меня функции были попроще (1-5 экстремумов)
RR>Самый простой вариант -- построить сглаженое среднее этой функции и искать min и max от среднего. RR>Они совпадут с глобальными min-max исходной функции
RR>Формула такая: RR>f_{sglagen}(x) = int_{x-d}^{x+d} f(t) dt
RR>ну а d выбрать сильно больше периода маленьких колебаний.
На рисунке приведена функция уже после такого сглаживания.
Это не убирает всех локальных максимумов. При увеличении степени
сглаживания теряется главный мыксимум.
Здравствуйте, DDzuba, Вы писали:
RR>>Самый простой вариант -- построить сглаженое среднее этой функции и искать min и max от среднего. RR>>Они совпадут с глобальными min-max исходной функции
RR>>Формула такая: RR>>f_{sglagen}(x) = int_{x-d}^{x+d} f(t) dt
RR>>ну а d выбрать сильно больше периода маленьких колебаний.
DD>На рисунке приведена функция уже после такого сглаживания. DD>Это не убирает всех локальных максимумов. При увеличении степени DD>сглаживания теряется главный мыксимум.
Ну хорошо, а если по рабоче-крестьянски?
Ищем все максимумы, затем отбрасываем те в r-окрестности которых есть другие лок. максимумы с большим значением.
Если рассточние между экстремумами примерно одно и то-же, то задача решена.
Если нет, тогда можно так:
Взяли локальный максимум, походили вперед-назад по параметру в поисках других лок. максимумов. Как только значение очередного лок. максимума уклонилось от исходного (уменьшилось) на определенную величину z, считаем, что максимум глобальный.
Если же и это не проходит (т.е. картинка может произольно сжиматся как по горизонтали, так и по вертикали), то необходим умный способ делать перемасштабирование параметра.