Обнаружение шага в реальном времени
Я пытаюсь определить в реальном времени высоту звука поющих пользователей, но у меня много проблем. Я перепробовал множество методов, включая FFT ( проблема FFT (возвращает случайные результаты)) и автокорреляцию ( автокорреляционное определение высоты тона возвращает случайные результаты с микрофонным входом), но я не могу найти какие-либо методы, которые бы дали хороший результат. Кто-нибудь может предложить метод для отслеживания основного тона в реальном времени или как улучшить метод, который у меня уже есть? Я не могу найти хорошие методы C / C++ для определения высоты тона в реальном времени.
Спасибо,
Найл.
Редактировать: просто чтобы заметить, я проверил, что входные данные микрофона правильные, и что при использовании синусоиды результаты более или менее правильного шага.
Редактировать: Извините, что уже поздно, но в данный момент я визуализирую автоколлацию путем извлечения значений из массива результатов и каждого индекса и построения индекса по оси X и значения по оси Y (оба делятся на 100000 или около того, и я использую OpenGL), подключение данных к хосту VST и использование плагинов VST не вариант для меня. На данный момент это выглядит как случайные точки. Правильно ли я делаю это, или вы можете направить мне торрент некоторый код для этого или помочь мне понять, как визуализировать необработанные аудиоданные и данные автокорреляции.
12 ответов
Делая шаг назад... Чтобы это сработало, вы ДОЛЖНЫ найти способ наметить промежуточные шаги этого процесса. То, что вы пытаетесь сделать, не особенно сложно, но это подвержено ошибкам и рискованно. Отсечение, управление окнами, плохая разводка, псевдонимы, смещения постоянного тока, чтение неправильных каналов, странная частота FFT, несоответствия импеданса, ошибки размера кадра... кто знает. Но если вы сможете построить исходные данные, а затем построить БПФ, все станет ясно.
Я нашел несколько реализаций с открытым исходным кодом для отслеживания высоты тона в реальном времени
Dywapitchtrack использует вейвлет-алгоритм
Realtime C# Pitch Tracker использует модифицированный подход автокорреляции
aubio (упомянуто piem; доступно несколько алгоритмов)
Есть также некоторые трекеры высоты тона, которые могут быть не предназначены для работы в режиме реального времени, но могут быть использованы таким образом, насколько я знаю, и также могут быть полезны в качестве справочного материала для сравнения вашего трекера в реальном времени с:
Praat - это пакет с открытым исходным кодом, иногда используемый лингвистами для извлечения высоты тона, и вы можете найти алгоритм, документированный по адресу http://www.fon.hum.uva.nl/paul/praat.html
Snack и WaveSurfer также содержат экстрактор смолы
Я знаю, что этот ответ не сделает всех счастливыми, но здесь идет.
Это сложно, очень сложно. Во-первых, прочитайте как можно больше учебников по БПФ, автокорреляции, вейвлетам. Хотя я все еще борюсь с 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 наборах частотных характеристик.
Когда дело доходит до производительности, существует множество свободно доступных библиотек, хотя имейте в виду различные модели лицензирования.
Прежде всего, не сдавайтесь после первых нескольких попыток. Удачи.
Вот исходный код 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. Он показывает, как появляются гармоники для отдельных нот на гитаре во время исполнения соло. Для каждой ноты в этом логарифмическом ДПФ мы можем видеть его множественные гармоники, проходящие вертикально, потому что каждая гармоника будет иметь одинаковую временную ширину. После того как октава ноты определена, тогда мы знаем частоту Основного.
У меня была похожая проблема с микрофонным входом в проекте, который я делал несколько лет назад - оказалось, из-за смещения постоянного тока.
Убедитесь, что вы удалили любое смещение, прежде чем пытаться использовать БПФ или любой другой метод, который вы используете.
Также возможно, что вы столкнулись с проблемой запаса высоты или отсечения.
Графики - лучший способ диагностировать большинство проблем со звуком.
Проверьте aubio и библиотеку с открытым исходным кодом, которая включает в себя несколько современных методов для отслеживания высоты тона.
Взгляните на этот пример приложения:
http://www.codeproject.com/KB/audio-video/SoundCatcher.aspx
Я понимаю, что приложение на C#, а вам нужен C++, и я понимаю, что это.Net/Windows, и вы на Mac... Но я подумал, что его реализация FFT может быть отправной точкой. Попробуйте сравнить вашу реализацию FFT с его. (Это итерационная, первая версия БПФ Кули-Тьюки). Они похожи?
Кроме того, "случайное" поведение, которое вы описываете, может быть связано с тем, что вы получаете данные, возвращаемые вашей звуковой картой напрямую, без правильной сборки значений из байтового массива. Вы просили свою звуковую карту сэмплировать 16-битные значения, а затем дали ей байтовый массив для хранения значений? Если это так, помните, что два последовательных байта в возвращенном массиве составляют один 16-битный аудиосэмпл.
Java-код для реального детектора реального времени доступен по адресу http://code.google.com/p/freqazoid/.
Он работает довольно хорошо на любом компьютере, работающем в режиме реального времени Java в режиме реального времени. Проект был отброшен и может быть забран любой заинтересованной стороной. Свяжитесь со мной, если вы хотите получить более подробную информацию.
Вы можете определить высоту звука в реальном времени, будь то голос певца, с помощью TarsosDSPhttps://github.com/JorenSix/TarsosDSP на всякий случай, если кто-то еще не слышал об этом :-)
Я задал похожий вопрос здесь:
РЕДАКТИРОВАТЬ:
Performous содержит модуль C++ для определения высоты звука в реальном времени
Также алгоритм отслеживания подачи Инь
Вот несколько библиотек с открытым исходным кодом, которые реализуют определение высоты тона:
- МИР: набор инструментов для анализа / синтеза речи. Это особенно удобно, если источником сигнала является голос.
- aubio: библиотека для извлечения аудиофайлов. Реализует множество алгоритмов определения высоты тона.
- Обнаружение высоты тона: набор алгоритмов определения высоты звука, реализованных на C++.
- dywapitchtrack: высококачественный алгоритм определения высоты тона.
- ИНЬ: еще одна реализация алгоритма ИНЬ в одном исходном файле на C++.
Вы можете адаптировать что-нибудь из инструментальных тюнеров? Мой восхитительно компактный гитарный тюнер способен хорошо определять высоту струн. Я вижу эту ссылку на настройщик фортепиано, который в некоторой степени объясняет алгоритм.