Обнаружение основной частоты

Этот технологический фестиваль проходит в ИИТ-Бомбее, Индия, где проходит мероприятие под названием "Арт-боты", на котором мы должны создавать арт-роботов с художественными способностями. У меня была идея о музыкальном роботе, который берет песню в качестве входного сигнала, обнаруживает ноты в песне и воспроизводит ее на пианино. Мне нужен какой-то метод, который поможет мне вычислить высоту нот песни. Любая идея / предложение о том, как это сделать?

10 ответов

Это именно то, что я делаю здесь, как мой прошлогодний проект:) за исключением одного, что мой проект заключается в отслеживании высоты голоса человеческого пения (а у меня нет робота, чтобы играть мелодию)

Самый быстрый способ, которым я могу придумать, - это использовать библиотеку BASS. Он содержит готовую к использованию функцию, которая может выдавать вам данные FFT с устройства записи по умолчанию. Взгляните на пример кода "livepec", который поставляется с BASS.

Кстати, необработанных данных БПФ будет недостаточно для определения основной частоты. Вам нужен алгоритм, такой как Harmonic Product Spectrum, чтобы получить F0.

Еще одним соображением является источник звука. Если вы собираетесь делать БПФ и применять Harmonic Product Spectrum. Вам нужно убедиться, что вход имеет только один источник звука. Если он содержит несколько источников, таких как в современных песнях, будет много частот для рассмотрения.

Гармоническая Теория Спектра Продуктов

Если входной сигнал представляет собой музыкальную ноту, то его спектр должен состоять из серии пиков, соответствующих основной частоте с гармоническими составляющими при целых кратных основной частоте. Следовательно, когда мы сжимаем спектр несколько раз (понижающая дискретизация) и сравниваем его с исходным спектром, мы видим, что самые сильные гармонические пики выстраиваются в линию. Первый пик в исходном спектре совпадает со вторым пиком в спектре, сжатом в два раза, что совпадает с третьим пиком в спектре, сжатом в три раза. Следовательно, когда различные спектры умножаются вместе, результат будет формировать четкий пик на основной частоте.

метод

Сначала мы разделяем входной сигнал на сегменты, применяя окно Ханнинга, где размер окна и размер скачка задаются как входные данные. Для каждого окна мы используем кратковременное преобразование Фурье для преобразования входного сигнала из временной области в частотную область. Когда входной сигнал находится в частотной области, мы применяем технику Гармонического спектра продуктов к каждому окну.

HPS включает в себя два этапа: понижающую дискретизацию и умножение. Чтобы уменьшить выборку, мы сжимали спектр дважды в каждом окне путем повторной дискретизации: в первый раз мы сжимаем исходный спектр в два раза, а во второй раз - в три. Как только это будет завершено, мы умножим три спектра вместе и найдем частоту, соответствующую пику (максимальное значение). Эта конкретная частота представляет основную частоту этого конкретного окна.

Ограничения метода HPS

Вот некоторые приятные особенности этого метода: он недорог в вычислительном отношении, достаточно устойчив к аддитивному и мультипликативному шуму и настраивается на различные виды входов. Например, мы могли бы изменить количество используемых сжатых спектров, и мы могли бы заменить спектральное умножение спектральным сложением. Однако, поскольку восприятие основного тона человека в основном логарифмическое, это означает, что низкие частоты могут отслеживаться менее точно, чем высокие частоты.

Другой серьезный недостаток метода HPS заключается в том, что его разрешение настолько же хорошо, как и длина БПФ, используемая для расчета спектра. Если мы выполняем короткое и быстрое БПФ, мы ограничены в количестве дискретных частот, которые мы можем рассмотреть. Чтобы получить более высокое разрешение в нашем выводе (и, следовательно, увидеть меньшую зернистость в нашем выводе основного тона), нам нужно взять более длинное БПФ, которое требует больше времени.

от: http://cnx.org/content/m11714/latest/

