2009-12-04 13 views
26

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


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

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

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

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

+0

... И вы хотели бы узнать, какие библиотеки и компоненты использовать? – FrustratedWithFormsDesigner

+1

Думаю, вам нужно уточнить ваш вопрос. Вы заявили общее желание, а не конкретные вопросы. – CrimsonX

+0

Должен ли он быть настроен, или он должен допускать ложные заметки? – Abel

ответ

7

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

+1

Это не сработает если одна из гармоник больше фундаментальной. Это чаще, чем вы думаете. Трубный спектр: http://www.eng.cam.ac.uk/DesignOffice/mdp/electric_web/AC/02284.jpg – endolith

+0

endolith, вот что я имел в виду «не вся история». – Svante

19

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

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

Этот парень на CodeProject имеет пример БПФ в C#. Я уверен, что есть другие ...

+0

Не все алгоритмы определения высоты тона основаны на частотном анализе. Некоторые из них основаны на анализе времени (правда, однако, что анализ времени -eg: автокорреляция - часто использует БПФ по соображениям производительности.) Http://en.wikipedia.org/wiki/Pitch_detection_algorithm#Time-domain_approaches – leonbloy

2

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

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

3

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

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

2

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

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

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

+0

"воспринимается как A4, A5 или E6 «Гармоника не все октавы. – endolith

+0

@endolith: Что значит? – erikkallen

+0

ОК, теперь я это вижу. Это была опечатка. Исправлено: – erikkallen

4

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

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

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

3

В прошлом я сделал pitch detection, и простое решение «взять БПФ и посмотреть на пик» вообще не работает для речи. Мне повезло с cepstral analysis. Много полезной работы можно найти в статье Лоуренса Рабинера publications. Я рекомендую начинать с "A comparative performance study of several pitch detection algorithms".

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

1

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

+0

Хотя идеальная вещь - иметь только библиотеку, которая делает обнаружение высоты, ваше предложение очень близко к тому, что я хочу. Спасибо. – Antoni

+0

kpollock, я просто получил SingAndSee. Это просто здорово. Это просто, полезно и прямолинейно. Еще раз, спасибо. – Antoni

+0

рад, что мое предложение было полезно. Я просто хочу, чтобы у него была опция «выход на midi» .... – kpollock

1

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

8

Вы ищете алгоритм frequency estimation или pitch-detection. Большинство людей предлагает найти максимальное значение БПФ, но это слишком упрощенно и не работает так хорошо, как вы могли бы подумать. Если fundamental is missing (например, литавр) или одна из гармоник больше фундаментальной (например, труба), она не будет определять правильную частоту. Труба спектр:

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

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

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

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

0

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

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

2

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

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

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

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

0

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

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

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

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

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

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

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

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