.NET библиотека для определения смол

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


Большое спасибо за ваши быстрые ответы. Я уточняю:

Я хотел бы (предпочтительно.NET) библиотеку, которая идентифицирует ноты, которые я пою. Я хотел бы, чтобы такая библиотека:

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

Я собираюсь использовать такую ​​библиотеку, чтобы петь одну ноту за раз.

14 ответов

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

Как только вы нашли основную частоту, вам нужно найти эту частоту в списке, который сопоставляет частоты с нотами. Здесь вам нужно разобраться с промежуточными интервалами (поэтому, если основная частота вашей спетой ноты составляет 452 Гц, на какую ноту реагирует, A или A#?).

У этого парня на CodeProject есть пример FFT в C#. Я уверен, что есть другие там...

Вы ищете алгоритм оценки частоты или определения высоты тона. Большинство людей предлагают найти максимальное значение БПФ, но это слишком упрощенно и не работает так, как вы думаете. Если основной отсутствует (например, литавра), или одна из гармоник больше основной (например, труба), он не будет определять правильную частоту. Спектр трубы:

http://www.eng.cam.ac.uk/DesignOffice/mdp/electric_web/AC/02284.jpg

Кроме того, вы тратите время процессора, вычисляя БПФ, если вы ищете только определенную частоту. Вы можете использовать такие вещи, как алгоритм Гертцеля, чтобы более эффективно находить тоны в определенной полосе частот.

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

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

Обычно вы выполняете преобразование Фурье на входе, а затем определяете наиболее заметную частоту. Это может быть не вся история, так как любой несинтетический источник звука производит несколько частот (они составляют так называемый "цветовой тон"). Во всяком случае, это может быть сделано эффективно; есть тюнеры в реальном времени (вы не верите, что поп-звезда действительно может петь, не так ли?).

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

Подход Эрика Каллена кажется разумным, но есть и другие подходы. То, что я нашел, работало довольно хорошо, используя комбинацию БПФ и простой алгоритм обнаружения "пересечения нуля", чтобы сузить точную частоту сигнала.

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

Выполнение преобразования Фурье даст вам значения для каждой частоты, найденной в образце. Чем более заметна частота, тем выше значение. Если вы ищете наибольшее значение, вы найдете свою корневую частоту, но также будут присутствовать обертоны.

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

В прошлом я обнаруживал высоту тона, и простое решение "взять БПФ и посмотреть на пик" совсем не работает для речи. Мне очень повезло с использованием кепстрального анализа. Много полезных статей можно найти в публикациях Лоуренса Рабинера. Я рекомендую начать с "Сравнительного исследования производительности нескольких алгоритмов обнаружения основного тона".

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

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

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

Я поражен всеми ответами, предлагающими использование FFT, учитывая, что FFT, как правило, недостаточно точен для определения высоты тона. Может быть, но только с непрактично большим окном FFT. Например, чтобы определить фундаментальное значение с 1/100 точности полутона (что примерно соответствует тому, что вам нужно для точного определения высоты тона), когда базовое значение находится вокруг концерта A (440 Гц), вам необходимо окно FFT с 524 288 элементы. 1024 - гораздо более типичный размер БПФ - время вычислений становится все хуже с увеличением окна.

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

Таким образом, нота с наивысшей оценкой автокорреляции примерно равна основной высоте звука. Затем я "оттачиваю" истинный фундаментальный уровень, перебирая от одного полутона до одного полутона на 1/1000 полутона, чтобы найти значение локальной максимальной автокорреляции. Этот метод работает очень точно, и что более важно, он работает с широким спектром файлов инструментов (струны, гитара, человеческие голоса и т. Д.).

Однако этот процесс очень медленный, особенно для длинных файлов WAV, поэтому его нельзя использовать как приложение для реального времени. Тем не менее, если вы использовали FFT для получения приблизительной оценки основного значения, а затем использовали автокорреляцию для обнуления истинного значения (и вы были довольны тем, что были менее точными, чем 1/1000 полутона, что абсурдно чрезмерно точно) у вас был бы метод, который был бы относительно быстрым и чрезвычайно точным.

Вы должны сделать БПФ образца и затем проанализировать это. Две вещи, которые усложнят ваш анализ:

  1. Подтекст. Если вы поете / играете A на частоте 440 Гц (A4), вы также получите тон на A5 (880 Гц), один на E6 (1320 Гц) и т. Д. В зависимости от относительной интенсивности на частотах, этот тон может быть воспринят как А4, А5 или Е6, и ухудшение тона - это не просто вопрос того, где наиболее интенсивно, человеческое ухо сложнее, чем это. Тем не менее, вы могли бы предположить, что это будет восприниматься как А.

  2. Зернистость. Ваше БПФ будет иметь гранулярность, которая зависит только от продолжительности выборки, а не от частоты выборки. Если я правильно помню, вам нужна двухсекундная выборка, чтобы получить гранулярность 1 Гц, которая все еще немного грубая. Один из способов обойти это - взять три частоты вокруг каждого пика, аппроксимировать вокруг них многочлен второй степени, а затем определить максимум этого многочлена. Я прочитал статью, в которой утверждается, что использование фазы более точно, чем амплитуда для этого, но я не помню, где, поэтому я не могу процитировать ее.

Вы видели этот вопрос? Быстрое преобразование Фурье в C#

Похоже, это может помочь вам.

Если вы просто хотите получить результат - например, использовать программное обеспечение, есть программа под названием SingAndSee, которая делает именно это. Это около £25

Я думаю, что вы хотите, чтобы этот вопрос: обнаружение основного тона с использованием БПФ

Может быть, вам подходит эта полностью управляемая библиотека из codeplex: Realtime C# Pitch Tracker

Автор перечисляет следующие преимущества автокорреляции и его алгоритм реализации:

  1. Быстро. Как уже упоминалось выше, алгоритм довольно быстрый. Он может легко выполнить 3000 тестов высоты тона в секунду.

  2. Точная. Измеренное отклонение от фактической частоты составляет менее +-0,02%.

  3. Точность в широком диапазоне входных уровней. Поскольку алгоритм использует соотношения различных пиков, а не абсолютных значений, он остается точным в очень широком диапазоне входных уровней. В диапазоне от -40 дБ до 0 дБ нет потери точности.

  4. Точность во всем диапазоне частот. Точность остается высокой во всем диапазоне обнаруженных частот, примерно от 50 Гц до 1,6 кГц. Это связано с интерполяцией, которая применяется при расчете выборок для скользящих окон.

  5. Точный с любым типом формы волны. В отличие от многих других типов алгоритмов обнаружения основного тона, этот алгоритм практически не подвержен влиянию сложных сигналов. Это означает, что он работает с мужскими и женскими голосами любого типа, а также с другими инструментами, такими как гитары и т. Д. Единственное требование состоит в том, чтобы сигнал был однотонным, поэтому аккорды не могут быть обнаружены. Этот детектор высоты звука будет хорошо работать как очень отзывчивый гитарный тюнер.

  6. Не опирается на предыдущие результаты. Этот алгоритм достаточно точен, поэтому ему не нужно полагаться на предыдущие результаты. Каждый результат шага представляет собой совершенно новое вычисленное значение. Алгоритмы высоты тона, которые отслеживают высоту тона путем "привязки" к высоте тона, страдают от проблемы, заключающейся в том, что если они обнаружат неправильную высоту тона (обычно на октаву слишком высокую или низкую), они также будут неправильными для многих последующих тестов.

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

Для преобразования сигнала временной области, поступающего от микрофона, вам потребуется либо дискретное преобразование Фурье (DFT), либо быстрое преобразование Фурье (FFT). БПФ будет работать быстрее, но код будет намного сложнее (ДПФ может быть выполнен в 5-10 строках кода). Как только это будет завершено, вы должны отобразить основные частоты на ноты, к сожалению, есть несколько схем отображения в зависимости от того, какую систему настройки вы используете. Наиболее распространенным из них является Равный Темперамент. Частоты здесь. Статья в Википедии о равном темпераменте также дает представление о равном темпераменте.

При использовании любой математики Фурье вам необходимо знать о том, как обрабатываются частоты, и в идеале выполнять фильтрацию сглаживания перед преобразованием, а также следить за отражением частоты при выполнении преобразования. Благодаря Nyquists theorum вам нужно будет сэмплировать содержимое микрофона как минимум вдвое быстрее, чем максимальная частота, т.е. для максимальной частоты 10 Гц вы должны сэмплировать при 20 Гц.

D3D11 содержит реализацию FFT

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