Обнаружение высоты тона в реальном времени

Я пытаюсь в реальном времени определять высоту звука поющих пользователей, но сталкиваюсь с множеством проблем. Я пробовал множество методов, включая БПФ (Проблема БПФ (возвращает случайные результаты) ) и автокорреляции (Автокорреляция высоты тона возвращает случайные результаты с микрофонным входом), но я не могу найти никаких методов для получения хорошего результата. Может ли кто-нибудь предложить метод отслеживания высоты звука в реальном времени или как улучшить метод, который у меня уже есть? Кажется, я не могу найти никаких хороших методов C / C ++ для определения высоты тона в реальном времени.

Спасибо,

Найл.

Изменить: просто отметить, что я проверил, что входные данные микрофона верны, и что при использовании синусоидальной волны результаты более или менее соответствуют правильному тону.

Изменить: извините, это поздно, но на данный момент я визуализирую автосборку, вынимая значения из массива результатов и каждого индекса и отображая индекс по оси X и значение по оси Y (оба делятся на 100000 или что-то в этом роде, и я использую OpenGL), подключение данных к хосту VST и использование плагинов VST для меня не вариант. На данный момент это просто похоже на какие-то случайные точки. Я делаю это правильно, или не могли бы вы указать мне какой-нибудь код для этого или помочь мне понять, как визуализировать необработанные аудиоданные и данные автокорреляции.


person Niall    schedule 30.08.2009    source источник
comment
Я подозреваю, что вы сделали это неправильно. Вы когда-нибудь решали проблему подчиненного из этих других вопросов? Вся эта штука со случайными результатами просто звучит так, как будто у вас еще нет этих методов, работающих правильно.   -  person dmckee --- ex-moderator kitten    schedule 30.08.2009
comment
Эта проблема мне кажется очень похожей на определение высоты звука, как это сделано в игре Rock Band для вокала - и они, похоже, заставили ее работать вполне нормально. Это заставляет меня думать, что должен быть способ сделать это. Просто читая статью в Википедии об обнаружении высоты тона, кажется, что это не совсем тривиальная проблема. Мы надеемся, что вы разместите здесь ответ, если найдете хороший метод!   -  person Mike Dinescu    schedule 30.08.2009
comment
@dmckee, я подавал автокорреляцию на синусоидальную волну, и она возвращала более или менее правильную высоту звука, но когда я подавал на нее микрофонный вход, результаты были повсюду   -  person Niall    schedule 30.08.2009
comment
Возможно, ваша выборка слишком узкая? Попробуйте взять среднее значение нескольких значений позади и перед вами и использовать это для отображения высоты тона.   -  person Stefan Kendall    schedule 30.08.2009
comment
Для отладки попробуйте свистеть. Звук свиста содержит одну очень сильную частоту с небольшим количеством обертонов. Вам также следует визуализировать результат БПФ, если вы этого еще не сделали.   -  person Thomas    schedule 30.08.2009
comment
Извините, если я звучу глупо, но чтобы визуализировать БПФ / автокорреляцию, мог бы я взять каждое значение в массиве результатов и отобразить его и величину этого значения?   -  person Niall    schedule 30.08.2009
comment
Я должен согласиться с Томасом в визуализации. Построение графика - отличный способ узнать о свойствах анализируемого звука.   -  person avakar    schedule 30.08.2009
comment
Итак, чтобы визуализировать результат БПФ / автокорреляции, я бы пробежался по массиву, построил каждое значение и величину каждого значения?   -  person Niall    schedule 30.08.2009
comment
Найл: да, вам нужно изобразить величину частот из вашего БПФ.   -  person RBarryYoung    schedule 30.08.2009
comment
... или, в случае автокорреляции, коэффициент корреляции для каждого возможного периода.   -  person avakar    schedule 30.08.2009
comment
Вот рабочий код с объяснением в c: blog.bjornroche.com/2012/07/, вы можете добиться большего успеха, но это хорошее начало ..   -  person Bjorn Roche    schedule 30.01.2014


Ответы (12)


Делаем шаг назад ... Чтобы это сработало, вы ДОЛЖНЫ найти способ обозначить промежуточные этапы этого процесса. То, что вы пытаетесь сделать, не особенно сложно, но оно чревато ошибками и неудобно. Отсечение, управление окнами, плохая разводка, сглаживание, смещения постоянного тока, чтение неправильных каналов, странная ось частот БПФ, несоответствие импеданса, ошибки размера кадра ... кто знает. Но если вы можете построить необработанные данные, а затем построить БПФ, все станет ясно.

