Estou trabalhando em um aplicativo Web simples que permite ao usuário afinar seu violão. Sou um iniciante no processamento de sinais, por isso não julgue demais se minha pergunta for inadequada.
Então, eu consegui obter a frequência fundamental usando um algoritmo FFT e, nesse ponto, o aplicativo é de alguma forma funcional. No entanto, há espaço para melhorias, agora eu envio pcm bruto para o algoritmo FFT, mas eu estava pensando que talvez haja alguns algoritmos / filtros anteriores / posteriores que possam melhorar a detecção. Você pode sugerir alguma?
Meu principal problema é que, quando detecta uma determinada frequência, ela mostra essa frequência por 1-2s e depois pula para outras frequências aleatórias e volta novamente e assim por diante, mesmo que o som seja contínuo.
Também estou interessado em qualquer outro tipo de otimização, se alguém tiver experiência com essas coisas.
fonte
O tom não é o mesmo que o compartimento de frequência de magnitude máxima de uma FFT. A afinação é um fenômeno psicoacústico humano. O som da afinação pode ter um elemento fundamental ausente ou muito fraco (comum em alguns sons de voz, piano e guitarra) e / ou muitas conotações poderosas em seu espectro que sobrecarregam a frequência da afinação (mas ainda podem ser ouvidas como nota de afinação por um ser humano) . Portanto, qualquer detector de frequência de pico da FFT (mesmo incluindo algumas janelas e interpolação) não será um método robusto de estimativa de afinação.
Essa questão de stackoverflow inclui uma lista de alguns métodos alternativos de estimativa de pitch que podem produzir melhores resultados.
ADICIONADO: Se você estiver fazendo isso com sons de guitarra, observe que as cordas mais baixas da guitarra podem realmente produzir conotações levemente inarmônicas, dificultando ainda mais a estimativa de afinação, pois o ouvido humano pode ouvir uma frequência de afinação mais intimamente relacionada aos sub múltiplos da harmônica. , em vez da frequência de vibração fundamental real da corda.
ADICIONADO # 2: Isso é perguntado com tanta frequência que escrevi um post mais longo sobre o assunto: http://www.musingpaw.com/2012/04/musical-pitch-is-not-just-fft-frequency.html
fonte
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.
fonte