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

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

Таким образом, независимо от того, является ли это C4 или C5, они оба должны быть определены как C.

Представьте себе 12 полутонов, расположенных на циферблате, где стрелка указывает на класс высоты тона. Это то, что я после! в идеале я хотел бы иметь возможность определить, является ли спетая нота точечной или слегка выключенной.

Это не дубликат ранее заданных вопросов, поскольку он вводит ограничения, которые:

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

  2. октава не важна, только класс высоты тона

РЕДАКТИРОВАТЬ - Ссылки:
Определение шага в реальном времени
Использование Apple FFT и Accelerate Framework

Ответы [ 9 ]

7 голосов
/ 15 июня 2012

Смотрите мой ответ здесь для получения плавного определения ЧАСТОТЫ: https://stackoverflow.com/a/11042551/1457445

Что касается привязки этой частоты к ближайшей ноте - вот метод, который я создал для своего приложения тюнера:

- (int) snapFreqToMIDI: (float) frequencyy {

    int midiNote = (12*(log10(frequencyy/referenceA)/log10(2)) + 57) + 0.5;
    return midiNote;
}

Это вернет значение ноты MIDI (http://www.phys.unsw.edu.au/jw/notes.html)

Чтобы получить строку из этого значения ноты MIDI:

- (NSString*) midiToString: (int) midiNote {
    NSArray *noteStrings = [[NSArray alloc] initWithObjects:@"C", @"C#", @"D", @"D#", @"E", @"F", @"F#", @"G", @"G#", @"A", @"A#", @"B", nil];
    return [noteStrings objectAtIndex:midiNote%12];
}

Для примера реализации определения высоты тонас выходным сглаживанием, посмотрите на musicianskit.com/developer.php

6 голосов
/ 31 октября 2010

Пек - это человеческое психо-перцептивное явление. Содержание пиковой частоты не совпадает ни с шагом, ни с классом высоты тона. Методы БПФ и ДПФ напрямую не обеспечивают высоту тона, а только частоту. Измерения пересечения нуля также не будут хорошо работать для источников человеческого голоса. Попробуйте AMDF, ASDF, автокорреляционные или кепстральные методы. Есть также много научных работ на тему оценки высоты тона.

Здесь есть еще один длинный список алгоритмов оценки высоты тона .

Отредактированное дополнение: примеры приложений Apple SpeakHere и aurioTouch (доступны в их центре разработки iOS) содержат пример исходного кода для получения образцов блоков PCM с микрофона iPhone.

4 голосов
/ 18 декабря 2015

Большинство алгоритмов определения частоты, приведенных в других ответах, плохо работают для голоса. Чтобы понять, почему это так интуитивно понятно, подумайте, что все гласные на языке можно петь в одной конкретной ноте. Даже если все эти гласные имеют очень разное частотное содержание, все они должны быть обнаружены как одна и та же нота. Любой алгоритм обнаружения нот для голосов должен как-то это учитывать. Кроме того, человеческая речь и песня содержат много фрикативных , многие из которых не имеют скрытой высоты тона.

В общей (не голосовой) функции, которую вы ищете, называется функция цветности , и по этому вопросу имеется довольно большой объем работ. Он также известен как профиль класса гармонических высот . Оригинальным справочным документом по этой концепции является « Распознавание аккордов в реальном времени музыкального звука: система, использующая обычную музыку на Лиспе », написанную Таюкой Фудзисимой. Запись Wikipedia содержит обзор более современного варианта алгоритма. Существует множество бесплатных статей и реализация MATLAB для определения цветности.

Однако, поскольку вы сосредотачиваетесь только на человеческом голосе, и поскольку человеческий голос, естественно, содержит тонны обертонов, в этом конкретном сценарии вы фактически ищете именно алгоритм обнаружения основной частоты , или f0 алгоритм обнаружения . Существует несколько таких алгоритмов , явно настроенных для голоса . Кроме того, - это широко цитируемый алгоритм , который работает с несколькими голосами одновременно. Затем вы сравниваете обнаруженную частоту с равной шкалой и затем находите наиболее близкое соответствие.

Так как я подозреваю, что вы пытаетесь создать детектор и / или корректор основного тона в режиме автонастройки, вы можете использовать превосходную реализацию WORLD М. Мориса, которая позволяет быстро и качественно обнаруживать и модификация f0 для голосовых потоков.

Наконец, имейте в виду, что есть только несколько детекторов вокального тона, которые хорошо работают в регистре вокала. Почти все из них, в том числе WORLD, терпят неудачу на вокале и очень тихих голосах. В ряде статей голосовые фраи называются «скрипучим голосом» и разработаны специальные алгоритмы, специально предназначенные для этого типа голосового ввода.

3 голосов
/ 10 августа 2012

Если вы ищете класс высоты тона, вы должны взглянуть на хроматограмму (http://labrosa.ee.columbia.edu/matlab/chroma-ansyn/)

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

2 голосов
/ 19 ноября 2010

Наконец-то у меня есть закрытие, благодаря этой статье из DSP Dimension

Статья содержит исходный код.

В основном он выполняет БПФ. затем он объясняет, что частоты, которые не совпадают точно с центром корзины, в которую они попадают, будут размывать соседние контейнеры в виде колоколообразной кривой. и он объясняет, как извлечь точную частоту из этих данных во втором проходе (FFT - первый проход).

статья затем идет дальше к сдвигу высоты тона; Я могу просто удалить код.

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

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

2 голосов
/ 31 октября 2010

Размещаем информацию так, как я ее нахожу ...

Алгоритм определения высоты тона в Википедии - хорошее место для начала. В нем перечислены несколько методов, которые не в состоянии определить октаву, что хорошо для моей цели.

Хорошее объяснение автокорреляции можно найти здесь (почему Википедия не может просто так называть ??).

2 голосов
/ 31 октября 2010

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

Вы можете найти существующий код DFT в Objective C, который соответствует вашим потребностям.

1 голос
/ 11 марта 2016

если вы новичок, это может быть очень полезно.Он доступен как на Java, так и на IOS.

dywapitchtrack для ios

dywapitchtrack для Java

1 голос
/ 02 ноября 2010

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

Вам понадобится алгоритм определения высоты звука в реальном времени.При оценке алгоритмов обращайте внимание на задержку каждого алгоритма по сравнению с желаемой точностью.Хотя некоторые алгоритмы лучше, чем другие, по сути, вы должны поменять один на другой и не можете знать оба с уверенностью - что-то вроде принципа неопределенности Гейзенберга.(Как вы можете знать, что нота C4, когда слышна только доля цикла?)

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

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

...