реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> нужен алгоритм нахождения максимума, простой с апроксимацией для МК!
Make_Pic
сообщение Jun 19 2005, 06:16
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 779
Регистрация: 9-10-04
Из: Россия, Пермь
Пользователь №: 828



Имеем 4 или 5 точек прендадлежащих функции, функция непрерывная, как малой "кровью" и быстро найти максимум (предпологаем, что он должен где то быть между точками)?

Прогу надо на микроконтроллер посадить.
Go to the top of the page
 
+Quote Post
arttab
сообщение Jun 19 2005, 14:28
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



если функция известна, то через производную можно найти максимумы. а иначе апроксимировать по известным значениям....
может, кто чтонибудь оригинальное предложит?


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Vic
сообщение Jun 19 2005, 16:55
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 241
Регистрация: 22-11-04
Из: Санкт-Петербург
Пользователь №: 1 192



Цитата(Make_Pic @ Jun 19 2005, 09:16)
Имеем 4 или 5 точек прендадлежащих функции, функция непрерывная, как малой "кровью" и быстро найти максимум (предпологаем, что он должен где то быть между точками)?

Прогу надо на микроконтроллер посадить.
*

Может вытолкнуть максимум "пузырьком" правда это не быстро зато надежно.

P.S. smile.gif Sorry, что то я стормозил с "пузырьком" вопрос неправильно понял sad.gif
Go to the top of the page
 
+Quote Post
Eugeno
сообщение Jun 20 2005, 07:20
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 19
Регистрация: 12-04-05
Из: Таганрог, Ростовской обл.
Пользователь №: 4 048



Цитата(arttab @ Jun 19 2005, 17:28)
если функция известна, то через производную можно найти максимумы. а иначе апроксимировать по известным значениям....
может, кто чтонибудь оригинальное предложит?
*

Оригинальней ничего не надо. Задача самодостаточна.

По четырём точкам можно найти однозначную апроксимацию участка кривой полиномом третьей степени x(t) = a*t*t*t + b*t*t + c*t*t + d*t + e;
Производную полинома приравниваем к нулю и вуаля - результат.

Полином третьей степени имеет хорошую устойчивость в силу своей простоты, а решение по четырём точкам однозначно - это тоже больщое преимущество.
Go to the top of the page
 
+Quote Post
mikola1
сообщение Jun 21 2005, 06:31
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 25-03-05
Из: Минск
Пользователь №: 3 693



Цитата(Make_Pic @ Jun 19 2005, 09:16)
Имеем 4 или 5 точек прендадлежащих функции, функция непрерывная, как малой "кровью" и быстро найти максимум (предпологаем, что он должен где то быть между точками)?

Прогу надо на микроконтроллер посадить.
*


Не согласен с Eugeno . Задача не является самодостаточной. У Eugeno . ошибка, лишний коэффициент при квадрате аргумента. wink.gif

1. Постановка задачи звучит некорректно. Фактически задача должна быть
разбита на две подзадачи
а) интерполяция функции
б) поиск максимума для интерполированной функции

2.1 Совсем малая кровь. Рассматривать линейную аппроксимацию, тогда максимум совпадет с одной из точек. smile.gif

2.2 Использовать интерпляционный полином Лежандра. Как раз то, что хотел предложить Eugeno

Pn(x)=f(x0)*{(x-x1)*(x-x2)*...*(x-xn) / {(x0-x1)*(x0-x2)*..*(x0-xn)}}+
+f(x1)*{(x-x0)*(x-x2)*...*(x-xn) / {(x1-x0)*(x1-x2)*..*(x1-xn)}}+...+
+f(xn)*{(x-x0)*(x-x1)*...*(x-xn_1) / {(xn-x0)*(xn-x1)*..*(x1-xn_1)}}

где (n+1) - кол-во точек,
В этом случае утверждается
f_апп ~= Pn(x)

Для поиска максимума берется аналитически производная (для ленивых - Maple), приравнивается к нулю. Получаете (n-1) корней, т.е. получаете точки экстремумов. Подставляете их поочередно в Pn(x) и выбираете максимум; или ищете вторую производную, находите те точки, для которых она < 0 - для этих точек будет локальный максимум

