Библиотека.NET для идентификации [закрытых] передач

TracExplorer прохладен для интеграции Trac с VS.

28
задан Community 19 November 2012 в 02:36
поделиться

12 ответов

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

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

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

20
ответ дан 28 November 2019 в 03:06
поделиться

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

1
ответ дан 28 November 2019 в 03:06
поделиться

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

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

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

2
ответ дан 28 November 2019 в 03:06
поделиться

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

1
ответ дан 28 November 2019 в 03:06
поделиться

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

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

3
ответ дан 28 November 2019 в 03:06
поделиться

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

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

3
ответ дан 28 November 2019 в 03:06
поделиться

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

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

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

4
ответ дан 28 November 2019 в 03:06
поделиться

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

7
ответ дан 28 November 2019 в 03:06
поделиться

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

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

2
ответ дан 28 November 2019 в 03:06
поделиться

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

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

0
ответ дан 28 November 2019 в 03:06
поделиться

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

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

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

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

8
ответ дан 28 November 2019 в 03:06
поделиться

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

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

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

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

2
ответ дан 28 November 2019 в 03:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: