|
|
  |
Алгоритм поиска основной частоты, Метод максимального правдоподобия |
|
|
|
Jul 5 2011, 20:17
|
Частый гость
 
Группа: Участник
Сообщений: 161
Регистрация: 22-06-09
Из: Москва
Пользователь №: 50 531

|
Цитата(QuickNick @ Jul 4 2011, 16:30)  А на ПК какой библиотекой для записи звуков нужно пользоваться? Хотелось бы приложение сделать, в котором рисовались бы промежуточные данные обработки сигнала. То есть, к компу подключается микрофон, и в реальном времени рисуются графики, спектры и т.д. Пробовал только на билдере и давно, для него: http://edn.embarcadero.com/article/28332. (!На сррbuilder.ru не заходите - это чистый вирус!, сворует все, можете врагу подсунуть) Разные методы это чтобы уменьшить выборку и работать в реальном времени. Если между частотами меньше 5 бин все равно плохо получается. А максимального правдоподобия - это так: Находите Вашим методом 3 частоты-амплитуды-фазы, всего 9 параметров и делаете оптимизацию по минимуму среднеквадратичного отклонения от исходной выборки. Результат превосходный, но слишком долго.
--------------------
Ты можешь знать все что угодно, но пока ты не доказал это на практике, ты не знаешь ничего!© Ричард Бах
|
|
|
|
|
Jul 6 2011, 06:37
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 1-07-11
Пользователь №: 66 006

|
Цитата(SPACUM @ Jul 5 2011, 23:17)  Пробовал только на билдере и давно, для него: http://edn.embarcadero.com/article/28332. (!На сррbuilder.ru не заходите - это чистый вирус!, сворует все, можете врагу подсунуть) Не, мне для Java нужно. Но всё равно спасибо - когда-нибудь и C++ займусь. Цитата(SPACUM @ Jul 5 2011, 23:17)  Разные методы это чтобы уменьшить выборку и работать в реальном времени. Если между частотами меньше 5 бин все равно плохо получается. А максимального правдоподобия - это так: Находите Вашим методом 3 частоты-амплитуды-фазы, всего 9 параметров и делаете оптимизацию по минимуму среднеквадратичного отклонения от исходной выборки. Результат превосходный, но слишком долго. Бин - это что такое? И какой тогда у меня метод получается?
Сообщение отредактировал QuickNick - Jul 6 2011, 06:38
|
|
|
|
|
Jul 6 2011, 11:45
|
Частый гость
 
Группа: Участник
Сообщений: 161
Регистрация: 22-06-09
Из: Москва
Пользователь №: 50 531

|
Цитата(QuickNick @ Jul 6 2011, 10:37)  Бин - это что такое? Bin - расстояние между двумя ближайшими гармониками Фурье(1 / длина выборки). А метод слишком грубый. Например берем выборку длиной 1с. При этом 1бин = 1Гц. Подаем смесь трех кратных частот: 10.5бин - 2.0В, 21бин - 3В и 31.5бин .5В. Получаем три максимальных гармоники 10бин - 1.41В, 11бин - 1.41В и 21бин - 3В, а 31.5бин в расчетах уже не участвует. И ничего кратного!
Сообщение отредактировал SPACUM - Jul 6 2011, 12:21
--------------------
Ты можешь знать все что угодно, но пока ты не доказал это на практике, ты не знаешь ничего!© Ричард Бах
|
|
|
|
|
Jul 6 2011, 13:58
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 1-07-11
Пользователь №: 66 006

