Обнаружение шага в реальном времени - PullRequest
25 голосов
/ 30 августа 2009

Я пытаюсь определить в реальном времени высоту тона поющих пользователей, но у меня много проблем. Я перепробовал множество методов, включая FFT ( FFT Problem (возвращает случайные результаты) ) и автокорреляцию ( Автокорреляционное определение высоты тона возвращает случайные результаты с микрофонным входом ), но я не могу похоже, есть какие-то методы, чтобы дать хороший результат. Кто-нибудь может предложить метод для отслеживания основного тона в реальном времени или как улучшить метод, который у меня уже есть? Я не могу найти какие-либо хорошие методы C / C ++ для определения высоты тона в реальном времени.

Спасибо

Найл.

Редактировать: Просто чтобы заметить, я проверил, что входные данные микрофона правильные, и что при использовании синусоидальной волны результаты более или менее правильные.

Редактировать: Извините, что уже поздно, но в данный момент я визуализирую автоколлацию, вынимая значения из массива результатов и каждого индекса, и нанося на график индекс по оси X и значение по оси Y (оба делятся на 100000 или около того, и я использую OpenGL), подключение данных к хосту VST и использование плагинов VST не вариант для меня. На данный момент это выглядит как случайные точки. Правильно ли я делаю это, или не могли бы вы указать мне на какой-то код для этого или помочь мне понять, как визуализировать необработанные аудиоданные и данные автокорреляции.

Ответы [ 10 ]

31 голосов
/ 30 августа 2009

Делая шаг назад ... Чтобы это сработало, вы ДОЛЖНЫ найти способ наметить промежуточные шаги этого процесса. То, что вы пытаетесь сделать, не особенно сложно, но это подвержено ошибкам и рискованно. Отсечение, управление окнами, плохая разводка, псевдонимы, смещение постоянного тока, чтение неправильных каналов, странная ось частоты БПФ, несоответствие импеданса, ошибки размера кадра ... кто знает. Но если вы сможете построить исходные данные, а затем построить БПФ, все станет ясно.

19 голосов
/ 09 сентября 2011

Я нашел несколько реализаций с открытым исходным кодом для отслеживания высоты тона в реальном времени

Существуют также некоторые трекеры высоты тона, которые, возможно, не предназначены для реального времени, но могут быть использованы таким образом, насколько я знаю, и также могут быть полезны в качестве справки для сравнения вашего трекера в реальном времени с: 1023 *

  • Praat - пакет с открытым исходным кодом, иногда используемый лингвистами для извлечения высоты тона, и вы можете найти алгоритм, задокументированный в http://www.fon.hum.uva.nl/paul/praat.html

  • Snack и WaveSurfer также содержат экстрактор смолы

7 голосов
/ 24 января 2015

Я знаю, что этот ответ не сделает всех счастливыми, но здесь идет.

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

https://www.coursera.org/course/audio на данный момент курс не работает, но видео все еще доступны.

http://miracle.otago.ac.nz/tartini/papers/Philip_McLeod_PhD.pdf тезис о разработке алгоритма распознавания высоты звука.

http://dsp.stackexchange.com целый сайт, посвященный цифровой обработке сигналов.

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

Далее идут тестовые данные и тестирование. Напишите себе библиотеку, которая генерирует тестовые файлы для использования при проверке вашего алгоритма / ов.

1) Супер простой генератор чистых синусоидальных волн. Допустим, вы смотрите на запись YAT (все еще другого тюнера), а затем с помощью генератора синуса создаете серию файлов с частотой около 440 Гц, например, с 420–460 Гц с различными приращениями, и видите, насколько чувствительным и точным является ваш код. Можно ли разрешить с точностью до 5 Гц, 1 Гц, еще лучше?

2) Затем обновите ваш генератор синусоидальных волн, чтобы он добавил серию более слабых гармоник к сигналу.

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

4) Внесите некоторое преднамеренное искажение, смещая пиковые частоты гармоник вверх и вниз нерегулярным образом

Дело в том, что если вы создаете файлы с известными результатами, то легче проверить, что то, что вы создаете, действительно работает, конечно же, с ошибками.

Существует также ряд «библиотек», содержащих звуковые образцы. https://freesound.org из серии Coursera, упомянутой выше. http://theremin.music.uiowa.edu/MIS.html

Далее следует помнить, что ваш микрофон не идеален, и если вы не потратили на него тысячи долларов, он будет иметь довольно изменяемый диапазон частотных характеристик. В частности, если вы работаете с низкими нотами, тогда более дешевые микрофоны, считайте встроенные на вашем ПК или телефоне, имеют значительный спад, начиная с 80-100 Гц. Для достаточно хороших внешних вы можете снизить частоту до 30-40 Гц. Найдите данные на вашем микрофоне.

Вы также можете проверить, что происходит, проиграв тональный сигнал через динамики, а затем записав на свой любимый микрофон. Но, конечно, сейчас мы говорим о 2 наборах частотных характеристик.

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

Прежде всего, не сдавайтесь после первых нескольких попыток. Удачи.

5 голосов
/ 30 июля 2016