person tom10    schedule 30.08.2009
comment
Как именно построить необработанные данные и БПФ? - person some_id; 26.04.2013
comment
@ Helium3: форма волны и спектрограмма (2D). Проверьте Audacity. - person MSalters; 26.09.2013
comment
Или выведите промежуточные представления в CSV и просмотрите их в MATLAB или Octave. - person johnwbyrd; 18.12.2015
comment
Точно. Программирование - это декомпозиция проблемы. Вы должны найти способ разбить проблему на части, которые легче решить. - person Cameron Lowell Palmer; 05.05.2016

Я нашел несколько реализаций с открытым исходным кодом для отслеживания высоты звука в реальном времени.

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

  • Praat - это пакет с открытым исходным кодом, который иногда используется лингвистами для извлечения питча, и вы можете найти алгоритм, задокументированный на http://www.fon.hum.uva.nl/paul/praat.html

  • Snack и WaveSurfer также содержат экстрактор высоты тона.

person Deanna Gelbart    schedule 09.09.2011

Я знаю, что этот ответ не сделает всех счастливыми, но начнем.

Это сложно, очень сложно. Сначала прочтите как можно больше руководств по БПФ, автокорреляции, вейвлетам. Хотя я все еще борюсь с DSP, я кое-что понял из следующего.

https://www.coursera.org/course/audio курс не работает в момент, но видео все еще доступны.

http://miracle.otago.ac.nz/tartini/papers/Philip_McLeod_PhD.pdf диссертация о разработке алгоритма распознавания звука.

http://dsp.stackexchange.com - целый сайт, посвященный цифровой обработке сигналов.

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

Далее идут тестовые данные и тестирование. Напишите себе библиотеку, которая генерирует тестовые файлы для проверки вашего алгоритма / алгоритмов.

1) Супер простой генератор синусоидальной волны. Предположим, вы хотите написать YAT (еще один тюнер), а затем используйте свой синусоидальный генератор для создания серии файлов около 440 Гц, скажем, от 420 до 460 Гц с различными приращениями, и посмотрите, насколько чувствителен и точен ваш код. Может ли он разрешаться с точностью до 5 Гц, 1 Гц, еще лучше?

2) Затем модернизируйте свой генератор синусоидальной волны, чтобы он добавлял к сигналу серию более слабых гармоник.

3) Далее идут реальные вариации гармоник. Таким образом, в то время как для большинства струнных инструментов вы увидите ряд гармоник как простые кратные основной частоты F0, для таких инструментов, как кларнеты и флейты, из-за поведения воздуха в камере четные гармоники будут отсутствовать или очень слабые. А для некоторых инструментов F0 отсутствует, но ее можно определить по распределению других гармоник. F0 - это то, что человеческое ухо воспринимает как высоту звука.

4) Добавьте некоторое преднамеренное искажение, нерегулярно смещая пиковые частоты гармоник вверх и вниз.

Дело в том, что если вы создаете файлы с известными результатами, то легче проверить, что то, что вы создаете, действительно работает, без ошибок, конечно.

Также существует ряд «библиотек», содержащих звуковые сэмплы. https://freesound.org из упомянутой выше серии Coursera. http://theremin.music.uiowa.edu/MIS.html

Затем имейте в виду, что ваш микрофон не идеален и, если вы не потратили на него тысячи долларов, будет иметь довольно изменчивый диапазон частотной характеристики. В частности, если вы работаете с низкими нотами, тогда более дешевые микрофоны, читайте встроенные в ваш компьютер или телефон, имеют значительный спад, начиная с 80-100 Гц. Для достаточно хороших внешних вы можете снизить частоту до 30-40 Гц. Найдите данные на своем микрофоне.

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

Что касается производительности, существует ряд свободно доступных библиотек, хотя следует помнить о различных моделях лицензирования.

Прежде всего, не сдавайтесь после пары первых попыток. Удачи.

person TJA    schedule 24.01.2015

Вот исходный код C ++ для необычного двухэтапного алгоритма, который я разработал, который может выполнять определение высоты звука в реальном времени для полифонических файлов MP3 при воспроизведении в Windows. Это бесплатное приложение (PitchScope Player, доступное в Интернете) часто используется для обнаружения нот гитары или саксофона соло при записи MP3. Алгоритм разработан для определения наиболее доминирующей высоты звука (музыкальной ноты) в любой момент времени в музыкальном файле MP3. Начало нот точно определяется значительным изменением наиболее доминирующей высоты звука (музыкальной ноты) в любой момент во время записи MP3.