2.3 Использовать кубическую интерполяцию, минимальное количество точек - 4. Кубическая интерполяция дает построение функции непрерывной саму функцию, первую и вторую производную. Алгоритм несложный и с ним можно разобраться. Зато он лишен недастатков полиномной аппроксимации.
Поиск максимума - такой же как и для случая 2.1 smile.gif

2.4 Полиномы Чебышева.

2.5 Среднеквадратичное приближение, но тогда функция не проходит через точки и нужно априорно записать предполагаемую зависимость функции
Go to the top of the page
 
+Quote Post
Fast
сообщение Jun 21 2005, 07:56
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 216
Регистрация: 31-03-05
Из: Зеленоград
Пользователь №: 3 839



Цитата(Eugeno @ Jun 20 2005, 10:20)
По четырём точкам... полиномом третьей степени x(t) = a*t*t*t + b*t*t + c*t*t + d*t + e... Производную полинома приравниваем к нулю и вуаля - результат.
Полином к нулю приравнять, конечно, хорошо, только как решать на МК это дело?
Предлагаю итеративный вариант на базе интерполятора степени N (пусть N=4), например Лагранжа.
вначале находим максимальный отсчет в регистре, затем

1. выбираем второй "опорный" справа или слева от максимума (который больше). Точный максимум будет расположен в интервале между двумя этими отсчетами.
2. Делим интервал пополам, вычисляем посредством интерполяции значение функции в данной точке.
3. Измеряем дельту, как разность максимума и вычисл. значения
4. Если дельта со знаком " - ", то значение функции в точке больше, чем максимум, тогда [максимум = значение функции в точке]
5. Устанавливаем новые границы интервала, соотв. одна - максимуму, вторая - "опорному" отсчету.
6. Если [дельта < ПОРОГ] - или [итерация < ITERmax] - выход, иначе идти к 1.

Не очень просто, но работает, причем хорошо.
проблема насущная, сам бы хотел услышать мнение сторонних разработчиков
Go to the top of the page
 
+Quote Post
Alexandr
сообщение Jun 21 2005, 08:49
Сообщение #7


Знающий
****

Группа: Модераторы
Сообщений: 804
Регистрация: 1-12-04
Пользователь №: 1 283



Цитата(Fast @ Jun 21 2005, 11:56)
 
1. выбираем второй "опорный" справа или слева от максимума (который больше). Точный максимум будет расположен в интервале между двумя этими отсчетами.


Так мы найдем локальный максимум и можем пролететь мимо глобального. Как это не прискорбно, но боюсь придется сражаться с производной и экстремумами.
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Иван Сусанин - первый полупроводник
Go to the top of the page
 
+Quote Post
Fast
сообщение Jun 21 2005, 09:25
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 216
Регистрация: 31-03-05
Из: Зеленоград
Пользователь №: 3 839



[quote=Alexandr,Jun 21 2005, 11:49]
Производная и экстремумы, боюсь, тоже ничего не дадут. Не факт, что аналитически мы получим истинные значения точного максимума и другие экстремумы для функции на рисунке.

Это случай, когда полоса сигнала зарезана. Т.е. частота выборок меньше, чем удвоенная макс. частота спектра сигнала (при разложении функции в ряд Фурье).
Да, такая штука будет имеет место.
Обходится увеличением частоты выборок, чтобы эта частота была больше 4х на макс. частоту спектра сигнала + ФНЧ по полосе сигнала.
Если такое условие трудно достижимо (при 2.5-3 :1, вместо 4:1), то можно попробовать различные виды сплайна в качестве интерполятора, но ФНЧ обязательно.

Про изначальные условия ничего не сказано, и о применении в конкретной области можно только догадываться.
Go to the top of the page
 
+Quote Post
Make_Pic
сообщение Jun 21 2005, 16:08
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 779
Регистрация: 9-10-04
Из: Россия, Пермь
Пользователь №: 828