Просто комментарий: основная гармоника также может отсутствовать в (гармоническом) звуке, это не меняет воспринимаемой высоты тона. В качестве предельного случая, если вы берете прямоугольную волну (скажем, ноту C#) и полностью подавляете первую гармонику, воспринимаемая нота остается C# в той же октаве. В каком-то смысле наш мозг способен компенсировать отсутствие некоторых гармоник, даже первых, когда угадывает ноту. Следовательно, чтобы обнаружить высоту с помощью методов частотной области, вы должны принять во внимание все гармоники (локальные максимумы в величине преобразования Фурье) и извлечь своего рода "наибольший общий делитель" их частот. Обнаружение высоты тона не является тривиальной проблемой вообще...

DAFX имеет около 30 страниц, посвященных обнаружению основного тона, с примерами и кодом Matlab.

Автокорреляция - http://en.wikipedia.org/wiki/Autocorrelation

Пересечение нуля - http://en.wikipedia.org/wiki/Zero_crossing (этот метод используется в дешевых гитарных тюнерах)

Попробуйте YAAPT отслеживание высоты тона, которое определяет основную частоту как во временной, так и в частотной областях. Вы можете скачать исходный код Matlab по ссылке и искать пики в выводе FFT, используя спектральную часть процесса.

Пакет Python http://bjbschmitt.github.io/AMFM_decompy/pYAAPT.html

Просто мысль - но нужно ли обрабатывать цифровой аудиопоток в качестве входного сигнала?

Если нет, попробуйте использовать символическое представление музыки (например, MIDI). Высота нот будет затем указана явно, и вы сможете очень легко синтезировать звуки (и движения), соответствующие высоте, ритму и многим другим музыкальным параметрам.

Если вам необходимо проанализировать цифровой аудиопоток (mp3, wav, live input и т. Д.), Имейте в виду, что, хотя обнаружение основного тона простых монофонических звуков довольно продвинуто, обнаружение полифонического тона является нерешенной проблемой. В этом случае вам может пригодиться мой ответ на этот вопрос.

Если вы пытаетесь обнаружить ноты полифонической записи (несколько нот одновременно), удачи. Это очень сложная проблема. Я не знаю, как прослушать, скажем, запись струнного квартета, и у меня есть алгоритм, разделяющий четыре голоса. (Может быть, вейвлеты?) Если это только одна нота за раз, существует несколько алгоритмов отслеживания высоты тона, многие из которых упоминаются в других комментариях.

Алгоритм, который вы хотите использовать, будет зависеть от типа музыки, которую вы слушаете. Если вы хотите, чтобы люди поют, есть много хороших алгоритмов, разработанных специально для голоса. (Вот где большая часть исследований.) Если вы пытаетесь подобрать конкретные инструменты, вам нужно быть немного более креативным. Голосовые алгоритмы могут быть простыми, потому что диапазон голоса, поющего человека, обычно ограничен 100-2000 Гц. (Разговорный диапазон намного более узкий). Однако основные частоты на пианино составляют примерно 27 Гц. до 4200 Гц., так что вы имеете дело с более широким диапазоном, который обычно игнорируется алгоритмами определения высоты голоса.

Форма волны большинства инструментов будет довольно сложной, с большим количеством гармоник, поэтому простой подход, такой как подсчет нулей или просто автокорреляция, не сработает. Если вы точно знаете, какой частотный диапазон вы ищете, вы можете использовать фильтр нижних частот, а затем считать ноль. Я думаю, что вам будет лучше, если использовать более сложный алгоритм, такой как гармонический спектр продуктов, упомянутый другим пользователем, или YAAPT ("Еще один алгоритм отслеживания основного тона") или что-то подобное.

Последняя проблема: на некоторых инструментах, в частности, на пианино, не хватает основополагающих принципов и негармоничности. С пропущенными основами можно справиться с помощью алгоритмов слежения за высотой тона... на самом деле они должны быть таковыми, так как основы часто исключаются при электронной передаче... хотя, вероятно, вы все равно получите некоторые октавные ошибки. Однако негармоничность создаст вам проблемы, если кто-то сыграет ноту в нижних октавах фортепиано. Обычные алгоритмы отслеживания высоты тона не предназначены для борьбы с негармоничностью, потому что человеческий голос не является существенно негармоничным.

Вы пробовали статью в Википедии об обнаружении подачи? Он содержит несколько ссылок, которые могут быть вам интересны.

Кроме того, вот список приложений и библиотек DSP, где вы можете покопаться. В списке упоминаются только программные пакеты для Linux, но многие из них являются кроссплатформенными, и вы можете посмотреть на множество исходного кода.

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

Для извлечения основной частоты мелодии из полифонической музыки вы можете попробовать плагин MELODIA: http://mtg.upf.edu/technologies/melodia

Извлечь F0 из всех инструментов в песне (отслеживание нескольких F0) или переписать их в ноты - еще более сложная задача. Как извлечение мелодии, так и транскрипция музыки по-прежнему остаются открытыми исследовательскими проблемами, поэтому независимо от используемого вами алгоритма / инструмента не ожидайте получения идеальных результатов ни для одного из них.

Вам в основном нужен анализатор спектра. Вы можете использовать FFT для записи аналогового входа, но многое зависит от разрешения записи.

Что сразу приходит мне в голову:

  • отфильтровывать очень низкие частоты (барабаны, басовая линия),
  • отфильтровывать высокие частоты (гармоники)
  • FFT,
  • ищите пики в выходе FFT для мелодии

Я не уверен, работает ли это для очень полифонических звуков - возможно, прибегая к помощи "FFT, анализ, мелодия и т. Д." вернет больше информации о возможных проблемах.

С уважением

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