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

 
 
> Алгоритм поиска основной частоты, Метод максимального правдоподобия
QuickNick
сообщение Jul 1 2011, 06:56
Сообщение #1


Участник
*

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



Здравствуйте, товарищи.

Мне нужно улучшить алгоритм поиска основной частоты по методу максимального правдоподобия. Был пример у меня, как делать, я его модифицировал в нескольких местах (добавил настраиваемость оконной функции и фильтра). Возможно, некоторые места вам покажутся совершенно абсурдными - но я пока новичок в DSP, некоторые места в старом алгоритме вызывают у меня сильное удивление, но пока не хватает опыта для однозначного решения: или я не понимаю момент, или предыдущий программист допустил косяк.

- Вход: массив байтов byteData длиной sampleLength, количество разбиений sampleRate.
- Выход: фундаментальная частота fundamentalFrequency и громкость fundamentalVolume.

Алгоритм:
1. Массив байтов преобразуется в вешественный массив амплитуд.
2. Проверяется максимальная амплитуда - если она ниже определённого значения, то это квалифицируется как почти полная тишина (выход из алгоритма)
3. Получение спектра из массива амплитуд:
3.1. Умножение массива амплитуд на оконную функцию;
3.2. Преобразование Фурье.
4. Фильтрация массива спектральных значений.
5. Расчёт массива громкости (модуль от спектральных значений).
6. Нормализация громкости:
6.1. Поиск максимальной громкости (maxVolume).
6.2. Нормализация (volume[i] = volume[i]/maxVolume);
7. Квалификация спектра как информативного или зашумлённого.
8. Инициализация 3 пиков громкости и соответствующих им частот.
9. Поиск фундаментальной частоты.
9.1. Если один из 2 главных пиков громкости ниже некоторого порога громкости, то выбрать частоту другого главного пика, выход из алгоритма.
9.2. Поиск фундаментальной частоты по 2 главным пикам согласно известным пропорциям 1/2, 1/3, 2/3, 2/5, 3/4, 3/5.
9.3. Коррекция фундаментальной частоты по 3-му пику.

Мне нужно пробежаться по некоторым пунктам, чтобы удостовериться в валидности алгоритма.
Пункты 1, 2, 6, 8 и 9 вопросов не вызывают.

Самые горячие вопросы сейчас такие:
1. Правильно ли считается громкость? Массив спектральных значений имеет следующую структуру: в ячейках spectre[2*i] лежат коэффициэнты при косинусах, в spectre[2*i+1] лежат коэффициэнты при синусах. Соответственно, громкость считаю так: volume[i] = sqrt(sqr(spectre[2*i])+sqr(spectre[2*i+1])); Может, таким методом не громкость считается, а что-то другое?
2. Как рассчитать шум? И как рассчитать порог шума (если его превысить, то выход из алгоритма)? Сейчас шум рассчитывается как среднее арифметическое по массиву громкости.

Сообщение отредактировал QuickNick - Jul 1 2011, 07:00
Go to the top of the page
 
+Quote Post
3 страниц V  < 1 2 3  
Start new topic
Ответов (30 - 33)
SPACUM
сообщение Jul 15 2011, 08:22
Сообщение #31


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

Группа: Участник
Сообщений: 161
Регистрация: 22-06-09
Из: Москва
Пользователь №: 50 531



Цитата(QuickNick @ Jul 15 2011, 10:43) *
Запамятовал sm.gif

Если y0 - значение посередине для частоты x0, y1 - значение слева для x0 - dx, y2 - значение справа для x0 + dx, dx - шаг по частоте, то
x = x0 + dx * (y2 - y1)/(2 * y0 - y1 - y2) / 2;
Это экстремум параболы по трем точкам.


--------------------
Ты можешь знать все что угодно, но пока ты не доказал это на практике, ты не знаешь ничего!© Ричард Бах
Go to the top of the page
 
+Quote Post
QuickNick
сообщение Jul 15 2011, 09:08
Сообщение #32


Участник
*

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



Цитата(SPACUM @ Jul 15 2011, 11:22) *
Если y0 - значение посередине для частоты x0, y1 - значение слева для x0 - dx, y2 - значение справа для x0 + dx, dx - шаг по частоте, то
x = x0 + dx * (y2 - y1)/(2 * y0 - y1 - y2) / 2;
Это экстремум параболы по трем точкам.

Точно, спасибо!
Go to the top of the page
 
+Quote Post
SPACUM
сообщение Jul 15 2011, 10:51
Сообщение #33


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

Группа: Участник
Сообщений: 161
Регистрация: 22-06-09
Из: Москва
Пользователь №: 50 531



Цитата(QuickNick @ Jul 15 2011, 10:43) *
Но сейчас в другую крайность влетел.

Очень советую алгоритмы проверять на тестовых синтезированных сигналах, где каждый шаг можно проверить. Определить точность. А потом уже использовать реальные.


--------------------
Ты можешь знать все что угодно, но пока ты не доказал это на практике, ты не знаешь ничего!© Ричард Бах
Go to the top of the page
 
+Quote Post
QuickNick
сообщение Jul 15 2011, 12:01
Сообщение #34


Участник
*

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



Цитата(SPACUM @ Jul 15 2011, 13:51) *
Очень советую алгоритмы проверять на тестовых синтезированных сигналах, где каждый шаг можно проверить. Определить точность. А потом уже использовать реальные.

Собственно, так и делаем. Плюс ещё сравниваем поведение с другими детекторами.

А стабильности я добился с помощью очереди, которая в TuxGuitar реализована (org.herac.tuxguitar.gui.tools.custom.tuner.TGTunerQueue). Вернее, её взял за основу.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 11th August 2025 - 23:43
Рейтинг@Mail.ru


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