|
Цитата(SPACUM @ Jul 6 2011, 14:45)  Bin - расстояние между двумя ближайшими гармониками Фурье(1 / длина выборки). А метод слишком грубый. Например берем выборку длиной 1с. При этом 1бин = 1Гц. Подаем смесь трех кратных частот: 10.5бин - 2.0В, 21бин - 3В и 31.5бин .5В. Получаем три максимальных гармоники 10бин - 1.41В, 11бин - 1.41В и 21бин - 3В, а 31.5бин в расчетах уже не участвует. И ничего кратного! А. Понял. Об этом я не писал, но после нахождения пиков мы уточняем частоту: Код protected final double accuracyFreq(int index) { double res; if (volume[index + 1] > volume[index - 1]) { res = (index * volume[index] + (index + 1) * volume[index + 1]) / (volume[index + 1] + volume[index]); } else { res = (index * volume[index] + (index - 1) * volume[index - 1]) / (volume[index - 1] + volume[index]); } return res * sampleRate / signalLength; } Насколько я помню университетскую программу, предыдущий программист здесь применил интерполирование.
Сообщение отредактировал QuickNick - Jul 6 2011, 14:00
|
|
|
|
|
Jul 6 2011, 16:04
|
Частый гость
 
Группа: Участник
Сообщений: 161
Регистрация: 22-06-09
Из: Москва
Пользователь №: 50 531

|
Цитата(QuickNick @ Jul 6 2011, 17:58)  А. Понял. Об этом я не писал, но после нахождения пиков мы уточняем частоту: Код protected final double accuracyFreq(int index) { double res; if (volume[index + 1] > volume[index - 1]) { res = (index * volume[index] + (index + 1) * volume[index + 1]) / (volume[index + 1] + volume[index]); } else { res = (index * volume[index] + (index - 1) * volume[index - 1]) / (volume[index - 1] + volume[index]); } return res * sampleRate / signalLength; } Насколько я помню университетскую программу, предыдущий программист здесь применил интерполирование. Это не интерполяция, а одна из грубых формул Куцукоса. Мой пример, должно получиться ~10.5бин. res =(10 * 1.41 + 11 * 1.41) / (1.41 + 1.41) = 10.5бин На самом деле если частота точно посередине между бинами значения справа и слева немного отличаются. Если плавно менять частоту в этой точке будет ступенька, но для Вашего случая точность достаточная, более точные методы значительно сложнее.
Сообщение отредактировал SPACUM - Jul 6 2011, 16:23
--------------------
Ты можешь знать все что угодно, но пока ты не доказал это на практике, ты не знаешь ничего!© Ричард Бах
|
|
|
|
|
Jul 8 2011, 08:59
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 1-07-11
Пользователь №: 66 006

|
Цитата(SPACUM @ Jul 5 2011, 23:17)  А максимального правдоподобия - это так: Находите Вашим методом 3 частоты-амплитуды-фазы, всего 9 параметров и делаете оптимизацию по минимуму среднеквадратичного отклонения от исходной выборки. Результат превосходный, но слишком долго. 1)Есть у вас пример на руках? 2)Хотелось бы сделать в текущем алгоритме оптимизацию по фильтрации (подавать на вход предполагаемый диапазон частот). Но из нашего алгоритма (как он называется, кстати? Метод обертонов?) получается, что если мы в фильтр подадим правую границу диапазона, то будут сильно глушится 2-я, 3-я и далее гармоники. Поэтому сейчас приходится идти на ухищрения: подавать утроенную правую границу диапазона. Есть ли алгоритм, который бы позволил избежать таких ухищрений? Конкретно, можно ли алгоритм максимального правдоподобия без таких вывертов писать?
|
|
|
|
|
Jul 8 2011, 21:15
|
Частый гость
 
Группа: Участник
Сообщений: 161
Регистрация: 22-06-09
Из: Москва
Пользователь №: 50 531