Когда на пианино нажимается одна клавиша, мы слышим не одну частоту звуковой вибрации, а смесь множества звуковых колебаний, возникающих на разных математически связанных частотах. Элементы этой совокупности колебаний с разными частотами называются гармониками или частичными. Например, если мы нажмем среднюю клавишу C на фортепиано, отдельные частоты гармоник композитного сигнала начнутся с 261,6 Гц в качестве основной частоты, 523 Гц будет 2-й гармоникой, 785 Гц будет 3-й гармоникой, 1046 Гц будет быть 4-й гармоникой и т. д. Более поздние гармоники являются целыми кратными основной частоты, 261,6 Гц (например: 2 x 261,6 = 523, 3 x 261,6 = 785, 4 x 261,6 = 1046). Связанный внизу снимок реальных гармоник, возникающих во время полифонической записи гитарного соло в формате MP3.

Вместо БПФ я использую модифицированное преобразование ДПФ с логарифмическим интервалом частот, чтобы сначала обнаружить эти возможные гармоники путем поиска частот с пиковыми уровнями (см. Диаграмму ниже). Из-за способа, которым я собираю данные для моего модифицированного Log DFT, мне НЕ нужно применять оконную функцию к сигналу, а также не добавлять и перекрывать. И я создал ДПФ, так что его частотные каналы расположены логарифмически, чтобы напрямую согласовываться с частотами, на которых гармоники создаются нотами на гитаре, саксофоне и т. Д.

Выйдя на пенсию, я решил выпустить исходный код для своего механизма определения высоты тона в бесплатном демонстрационном приложении под названием PitchScope Player. PitchScope Player доступен в Интернете, и вы можете загрузить исполняемый файл для Windows, чтобы увидеть, как мой алгоритм работает с файлом mp3 по вашему выбору. Приведенная ниже ссылка на GitHub.com приведет вас к моему полному исходному коду, где вы можете увидеть, как я обнаруживаю гармоники с помощью настраиваемого логарифмического преобразования ДПФ, а затем ищу части (гармоники), частоты которых удовлетворяют правильному целочисленному соотношению, которое определяет ' подача'.

