Passei muitos anos pesquisando a detecção de afinação em música polifônica - como detectar as notas de um solo de guitarra em uma gravação em mp3. Também escrevi uma seção na Wikipedia que fornece uma breve descrição do processo (veja a subseção "Detecção de afinação" no link abaixo).
Quando uma única tecla é pressionada em um piano, o que ouvimos não é apenas uma frequência de vibração sonora, mas um composto de múltiplas vibrações sonoras que ocorrem em diferentes frequências matematicamente relacionadas. Os elementos desse composto de vibrações em diferentes frequências são chamados de harmônicos ou parciais. Por exemplo, se pressionarmos a tecla C central no piano, as frequências individuais dos harmônicos do composto começarão em 261,6 Hz como frequência fundamental, 523 Hz seria o segundo harmônico, 785 Hz seria o terceiro harmônico, 1046 Hz seria seja o 4º harmônico, etc. Os harmônicos posteriores são múltiplos inteiros da frequência fundamental, 261,6 Hz (por exemplo: 2 x 261,6 = 523, 3 x 261,6 = 785, 4 x 261,6 = 1046).
Eu uso uma Transformação Logarítmica DFT modificada para detectar primeiro os harmônicos possíveis, procurando frequências com níveis de pico (veja o diagrama abaixo). Devido à maneira como eu coleto dados para o meu Log DFT modificado, NÃO preciso aplicar uma função de janelas ao sinal, nem adicionar e sobrepor . E eu criei o DFT para que seus canais de frequência sejam localizados logaritmicamente, a fim de se alinhar diretamente com as frequências em que os harmônicos são criados pelas notas em um violão, saxofone etc.
Agora, quando estou aposentado, decidi liberar o código-fonte do meu mecanismo de detecção de afinação em um aplicativo de demonstração gratuito chamado PitchScope Player . O PitchScope Player está disponível na Web e você pode fazer o download do executável para Windows para ver meu algoritmo funcionando em um arquivo mp3 de sua escolha. O link abaixo para o GitHub.com levará você ao meu código-fonte completo, onde você poderá ver como eu detecto as harmônicas com uma transformação DFT logarítmica personalizada e, em seguida, procurar parciais (harmônicas) cujas frequências satisfazem o relacionamento inteiro correto que define um ' pitch '.
Meu algoritmo de detecção de afinação é na verdade um processo de duas etapas: a) Primeiro, o ScalePitch é detectado ('ScalePitch' possui 12 valores possíveis de afinação: {E, F, F #, G, G #, A, A #, B, C, C #, D , D #}) b) e depois que o ScalePitch for determinado, a oitava será calculada examinando todos os harmônicos para as 4 possíveis notas de oitava-candidato possíveis. O algoritmo foi projetado para detectar o tom mais dominante (uma nota musical) a qualquer momento dentro de um arquivo MP3 polifônico. Isso geralmente corresponde às notas de um solo instrumental. Os interessados no código-fonte C ++ do meu algoritmo de detecção de afinação em 2 estágios podem querer iniciar na função Estimate_ScalePitch () dentro do arquivo SPitchCalc.cpp no GitHub.com.
https://github.com/CreativeDetectors/PitchScope_Player
https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection
Abaixo está a imagem de um DFT logarítmico (criado pelo meu software C ++) por 3 segundos de um solo de guitarra em uma gravação mp3 polifônica. Mostra como os harmônicos aparecem para notas individuais em um violão, enquanto toca um solo. Para cada nota neste DFT logarítmico, podemos ver seus múltiplos harmônicos se estendendo verticalmente, porque cada harmônico terá a mesma largura de tempo. Depois que a oitava da nota é determinada, sabemos a frequência do fundamental.
O diagrama abaixo demonstra o algoritmo de detecção de oitava que eu desenvolvi para escolher a nota correta de candidato a oitava (isto é, o fundamental correto), depois que o ScalePitch para essa nota tiver sido determinado. Aqueles que desejam ver esse método em C ++ devem acessar a função Calc_Best_Octave_Candidate () dentro do arquivo chamado FundCandidCalcer.cpp, que está contido no meu código-fonte no GitHub.