Обнаружение пиков в Performous коде

Я искал, чтобы реализовать определение высоты голоса в iphone, используя метод HPS. Но обнаруженные тоны не очень точны. Performous делает достойную работу по определению высоты тона.

Я просмотрел код, но не до конца понял теорию расчетов. Они используют БПФ и находят пики. Но та часть, где они используют фазу FFT-вывода, меня смутила. Я полагаю, что они используют некоторую эвристику для голосовых частот.

Итак, может кто-нибудь объяснить, какой алгоритм используется в Performous для определения высоты звука?

1 ответ

Решение

[Performous][1] извлекает высоту звука из микрофона. Также код с открытым исходным кодом. Вот описание того, что делает алгоритм, от парня, который его кодировал (Tronic на irc.freenode.net# executeous).

  • Вход PCM (с буферизацией)
  • БПФ (1024 семпла за раз, впоследствии удаляем 200 семплов из передней части буфера)
  • Метод переназначения (по сравнению с предыдущим БПФ, который ранее составлял 200 образцов)
  • Фильтрация пиков (эту часть можно сделать намного лучше или даже пропустить)
  • Объединение пиков в наборы гармоник (мы называем комбинацию тоном)
  • Временная фильтрация тонов (обновите набор тонов, обнаруженных ранее, вместо простого использования вновь обнаруженных)
  • Выберите лучший вокальный тон (частотные ограничения, взвешивание, может также использовать гармонический массив, но я не думаю, что мы используем)

Я все еще не мог на основании этой информации понять это и реализовать это. Если кому-то это удастся, пожалуйста, опубликуйте свои результаты здесь и прокомментируйте этот ответ, чтобы SO уведомил меня.

Задача состоит в том, чтобы создать минимальную оболочку C++ вокруг этого кода.

Другие вопросы по тегам