Мой алгоритм определения высоты тона на самом деле представляет собой двухэтапный процесс: a) Сначала определяется ScalePitch («ScalePitch» имеет 12 возможных значений высоты тона: {E, F, F #, G, G #, A, A # , B, C, C #, D, D #}) б) и после определения ScalePitch вычисляется Octave путем изучения всех гармоник для 4 возможных нот Octave-Candidate. Алгоритм разработан для определения наиболее доминирующей высоты звука (музыкальной ноты) в любой момент времени в полифоническом файле MP3. Обычно это соответствует нотам инструментального соло. Те, кто интересуется исходным кодом C ++ для моего двухэтапного алгоритма определения шага, могут захотеть начать с функции Estimate_ScalePitch () в файле SPitchCalc.cpp на GitHub.com. https://github.com/CreativeDetectors/PitchScope_Player

Ниже приведено изображение логарифмического ДПФ (созданного моей программой на C ++) для 3 секунд гитарного соло на полифонической записи в формате mp3. Он показывает, как гармоники появляются для отдельных нот на гитаре при игре соло. Для каждой ноты в этом логарифмическом ДПФ мы можем видеть его несколько гармоник, простирающихся по вертикали, потому что каждая гармоника будет иметь одинаковую временную ширину. После определения октавы ноты мы узнаем частоту основного тона.

введите описание изображения здесь

person James Paul Millard    schedule 30.07.2016

У меня была аналогичная проблема с микрофонным входом в проекте, который я реализовал несколько лет назад - оказалось, что это связано с смещением постоянного тока.

Убедитесь, что вы удалили любое смещение, прежде чем пытаться выполнить БПФ или какой-либо другой метод, который вы используете.

Также возможно, что у вас возникнут проблемы с запасом по высоте или обрезкой.

Графики - лучший способ диагностировать большинство проблем со звуком.

person Dipstick    schedule 30.08.2009
comment
Извините, если я звучу глупо, но как мне визуализировать результат БПФ / автокорреляции? Могу ли я взять каждое значение в массиве результатов и нанести его на график вместе с величиной этого значения? - person Niall; 30.08.2009
comment
Вы можете удалить смещение постоянного тока с помощью фильтра высоких частот, установленного на очень низкую частоту среза. Я обычно использую 25-30 герц, исходя из самого низкого результата для бас-гитар с удлиненными струнами (5 или 6). - person Nosredna; 30.08.2009
comment
Я предлагаю выполнить ввод через хост и использовать бесплатные VSTs Fre (a) koscope и s (M) exoscope, чтобы увидеть частотную характеристику и форму волны графически. - person Nosredna; 30.08.2009
comment
Есть ли другой способ сделать это? VSTs Fre (a) koscope и s (M) exoscope предназначены для Windows и im на Mac. - person Niall; 30.08.2009
comment
Я думаю, что есть плагин, который позволяет использовать VST для ПК на компьютерах Intel Mac. Подавляющее большинство бесплатных плагинов - это ПК (поэтому я до сих пор пишу музыку на своем ПК, а не на Mac). Есть несколько похожих инструментов для Mac, но большинство из них платные. Попробуйте вещи BlueCat. У него есть анализатор спектра и осциллограф. Или выполните поиск в базе данных аудиоплагинов на сайте kvraudio. Или просто спросите там на форуме. - person Nosredna; 30.08.2009
comment
Анализатор спектра позволит вам сравнить ваши результаты БПФ с результатами других, что даст вам знать, если у вас есть ошибка. Осциллограф позволит вам увидеть, есть ли у вас обрезка. - person Nosredna; 30.08.2009
comment
Теперь я использую фильтр верхних частот, чтобы удалить смещение постоянного тока (см. stackoverflow.com/questions/1353368/), но он все еще не работает, знаете, почему? - person Niall; 06.09.2009

Ознакомьтесь с aubio и библиотекой с открытым исходным кодом, которая включает несколько современных методов отслеживания высоты тона.

person piem    schedule 10.12.2009

Взгляните на этот образец приложения:

http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx

Я понимаю, что приложение написано на C #, и вам нужен C ++, и я понимаю, что это .Net / Windows, и вы используете Mac ... Но я подумал, что его реализация БПФ может быть отправной точкой. Попробуйте сравнить свою реализацию БПФ с его. (Это итеративная, расширенная версия БПФ Кули-Тьюки). Они похожи?

Кроме того, "случайное" поведение, которое вы описываете, может быть вызвано тем, что вы напрямую захватываете данные, возвращаемые вашей звуковой картой, без правильной сборки значений из байтового массива. Вы просили свою звуковую карту пробовать 16-битные значения, а затем дали ей байтовый массив для хранения значений? Если это так, помните, что два последовательных байта в возвращаемом массиве составляют один 16-битный аудиосэмпл.

person Christian Pedersen    schedule 02.09.2010

Код Java для детектора реального времени доступен по адресу http://code.google.com/p/freqazoid/.

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

person James Beauchamp    schedule 16.01.2012

Я задал здесь аналогичный вопрос:

C / C ++ / Obj-C Алгоритм реального времени для определения ноты (не высоты звука) из голосового ввода

РЕДАКТИРОВАТЬ:

Performous содержит модуль C ++ для определения высоты звука в реальном времени.

Также алгоритм отслеживания звука Yin

person P i    schedule 19.11.2010
comment
Какой вопрос? Или этот принятый ответ на вопросы изменился? - person some_id; 26.04.2013
comment
Извините, я исправил ответ, в котором отсутствовала ссылка. - person P i; 11.06.2014

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

person djna    schedule 30.08.2009
comment
Я пробовал адаптировать кое-что из кода гитарного тюнера (который использовал БПФ), но результаты были повсюду. - person Niall; 30.08.2009

Вот несколько библиотек с открытым исходным кодом, которые реализуют определение высоты тона:

  • МИР: набор инструментов для анализа / синтеза речи. Это особенно удобно, если ваш исходный сигнал - голос.
  • aubio: библиотека для извлечения аудиофайлов. Реализует множество алгоритмов определения высоты тона.
  • Определение высоты звука: набор алгоритмов определения высоты звука, реализованных на C ++.
  • dywapitchtrack: высококачественный алгоритм определения высоты звука.
  • YIN: еще одна реализация алгоритма YIN в едином исходном файле C ++.
person Max Klint    schedule 24.02.2020

Вы можете определять высоту тона в реальном времени, будь то голос певца, с помощью TarsosDSP https://github.com/JorenSix/TarsosDSP на случай, если о нем еще никто не слышал :-)

person pterodactylus42    schedule 11.01.2021
comment
Это очень старый вопрос, я не знаю, актуален ли ваш ответ. - person stateMachine; 12.01.2021