[quote=Fast,Jun 21 2005, 12:25]
[quote=Alexandr,Jun 21 2005, 11:49]
Производная и экстремумы, боюсь, тоже ничего не дадут. Не факт, что аналитически мы получим истинные значения точного максимума и другие экстремумы для функции на рисунке.

Это случай, когда полоса сигнала зарезана. Т.е. частота выборок меньше, чем удвоенная макс. частота спектра сигнала (при разложении функции в ряд Фурье).
Да, такая штука будет имеет место.
Обходится увеличением частоты выборок, чтобы эта частота была больше 4х на макс. частоту спектра сигнала + ФНЧ по полосе сигнала.
Если такое условие трудно достижимо (при 2.5-3 :1, вместо 4:1), то можно попробовать различные виды сплайна в качестве интерполятора, но ФНЧ обязательно.

Про изначальные условия ничего не сказано, и о применении в конкретной области можно только догадываться.
*

[/quote]

На входе устройства две частоты речевого диапозона 300- 2000Гц. Точные частоты неизвестны но разнесены на 200 Гц. После АЦП (10 бит) и обработки 256-точечного FFT (для большего количества точек нет не RAM, не ресурсов). Получаем спектральное распределение после FFT. Берем несколько точек выше определеного уровня и далее
ищем экстремум для определения частоты с более высокой точностью чем 4000/256 Гц.

Может быть иначе, но как не придумал.
Go to the top of the page
 
+Quote Post
Fast
сообщение Jun 22 2005, 04:24
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 216
Регистрация: 31-03-05
Из: Зеленоград
Пользователь №: 3 839



Цитата(Make_Pic @ Jun 21 2005, 19:08)
На входе устройства две частоты речевого диапозона 300- 2000Гц. Точные частоты неизвестны но разнесены на 200 Гц. После АЦП (10 бит) и обработки 256-точечного FFT...
Подход, с моей точки зрения, верный. Воспользуйтесь алгоритмом, предложенным мной выше. Фильтр ФНЧ не нужен. Если найду свою фунцию N-летней давности - сброшу.
Go to the top of the page
 
+Quote Post
Make_Pic
сообщение Jun 22 2005, 04:33
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 779
Регистрация: 9-10-04
Из: Россия, Пермь
Пользователь №: 828



Цитата(Fast @ Jun 22 2005, 07:24)
Цитата(Make_Pic @ Jun 21 2005, 19:08)
На входе устройства две частоты речевого диапозона 300- 2000Гц. Точные частоты неизвестны но разнесены на 200 Гц. После АЦП (10 бит) и обработки 256-точечного FFT...
Подход, с моей точки зрения, верный. Воспользуйтесь алгоритмом, предложенным мной выше. Фильтр ФНЧ не нужен. Если найду свою фунцию N-летней давности - сброшу.
*



Найдите pls! А то совсем я закопался wink.gif
Go to the top of the page
 
+Quote Post
Make_Pic
сообщение Jun 23 2005, 04:41
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 779
Регистрация: 9-10-04
Из: Россия, Пермь
Пользователь №: 828



Цитата(Fast @ Jun 21 2005, 10:56)
1. выбираем второй "опорный" справа или слева от максимума (который больше). Точный максимум будет расположен в интервале между двумя этими отсчетами.
2. Делим интервал пополам, вычисляем посредством интерполяции значение функции в данной точке.
3. Измеряем дельту, как разность максимума и вычисл. значения
4. Если дельта со знаком " - ", то значение функции в точке больше, чем максимум, тогда [максимум = значение функции в точке]
5. Устанавливаем новые границы интервала, соотв. одна - максимуму, вторая - "опорному" отсчету.
6. Если [дельта < ПОРОГ] - или [итерация < ITERmax] - выход, иначе идти к 1.

Не очень просто, но работает, причем хорошо.
проблема насущная, сам бы хотел услышать мнение сторонних разработчиков

*



Можно подробнее по п.2 - Как интерполировать (функция неизвестна, можно предположить, что она sinc)? Желательно расписать для меня чайника!
Go to the top of the page
 
