Обнаружение в реальном времени человеческого тона

11

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

Я сталкивался с множеством тем, задающих один и тот же вопрос, но я все еще не закончил с ним, вероятно, из-за недостатка опыта в этой области и мелкого математического фона. Я реализовал алгоритм, основанный на статье изменения высоты тона на сайте DSPDimension: http://www.dspdimension.com/admin/pitch-shifting-using-the-ft/

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

Заранее спасибо,

РЕДАКТИРОВАТЬ: я забыл упомянуть, что меня интересует только класс тона, так что это нормально, если основной отсутствует, но у меня есть сильный обертон в образце.

EDIT2: Спасибо всем, я только что закончил версию алгоритма, которая работает как шарм. Проблема оценки низкого шага была из-за моего входного теста. Когда я пел ноту, она соответствовала правильно. Кроме того, сейчас я рассматриваю все гармоники, а не только самый высокий пик.

Фелипе Лира
источник
Википедия имеет некоторую информацию.
Эмре

Ответы:

9

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

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

http://www.phon.ucl.ac.uk/courses/spsci/matlab/lect10.html

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

эндолиты
источник
Вы правы, я забыл упомянуть, что меня интересует только поле класса. Я использую этот веб-сайт для тестирования своего инструмента: sevenhstring.com/tuningfork/tuningfork.html . Для входа A (220 Гц) возвращается E (660 Гц) в качестве найденного класса высоты звука. Я посмотрел на спректум и 220 Гц действительно есть, но с меньшей величиной, чем 660 Гц. После отфильтровывания значений ниже минимальной амплитуды и предельных частот в моем желаемом диапазоне полученная из этого прямая кишка имеет 4 пика. [пик, mag] = [220, 0,0203], [618, 0,0142], [660, 0,0668], [703, 0,0497].
Фелипе Лира,
Я просто заставил меня задуматься о том, что, возможно, мне следует учитывать сдвиг фаз при вычислении величины, точно так же, как я делаю, чтобы получить истинную частоту. Имеет ли это смысл? Я имею в виду, что если бы для бункера смещение фазы составляло примерно 90º, то «пик» был бы на уровне 0, не так ли?
Фелипе Лира
@elipedrl: То есть вы пишете гитарный тюнер. :) Как я понимаю, они используют фильтр нижних частот для очистки формы волны, а затем подсчитывают пики, чтобы получить высоту тона. electronicdesign.com/article/articles/... aboutmicrocontroller.blogspot.com/2008/04/... Есть более эффективные способы, хотя, если вы собираетесь на точность , а не дешевизна gist.github.com/255291
эндолиты
@elipedrl: Смещение фазы для ячейки не должно зависеть от шага. Каждая ячейка представляет собой комплексное число, и вас интересует абсолютное значение или величина этого числа. en.wikipedia.org/wiki/Absolute_value#Complex_numbers
эндолит
1
и если по какой-то причине у вас есть 2 более коротких БПФ (задержка, кванты времени и т. д.), вычисление фазового вокодера является меньшим вычислением, чем выполнение еще одного более длинного БПФ и интерполяция этого.
hotpaw2
6

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

Вот один из них: /programming/4227420/matlab-missing-fundamental-from-an-fft/4231322#4231322 и другой: Советы по улучшению обнаружения основного тона.

ДОБАВЛЕНО № 1: Вопросы, подобные этому, задают так часто, что я написал более длинное сообщение в блоге на эту тему: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft- frequency.html

hotpaw2
источник
Я обновил вопрос информацией о том, что меня интересует только поле. Я действительно надеюсь, что для этого достаточно БПФ с постобработкой, я сильно отстаю от графика и изменение подхода будет ужасным для меня.
Фелипе Лира
@elipedrl: БПФ должен работать тогда. Получение нескольких пиков и затем умный выбор одного из них должно быть достаточно хорошим. Помните, что действительные пики будут близки (но не точно) к целочисленным кратным основного, в то время как ложные пики не будут. Вы должны избегать выбора ложных пиков и избегать выбора 3-й гармоники и т. Д., Которые находятся не на октаву от ноты, которую вы ищете.
Эндолит
Возможно, хотя и маловероятно, что никакой пик частоты не будет на частоте музыкального тона. Некоторые мужские гласные могут быть близки к этому, только высокие обертоны остаются после фильтрации по формуле гласных.
hotpaw2
Метод Гармонического спектра продуктов может быть пригоден для нахождения оценки наименьшего общего знаменателя на ЖК-дисплее группы спектральных пиков путем последующей обработки первоначальных результатов БПФ.
hotpaw2