Octave Detection может быть очень сложным, особенно для полифонического сигнала, в котором отсутствуют основные гармоники и / или другие гармоники .Предполагая, что вы правильно определяете «высоту тона», а не только «гармоники» (см. Ссылку на Википедию ниже), вы можете использовать разработанный мной алгоритм определения октавы.
Чтобы выполнить определение высоты тона для PitchScope Player,Я выбрал двухэтапный алгоритм, который работает следующим образом: a) Сначала определяется нота ScalePitch - «ScalePitch» имеет 12 возможных значений высоты тона: {E, F, F #, G, G #, A, A #, B,C, C #, D, D #}.И после того, как ScalePitch и Time-Width ноты определены, б) тогда октава (фундаментальная) этой ноты рассчитывается путем изучения ВСЕХ гармоник 4 возможных нот октавы-кандидата.
Полный исходный код C ++ и исполняемый файл для моего приложения PitchScope Player для определения высоты звука находятся на GitHub (ссылка ниже), и вы можете скомпилировать и просмотреть его, чтобы увидеть, как работает мой алгоритм обнаружения октавы.
Вы хотели бы сосредоточиться на функции FundCandidCalcer :: Calc_Best_Octave_Candidate () в файле FundCandidCalcer.cpp, чтобы увидеть этот алгоритм в C ++.Диаграмма ниже также дает приблизительное представление о том, как рассчитать октаву.
https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection
https://github.com/CreativeDetectors/PitchScope_Player
На диаграмме ниже показан алгоритм обнаружения октав, который я разработал длявыберите правильную ноту Октавы-Кандидата (то есть правильную Фундаментальную), как только будет определен ScalePitch для этой ноты.