Вот исходный код C ++ для необычного двухэтапного алгоритма, который я разработал, который может распознавать высоту в реальном времени полифонических файлов MP3 во время воспроизведения в Windows. Это бесплатное приложение ( PitchScope Player , доступное в Интернете) часто используется для обнаружения нот гитары или саксофона в записи MP3. Алгоритм предназначен для обнаружения наиболее доминирующего тона (музыкальной ноты) в любой момент времени в музыкальном файле MP3. Начало нот точно определено значительным изменением наиболее доминирующей высоты (музыкальной ноты) в любой момент во время записи MP3.

Когда на пианино нажимается одна клавиша, мы слышим не только одну частоту звуковых колебаний, но композит множества звуковых колебаний, возникающих на разных математически связанных частотах. Элементы этого комплекса колебаний на разных частотах называются гармониками или частями. Например, если мы нажмем среднюю клавишу C на фортепиано, отдельные частоты гармоник композита начнутся с 261,6 Гц в качестве основной частоты, 523 Гц будет 2-й гармоникой, 785 Гц будет 3-й гармоникой, 1046 Гц будет 4-я гармоника и т. д. Более поздние гармоники представляют собой целые кратные основной частоты, 261,6 Гц (например: 2 x 261,6 = 523, 3 x 261,6 = 785, 4 x 261,6 = 1046). Внизу прикреплен снимок фактических гармоник , которые происходят во время полифонической записи MP3 соло на гитаре.

Вместо БПФ я использую модифицированное преобразование ДПФ с логарифмическим разносом частот, чтобы сначала обнаружить эти возможные гармоники путем поиска частот с пиковыми уровнями (см. Диаграмму ниже). Из-за способа, которым я собираю данные для моего модифицированного Log DFT, мне не нужно применять функцию Windowing к сигналу, а также добавлять и перекрывать друг друга. И я создал DFT так, чтобы его частотные каналы были логарифмически расположены, чтобы выровнять их по частоте, где гармоники создаются нотами на гитаре, саксофоне и т. Д.

Сейчас, когда я вышел на пенсию, я решил выпустить исходный код для моего механизма определения высоты звука в бесплатном демонстрационном приложении под названием PitchScope Player . PitchScope Player доступен в Интернете, и вы можете загрузить исполняемый файл для Windows, чтобы увидеть мой алгоритм в работе над выбранным вами mp3-файлом. Приведенная ниже ссылка на GitHub.com приведет вас к моему полному исходному коду, где вы сможете увидеть, как я обнаруживаю гармоники с помощью пользовательского логарифмического преобразования DFT, а затем искать частичные (гармоники), частоты которых удовлетворяют правильному целочисленному соотношению, которое определяет ' шаг».

Мой алгоритм обнаружения высоты тона фактически является двухэтапным процессом: a) Сначала обнаруживается ScalePitch (ScalePitch имеет 12 возможных значений высоты тона: {E, F, F #, G, G #, A , A #, B, C, C #, D, D #}) b) и после определения ScalePitch вычисляется Октава путем изучения всех гармоник для 4 возможных нот Октавы-Кандидата. Алгоритм предназначен для обнаружения наиболее доминирующего тона (музыкальной ноты) в любой данный момент времени в полифоническом файле MP3. Это обычно соответствует нотам инструментального соло. Те, кто интересуется исходным кодом C ++ для моего двухэтапного алгоритма определения высоты тона, могут захотеть начать с функции Estimate_ScalePitch () в файле SPitchCalc.cpp на GitHub.com. https://github.com/CreativeDetectors/PitchScope_Player

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

enter image description here

5 голосов
/ 30 августа 2009

У меня была похожая проблема с микрофонным входом в проекте, который я делал несколько лет назад - оказалось, из-за смещения постоянного тока.

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

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

Графики - лучший способ диагностировать большинство проблем со звуком.

2 голосов
/ 17 января 2012

Java-код для реального детектора реального времени доступен по адресу http://code.google.com/p/freqazoid/.

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

2 голосов
/ 02 сентября 2010

Взгляните на этот пример приложения:

http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx

Я понимаю, что приложение на C #, и вам нужен C ++, и я понимаю, что это .Net / Windows, и вы на Mac ... Но я подумал, что его реализация FFT может быть отправной точкой. Попробуйте сравнить вашу реализацию FFT с его. (Это итеративная, первая версия БПФ Кули-Тьюки). Они похожи?

Кроме того, «случайное» поведение, которое вы описываете, может быть связано с тем, что вы получаете данные, возвращаемые вашей звуковой картой напрямую, без правильной сборки значений из массива байтов. Вы просили свою звуковую карту сэмплировать 16-битные значения, а затем дали ей байтовый массив для хранения значений? Если это так, помните, что два последовательных байта в возвращенном массиве составляют один 16-битный аудиосэмпл.

2 голосов
/ 10 декабря 2009

Проверьте aubio и библиотеку с открытым исходным кодом, которая включает несколько современных методов для отслеживания высоты тона.

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

Я задавал подобный вопрос здесь:

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

РЕДАКТИРОВАТЬ:

Performous содержит модуль C ++ для определения высоты тона в реальном времени

Также Инь Алгоритм отслеживания высоты тона

0 голосов
/ 30 августа 2009

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

...