Dicas para melhorar a detecção de afinação

21

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.

Valentin Radu
fonte

Respostas:

20

Eu estou supondo que as outras frequências que ele recebe são harmônicas do fundamental? Como se você estivesse tocando 100 Hz e captasse 200 Hz ou 300 Hz? Primeiro, você deve limitar seu espaço de pesquisa às frequências que uma guitarra provavelmente terá. Encontre o fundamento mais alto que você provavelmente precisará e limite a isso.

A autocorrelação funcionará melhor que a FFT para encontrar o fundamental, se o fundamental for menor em amplitude do que os harmônicos (ou faltando completamente, mas isso não é um problema com o violão):

insira a descrição da imagem aqui

Você também pode tentar ponderar as frequências mais baixas para enfatizar os harmônicos fundamentais e minimizar, ou usar um algoritmo de pico de seleção como esse e escolher a frequência mais baixa.

Além disso, você deve exibir seu sinal antes de aplicar a FFT. Você apenas o multiplica por uma função de janela , que afunila o início e o fim da forma de onda para tornar o espectro de frequências mais limpo. Então você obtém picos altos e estreitos para componentes de frequência em vez de amplos.

Você também pode usar a interpolação para obter um pico mais preciso. Pegue o log do espectro, encaixe uma parábola no pico e nos dois pontos vizinhos e encontre o verdadeiro pico da parábola. Você pode não precisar de tanta precisão, no entanto.

Aqui está o meu exemplo de código Python para tudo isso .

endólito
fonte
Era isso que eu estava procurando, resposta muito boa, obrigado!
Valentin Radu
2
Multiplicar por uma função de janela que é afilada, na verdade, mancha as linhas espectrais do seu sinal, tornando-as mais amplas. O que ele pode comprar, no entanto, é o alcance dinâmico, permitindo identificar, por exemplo, uma linha espectral de potência muito baixa na presença de um tom interferente de alta potência.
Jason R
@JasonR Considerando que isso foi projetado para funcionar em um ambiente em que a probabilidade de tons interferentes de alta potência é realmente baixa, você sugere que é melhor não usar uma janela Hamming?
Valentin Radu
1
Posso confirmar que usar uma janela de Hamming me aproximou do meu objetivo de manter as leituras estáveis. No momento, quando jogo A4, recebo 440 Hz na maioria das vezes e apenas muito raro, leio de perto como 650 Hz. Eu estou supondo que esses são harmônicos? Além disso, não pude deixar de notar que, para uma frequência mais alta, o aplicativo funciona sem falhas e, para um baixo, começa a falhar. Provavelmente porque estou usando o FTT para detectar o compartimento de frequência de magnitude máxima e para frequências mais baixas isso nem sempre é fundamental?
Valentin Radu
1
@mindnoise: 660 Hz não é um harmônico de 440 Hz, mas é um harmônico de 220 Hz, ou um quinto perfeito acima de 440. Poderia haver outra corda ressonante ou distorção ou algo assim? É muito mais fácil descobrir questões como essa se você pode traçar a FFT e examiná-la. Sim, as frequências baixas podem ser filtradas e reduzidas em relação às mais altas, por efeitos mecânicos ou pelos circuitos analógicos.
endolith
12

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

hotpaw2
fonte
acabou de visitar (e comentar) o blog ao qual você acabou de nos referir.
22816 Robert De Bristow-johnson
5

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.

insira a descrição da imagem aqui

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.

insira a descrição da imagem aqui

James Paul Millard
fonte
James, o seu detector de pitch DFT detecta notas faltando (ou fracas) fundamentais?
Robert Bristow-johnson
Sim, meu algoritmo de detecção de afinação em 2 estágios detectará notas, mesmo se o sinal tiver um "fundamento ausente (ou fraco)" - essa é uma grande força desse processo em duas etapas. O fundamental é determinado no segundo estágio, quando a detecção de oitavas é realizada nas larguras de tempo que você vê para obter notas no diagrama DFT logarítmico. Como essa função de detecção de afinação funciona dentro da confusão de um sinal mp3 polifônico, ele detectará notas que estão faltando muitos harmônicos, incluindo o fundamental. Acabei de adicionar a esta resposta um segundo diagrama que explica meu algoritmo de detecção de oitavas.
James Paul Millard