|
Цитата(QuickNick @ Jul 8 2011, 12:59)  1)Есть у вас пример на руках? 2)Хотелось бы сделать в текущем алгоритме оптимизацию по фильтрации (подавать на вход предполагаемый диапазон частот). Но из нашего алгоритма (как он называется, кстати? Метод обертонов?) получается, что если мы в фильтр подадим правую границу диапазона, то будут сильно глушится 2-я, 3-я и далее гармоники. Поэтому сейчас приходится идти на ухищрения: подавать утроенную правую границу диапазона. Есть ли алгоритм, который бы позволил избежать таких ухищрений? Конкретно, можно ли алгоритм максимального правдоподобия без таких вывертов писать? 1. Я программирую для архитектуры АРМ, сейчас для Кортекса. Если есть исходник, то он либо применен в оригинальном приборе, либо это задел. В обоих случаях раздавать глупо. Два алгоритма описал достаточно, можно сразу программировать. В случае оптимизации: амплитуды надо нормировать к найденным значениям, смещение фазы от найденной к ПИ, смещение частоты от найденной к 1 бин. Можно применить покоординатный спуск или градиентный по каждой триаде. Пробовал. Очень долго. Не рекомендую. Просто обьяснил смысл термина. 2. А если нужен железный пример на руках, приезжайте на следующую конференцию NXP в Москве, на две прибор притаскивал и на следующую притащу. Там есть поиск четырех реальных частот в шумах, разумеется не методом оптимизации. Интерес низкий. 3. Если Вы применяете метод Куцукоса, никаких окон делать нельзя, с окнами метод показывает значения точно посередине между ближайшими двумя гармониками Фурье и ничего не уточняет. А вообще выше 7-й гармоники Фурье и при малых шумах Куцукос весьма точен. 4. Не понимаю зачем фильтрация? Спектр получен и Вы можете в нем выбрать интересующий Вас участок. Вот аналоговый фильтр перед АЦП надежно не пропускающий частоты выше или равные половине частоты дискретизации обязательно должен быть. Например если частота дискретизации 8кГц, то фильтр должен быть с частотой среза 3.5 кГц чтобы частоты 4кГц и выше были полностью зарезаны, иначе все недорезанные частоты выше 4кГц будут присутствовать в диапазоне рабочих частот и никакой программой их оттуда не убрать. 5. Поиском "fundamental frequency" не занимаюсь, речь шла только об определении реальных гармоник вместо гармоник Фурье.
--------------------
Ты можешь знать все что угодно, но пока ты не доказал это на практике, ты не знаешь ничего!© Ричард Бах
|
|
|
|
|
Jul 14 2011, 07:03
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 1-07-11
Пользователь №: 66 006

|
Цитата(SPACUM @ Jul 6 2011, 19:04)  res =(10 * 1.41 + 11 * 1.41) / (1.41 + 1.41) = 10.5бин На самом деле если частота точно посередине между бинами значения справа и слева немного отличаются. Если плавно менять частоту в этой точке будет ступенька, но для Вашего случая точность достаточная, более точные методы значительно сложнее. Вот и нарвались на ступеньку  Так что теперь нужны более точные методы. С одной стороны, ясно, что это будет задача интерполяции, но, с другой стороны, смущает неинъективность отображения в районе пика. Какой математический инструмент на вооружение взять? ----Update---- Появилась следующая идея: построить интерполяционный многочлен по 3 точкам (freq[index-1], freq[index], freq[index+1]) и пробежаться с шагом 0.1 по нему. Найти максимум, запомнить значение.
Сообщение отредактировал QuickNick - Jul 14 2011, 07:26
|
|
|
|
|
Jul 14 2011, 10:25
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата QuickNick: Вот и нарвались на ступеньку sad.gif Так что теперь нужны более точные методы.
С одной стороны, ясно, что это будет задача интерполяции, но, с другой стороны, смущает неинъективность отображения в районе пика. Какой математический инструмент на вооружение взять? Явление гиббса еще никто не отменял. Методы борьбы с ним широко известны. Возьмите окно кайзера с параметром ~30. Будет Вам равенство значений соседних точек, если частота попадает точно в середину между бинами.
|
|
|
|
|
Jul 14 2011, 10:32
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 1-07-11
Пользователь №: 66 006

