Я провел много лет, исследуя определение высоты тона полифонической музыки - например, обнаружение нот гитарного соло в записи 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).
Я использую модифицированное логарифмическое преобразование DFT, чтобы сначала обнаружить возможные гармоники путем поиска частот с пиковыми уровнями (см. Диаграмму ниже). Из-за способа, которым я собираю данные для моего модифицированного 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 ++ для моего алгоритма 2 Stage Pitch Detection, могут захотеть начать с функции Estimate_ScalePitch () в файле SPitchCalc.cpp на GitHub.com.
https://github.com/CreativeDetectors/PitchScope_Player
https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection
Ниже приведено изображение логарифмического ДПФ (созданного моим программным обеспечением C ++) в течение 3 секунд гитарного соло на полифонической записи в формате mp3. Это показывает, как гармоники появляются для отдельных нот на гитаре, играя соло. Для каждой ноты в этом логарифмическом ДПФ мы можем видеть его множественные гармоники, проходящие вертикально, потому что каждая гармоника будет иметь одинаковую временную ширину. После того, как октава ноты определена, тогда мы знаем частоту Основного.
Диаграмма ниже демонстрирует алгоритм определения октавы, который я разработал, чтобы выбрать правильную ноту октавы-кандидата (то есть, правильную фундаментальную) после определения ScalePitch для этой ноты. Желающим увидеть этот метод в C ++ следует обратиться к функции Calc_Best_Octave_Candidate () внутри файла с именем FundCandidCalcer.cpp, который содержится в моем исходном коде на GitHub.