Estou trabalhando em um programa de afinação de piano e parte dele requer detecção de afinação em tempo real. Aqui está o esquema que tenho até agora, que funciona até certo ponto, mas provavelmente poderia usar algum refinamento.
Estou capturando áudio PCM mono, 44,1kHz, 16 bits em pedaços de 2 ^ 14 amostras. Combino as 4 últimas amostras em um buffer de 2 ^ 16 comprimentos, aplico uma janela Hann ao buffer e execute uma FFT nele. Depois, agrupo os resultados da FFT em duas resoluções. Primeiro, agrupo em 200 buckets e, em seguida, corro o algoritmo de detecção de pitch HPS nessa granularidade. Não preciso ter uma frequência exata aqui, só quero chegar perto. Então, eu faço o bucket em 12000 buckets, o que me dá 1 centavo de resolução de 10Hz a 10kHz. Depois que conheço uma frequência aproximada do algoritmo HPS de 200 bin, procuro um pico no intervalo da caixa de 12000 bin para obter uma frequência mais exata.
Isso parece funcionar bem para as notas no meio do teclado. O que acontece com as notas baixas é de cerca de 1,5s de identificação incorreta da nota, como geralmente a 2ª ou a 3ª parcial da nota real e, em seguida, uma identificação correta da nota.
Em todas as parcelas espectrais que criei para ver o que está acontecendo, há mais largura nos picos que eu esperaria. Essa largura é visualmente um tanto consistente da caixa de 200 a 12000 caixas. Eu esperava que os picos fossem mais estreitos no estojo de 200 caixas.
Portanto, o processamento de sinal é novo para mim; portanto, pode haver problemas que eu não gostaria de perguntar, mas em termos de perguntas específicas, os tamanhos das amostras são suficientes para esta tarefa? Hann é a escolha certa da janela? Devo suavizar os dados também antes da FFT? Qual é a sensibilidade do HPS ao número de compartimentos? Eu estava pensando que, se eu usasse muitas caixas, a desarmonicidade talvez não fizesse as partes parciais se sobreporem aos seus fundamentos com a abordagem simples do algoritmo HPS de dividir por 2, 3, 4, etc.