|
нужен алгоритм нахождения максимума, простой с апроксимацией для МК! |
|
|
|
Jun 19 2005, 16:55
|
Местный
  
Группа: Свой
Сообщений: 241
Регистрация: 22-11-04
Из: Санкт-Петербург
Пользователь №: 1 192

|
Цитата(Make_Pic @ Jun 19 2005, 09:16) Имеем 4 или 5 точек прендадлежащих функции, функция непрерывная, как малой "кровью" и быстро найти максимум (предпологаем, что он должен где то быть между точками)? Прогу надо на микроконтроллер посадить. Может вытолкнуть максимум "пузырьком" правда это не быстро зато надежно. P.S.  Sorry, что то я стормозил с "пузырьком" вопрос неправильно понял
|
|
|
|
|
Jun 20 2005, 07:20
|
Участник

Группа: Свой
Сообщений: 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; Производную полинома приравниваем к нулю и вуаля - результат. Полином третьей степени имеет хорошую устойчивость в силу своей простоты, а решение по четырём точкам однозначно - это тоже больщое преимущество.
|
|
|
|
|
Jun 21 2005, 06:31
|
Частый гость
 
Группа: Свой
Сообщений: 78
Регистрация: 25-03-05
Из: Минск
Пользователь №: 3 693

|
Цитата(Make_Pic @ Jun 19 2005, 09:16) Имеем 4 или 5 точек прендадлежащих функции, функция непрерывная, как малой "кровью" и быстро найти максимум (предпологаем, что он должен где то быть между точками)? Прогу надо на микроконтроллер посадить. Не согласен с Eugeno . Задача не является самодостаточной. У Eugeno . ошибка, лишний коэффициент при квадрате аргумента.  1. Постановка задачи звучит некорректно. Фактически задача должна быть разбита на две подзадачи а) интерполяция функции б) поиск максимума для интерполированной функции 2.1 Совсем малая кровь. Рассматривать линейную аппроксимацию, тогда максимум совпадет с одной из точек.  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  2.4 Полиномы Чебышева. 2.5 Среднеквадратичное приближение, но тогда функция не проходит через точки и нужно априорно записать предполагаемую зависимость функции
|
|
|
|
|
Jun 21 2005, 07:56
|
Местный
  
Группа: Свой
Сообщений: 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. Не очень просто, но работает, причем хорошо. проблема насущная, сам бы хотел услышать мнение сторонних разработчиков
|
|
|
|
|
Jun 21 2005, 08:49
|

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

|
Цитата(Fast @ Jun 21 2005, 11:56) 1. выбираем второй "опорный" справа или слева от максимума (который больше). Точный максимум будет расположен в интервале между двумя этими отсчетами. Так мы найдем локальный максимум и можем пролететь мимо глобального. Как это не прискорбно, но боюсь придется сражаться с производной и экстремумами.
Эскизы прикрепленных изображений
--------------------
Иван Сусанин - первый полупроводник
|
|
|
|
|
Jun 21 2005, 09:25
|
Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 31-03-05
Из: Зеленоград
Пользователь №: 3 839

|
[quote=Alexandr,Jun 21 2005, 11:49] Производная и экстремумы, боюсь, тоже ничего не дадут. Не факт, что аналитически мы получим истинные значения точного максимума и другие экстремумы для функции на рисунке.
Это случай, когда полоса сигнала зарезана. Т.е. частота выборок меньше, чем удвоенная макс. частота спектра сигнала (при разложении функции в ряд Фурье). Да, такая штука будет имеет место. Обходится увеличением частоты выборок, чтобы эта частота была больше 4х на макс. частоту спектра сигнала + ФНЧ по полосе сигнала. Если такое условие трудно достижимо (при 2.5-3 :1, вместо 4:1), то можно попробовать различные виды сплайна в качестве интерполятора, но ФНЧ обязательно.
Про изначальные условия ничего не сказано, и о применении в конкретной области можно только догадываться.
|
|
|
|
|
Jun 21 2005, 16:08
|

Знающий
   
Группа: Свой
Сообщений: 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 Гц. Может быть иначе, но как не придумал.
|
|
|
|
|
Jun 22 2005, 04:24
|
Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 31-03-05
Из: Зеленоград
Пользователь №: 3 839

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

Знающий
   
Группа: Свой
Сообщений: 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! А то совсем я закопался
|
|
|
|
|
Jun 23 2005, 04:41
|

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

|
Цитата(Fast @ Jun 21 2005, 10:56) 1. выбираем второй "опорный" справа или слева от максимума (который больше). Точный максимум будет расположен в интервале между двумя этими отсчетами. 2. Делим интервал пополам, вычисляем посредством интерполяции значение функции в данной точке. 3. Измеряем дельту, как разность максимума и вычисл. значения 4. Если дельта со знаком " - ", то значение функции в точке больше, чем максимум, тогда [максимум = значение функции в точке] 5. Устанавливаем новые границы интервала, соотв. одна - максимуму, вторая - "опорному" отсчету. 6. Если [дельта < ПОРОГ] - или [итерация < ITERmax] - выход, иначе идти к 1. Не очень просто, но работает, причем хорошо. проблема насущная, сам бы хотел услышать мнение сторонних разработчиков Можно подробнее по п.2 - Как интерполировать (функция неизвестна, можно предположить, что она sinc)? Желательно расписать для меня чайника!
|
|
|
|
|
Jun 23 2005, 22:32
|
Частый гость
 
Группа: Свой
Сообщений: 78
Регистрация: 25-03-05
Из: Минск
Пользователь №: 3 693

|
Цитата(Make_Pic @ Jun 23 2005, 07:41) Можно подробнее по п.2 - Как интерполировать (функция неизвестна, можно предположить, что она sinc)? Желательно расписать для меня чайника! To Make_Pic, Интерполировать функцию нужно исходя из физического смысла сигнала, который мы снимаем. Иначе смысл и ценность от этой интерполяции??? Т.к. насколько я понял сигнал речевой, то нужно примерно представлять, какому закону распределяется его спектральная плотность. А этого я не знаю  (здесь я не силен, но смею предположить, нечто подобное на распределение Гаусса с нарушением симметрии). To Fast, интерполирование по двум точкам – крайне не благодарная задача. См. рисунок от Alexander, оставив только две точки  А для чайников  исходя из предложенного 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
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 24 2005, 04:09
|

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

|
Цитата(mikola1 @ Jun 24 2005, 01:32) Цитата(Make_Pic @ Jun 23 2005, 07:41) Можно подробнее по п.2 - Как интерполировать (функция неизвестна, можно предположить, что она sinc)? Желательно расписать для меня чайника! To Make_Pic, Интерполировать функцию нужно исходя из физического смысла сигнала, который мы снимаем. Иначе смысл и ценность от этой интерполяции??? Т.к. насколько я понял сигнал речевой, то нужно примерно представлять, какому закону распределяется его спектральная плотность. А этого я не знаю  (здесь я не силен, но смею предположить, нечто подобное на распределение Гаусса с нарушением симметрии). Я вроде выше писал, что сигнал - синус/частота, посему симетричный гаусс, дык как интерполировать - КТО-НИБУДЬ ПОДСКАЖЕТ???
|
|
|
|
|
Jun 24 2005, 04:20
|

Знающий
   
Группа: Свой
Сообщений: 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 и искомую? Вроде из этой формулы нельзя, а точнее я не понял алгоритм.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|