|
Цитата(thermit @ Jul 14 2011, 13:25)  Явление гиббса еще никто не отменял. Методы борьбы с ним широко известны. Возьмите окно кайзера с параметром ~30. Будет Вам равенство значений соседних точек, если частота попадает точно в середину между бинами. Уже расправился - пока использую интерполяцию Ньютона по 5 точкам, затем с шагом по 0.1 Гц прохожу по интервалу (он получается длиной примерно 3.9 Гц), нахожу максимум. Возможно, есть какой-то хитрый способ интерполяции наоборот, когда отображение не инъективно, но за полдня найти его не успел.
|
|
|
|
|
Jul 14 2011, 17:10
|
Частый гость
 
Группа: Участник
Сообщений: 161
Регистрация: 22-06-09
Из: Москва
Пользователь №: 50 531

|
Цитата(QuickNick @ Jul 14 2011, 11:03)  Появилась следующая идея: построить интерполяционный многочлен по 3 точкам (freq[index-1], freq[index], freq[index+1]) и пробежаться с шагом 0.1 по нему. Найти максимум, запомнить значение. 1.Если 3 точки, то есть формула, еще в школе изучали. Если не помните - могу напомнить. 2.У меня по трем точкам получалось лучше с окном Гаусса и если частоты раздвинуты больше, чем на 5 бин. 3.Либо без окна и Куцукос, либо с окном и интерполяция. 4.Явление Гиббса никакого отношения к Вашим проблемам не имеет. 5.Пора уже написать проверочную программу и сравнивать точности. Примерно так: Задать три случайные частоты->если какая-нибудь меньше 7бин или больше 80% рабочего диапазона или разность каких-нибудь частот менее 5бин то переделать-> добавить немного шума->определить 3 частоты любым Вашим методом и определить максимальную погрешность определения частот. Другим способом проверить метод невозможно. 6.Если ограничения не устраивают, то следует ввести расчет процента сбоев. Лучше сначала определить точность с этими ограничениями.
--------------------
Ты можешь знать все что угодно, но пока ты не доказал это на практике, ты не знаешь ничего!© Ричард Бах
|
|
|
|
|
Jul 14 2011, 18:30
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата SPACUM: 4.Явление Гиббса никакого отношения к Вашим проблемам не имеет. Цитата На самом деле если частота точно посередине между бинами значения справа и слева немного отличаются. Это и есть явление гиббса.
|
|
|
|
|
Jul 14 2011, 19:57
|
Частый гость
 
Группа: Участник
Сообщений: 161
Регистрация: 22-06-09
Из: Москва
Пользователь №: 50 531

|
Цитата(thermit @ Jul 14 2011, 22:30)  Это и есть явление гиббса. Возьмите окно кайзера с параметром ~30. Небольшой разрыв в графике определенной частоты от исходной при использовании формулы Куцукоса. Если применить любое окно, то погрешность равна 1/2бин вместо долей процента для 100-й гармоники. Куцукос работает только с прямоугольным окном как и было в исходной программе. Рекомендация не интересна. Также не вижу нигде 18% предсказанных Гиббсом, а их всегда видно.
--------------------
Ты можешь знать все что угодно, но пока ты не доказал это на практике, ты не знаешь ничего!© Ричард Бах
|
|
|
|
|
Jul 15 2011, 06:43
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 1-07-11
Пользователь №: 66 006

|
Цитата(SPACUM @ Jul 14 2011, 20:10)  1.Если 3 точки, то есть формула, еще в школе изучали. Если не помните - могу напомнить. Запамятовал  Но сейчас в другую крайность влетел. Если Куцукос "ступеньку" выбрасывал, то сейчас подряд идут значения, отличающиеся всего на 1-2 десятых, но так как они сменяются каждые 200 мс, то прибор опять же остаётся неудобным. Я сейчас сижу над задачкой увеличения стабильности. Период взятия данных не должен превышать 250 мс (лучше всего 200 мс), чтобы показывал точно и в то же время на мелочь не реагировал. Опробую сейчас с различным окнами. Хотя не исключено, из малого опыта опять не в ту степь пойду. P.S.: спасибо вам большое!
Сообщение отредактировал QuickNick - Jul 15 2011, 06:44
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|