Библиотека .NET для идентификации ям

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


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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

Trumpet spectrum
(источник: cam.ac.uk)

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

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

  • Зернистость

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

Ответ 9

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

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

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

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

Ответ 10

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

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

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

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

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

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

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

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

Ответ 13

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

Ответ 14

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

Ответ 15

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

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