+Quote Post
mikola1
сообщение Jun 23 2005, 22:32
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 25-03-05
Из: Минск
Пользователь №: 3 693



Цитата(Make_Pic @ Jun 23 2005, 07:41)
Можно подробнее по п.2 - Как интерполировать (функция неизвестна, можно предположить, что она sinc)? Желательно расписать для меня чайника!
*


To Make_Pic,
Интерполировать функцию нужно исходя из физического смысла сигнала, который мы снимаем. Иначе смысл и ценность от этой интерполяции??? Т.к. насколько я понял сигнал речевой, то нужно примерно представлять, какому закону распределяется его спектральная плотность. А этого я не знаю sad.gif (здесь я не силен, но смею предположить, нечто подобное на распределение Гаусса с нарушением симметрии).

To Fast, интерполирование по двум точкам – крайне не благодарная задача. См. рисунок от Alexander, оставив только две точки sad.gif

А для чайников smile.gif исходя из предложенного Fast с использованием интерполяционного полинома Лагранжа второй степени следующий алгоритм без всяких циклов.
п.1 Выбираем максимум функции (x1,y1) и берем две соседние точки (x0,y0) и (x1,y2), так чтобы выполнялись условия x0<x1<x2, и y1>=y0, и y1>=y2.
п.2 Находим точку экстремума (формула 3)
п.3 Подставляем найденное значение в полином (формула 1)
п.4 Полученное значение и есть максимум.

P.S. Можно уменьшить объем вычислений, введя промежуточные переменные типа dx01=x0-x1 для формул 1 и 2. На рис. представлены формулы, записанные в Maple.

Сообщение отредактировал mikola1 - Jun 24 2005, 21:45
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Make_Pic
сообщение Jun 24 2005, 04:09
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 779
Регистрация: 9-10-04
Из: Россия, Пермь
Пользователь №: 828



Цитата(mikola1 @ Jun 24 2005, 01:32)
Цитата(Make_Pic @ Jun 23 2005, 07:41)

Можно подробнее по п.2 - Как интерполировать (функция неизвестна, можно предположить, что она sinc)? Желательно расписать для меня чайника!
*

To Make_Pic,
Интерполировать функцию нужно исходя из физического смысла сигнала, который мы снимаем. Иначе смысл и ценность от этой интерполяции??? Т.к. насколько я понял сигнал речевой, то нужно примерно представлять, какому закону распределяется его спектральная плотность. А этого я не знаю sad.gif (здесь я не силен, но смею предположить, нечто подобное на распределение Гаусса с нарушением симметрии).
*


Я вроде выше писал, что сигнал - синус/частота, посему симетричный гаусс, дык как интерполировать - КТО-НИБУДЬ ПОДСКАЖЕТ???
Go to the top of the page
 
+Quote Post
Make_Pic
сообщение Jun 24 2005, 04:20
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 779
Регистрация: 9-10-04
Из: Россия, Пермь
Пользователь №: 828



Кстати на телесистемах некий alostap предложил оригинальный метод, ссылаясь на статью Прикрепленный файл  01214824.rar ( 269 килобайт ) Кол-во скачиваний: 223


>Есть гармонический сигнал, есть его DFT:
>X(i)=sum(x(k)exp(-1j*2*pi*k*i/N)
>, требуется измерить как можно точнее частоту сигнала.
>Алгоритм примерно таков:
>1) Находите два соседних отчета для которых abs(X(i))+abs(X(i+1))>максимальна.
>2) Отклонение от сетки частот DFT будет =
>abs(X(i+1))/(abs(X(i))+abs(X(i+1)))/N, значение частоты относительное,
>X(i)- максимальный отсчет
>
>IEEE trans. on comm No 7 2003
>
Опять же про интерполяцию функции - как ее реализовать -
НО неясен п.2
Можно поподробнее как здесь связать известные точки DFT и искомую?
Вроде из этой формулы нельзя, а точнее я не понял алгоритм.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th July 2025 - 06:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.0153 секунд с 7
ELECTRONIX ©2004-2016