Обнаружение пиков в Performous коде
Я искал, чтобы реализовать определение высоты голоса в iphone, используя метод HPS. Но обнаруженные тоны не очень точны. Performous делает достойную работу по определению высоты тона.
Я просмотрел код, но не до конца понял теорию расчетов. Они используют БПФ и находят пики. Но та часть, где они используют фазу FFT-вывода, меня смутила. Я полагаю, что они используют некоторую эвристику для голосовых частот.
Итак, может кто-нибудь объяснить, какой алгоритм используется в Performous для определения высоты звука?
1 ответ
[Performous][1] извлекает высоту звука из микрофона. Также код с открытым исходным кодом. Вот описание того, что делает алгоритм, от парня, который его кодировал (Tronic на irc.freenode.net# executeous).
- Вход PCM (с буферизацией)
- БПФ (1024 семпла за раз, впоследствии удаляем 200 семплов из передней части буфера)
- Метод переназначения (по сравнению с предыдущим БПФ, который ранее составлял 200 образцов)
- Фильтрация пиков (эту часть можно сделать намного лучше или даже пропустить)
- Объединение пиков в наборы гармоник (мы называем комбинацию тоном)
- Временная фильтрация тонов (обновите набор тонов, обнаруженных ранее, вместо простого использования вновь обнаруженных)
- Выберите лучший вокальный тон (частотные ограничения, взвешивание, может также использовать гармонический массив, но я не думаю, что мы используем)
Я все еще не мог на основании этой информации понять это и реализовать это. Если кому-то это удастся, пожалуйста, опубликуйте свои результаты здесь и прокомментируйте этот ответ, чтобы SO уведомил меня.
Задача состоит в том, чтобы создать минимальную оболочку C++ вокруг этого кода.