Определение высоты звука гитары в android

Я пытаюсь разработать гитарную игру на платформе Android.

И мне нужно выполнить определение высоты тона в реальном времени, чтобы получить частоту гитарного аккорда / струны.

Я получаю входной сигнал с микрофона, а затем анализирую вход (вход, играющий на какой гитарной струне / аккорде)

Я нахожу два метода, которые могу использовать: один - ИНЬ, другой - БПФ.

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


person paul9508    schedule 15.01.2017    source источник
comment
Ваш вопрос здесь не к месту. Может быть, спросите здесь: sound.stackexchange.com   -  person Ankur Aggarwal    schedule 15.01.2017
comment
Однозначного ответа на этот вопрос нет - определение высоты тона сложно сделать правильно, и есть много-много методов, которые люди комбинируют, чтобы решить эту проблему. Причина в том, что то, что мы называем высотой тона, например A4, имеет основную частоту на уровне 440 Гц, а также гармоники на уровне 880 (и 220!) Гц и более. Пример с реальными данными: stackoverflow.com/questions/39230595/ В идеале вы могли бы найти Android-библиотеку / SDK, чтобы сделать это за вас.   -  person Ahmed Fasih    schedule 15.01.2017
comment
Я получаю входной сигнал с микрофона, а затем анализирую его (вход, играющий на какой гитарной струне / аккорде). Как я могу это сделать? @ Ахмед Фасих   -  person paul9508    schedule 15.01.2017


Ответы (1)


Сначала вам нужно понять, что такое «pitch» (прочтите ссылку на Википедию ниже). Когда на гитаре или фортепиано делается одна нота, мы слышим не одну частоту звуковой вибрации, а смесь нескольких звуковых колебаний, возникающих на разных математически связанных частотах. Элементы этой совокупности колебаний с разными частотами называются гармониками или частичными. Например, если мы нажмем среднюю клавишу 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).

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

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

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

https://github.com/CreativeDetectors/PitchScope_Player

https://en.wikipedia.org/wiki/Transcription_ (музыка) #Pitch_detection < / а>

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

введите описание изображения здесь

На приведенной ниже диаграмме показан алгоритм определения октавы, который я разработал для выбора правильной ноты Octave-Candidate (то есть правильной основной ноты) после определения ScalePitch для этой ноты. Тем, кто хочет увидеть этот метод в C ++, следует перейти к функции Calc_Best_Octave_Candidate () внутри файла FundCandidCalcer.cpp, который содержится в моем исходном коде на GitHub.

введите описание изображения здесь

person James Paul Millard    schedule 16.01.2017