Вы должны сначала понять, что на самом деле означает « 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, мне не нужно применять функцию Windowing к сигналу, а также добавлять и перекрывать друг друга. И я создал 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
https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection