Preciso detectar o tom (medir a frequência do sinal) enquanto os músicos tocam, avisando se estão desafinados, mas a música é um pouco rápida demais para a FFT (Fast Fourier Transform).
Abaixo, tento fornecer uma descrição técnica do problema.
Músicos tocam música entre 90 e 140 bpm. Isso significa que existem 90-140 grupos de notas a cada minuto, até 8 (mais frequentemente, até 4) notas em cada grupo (60/140/8 = 0,0536 seg, 60/90/4 = 0,167 seg), que ou seja, as notas podem mudar na taxa de 6 a 19 notas por segundo.
A música usa uma escala logarítmica (veja a imagem em anexo): o intervalo entre, digamos, 440Hz e 880Hz é dividido em 12 notas, das quais apenas 7 são usadas para melodia. (Basicamente, eles usam apenas as teclas brancas do piano; quando desejam alterar a frequência inicial, usam algumas das teclas pretas e não usam algumas teclas brancas.) Ou seja, a frequência de cada nota seguinte é multiplicada por 2 ^ (1/12) = 1,05946.
Para tornar as coisas mais complicadas, a frequência A (La) pode variar de 438 a 446 Hz. Os instrumentos de corda em teoria podem ser afinados, enquanto os instrumentos de sopro dependem da temperatura e umidade do ar, de modo que a frequência é renegociada pelos músicos durante a verificação do som.
Às vezes, músicos e vocalistas cometem erros na frequência, eles chamam de "desafinado". Eles querem um dispositivo que os informe sobre esses "erros de sintonia". Eles têm sintonizadores, mas eles precisam tocar o mesmo som por cerca de 1 segundo antes de começar a mostrar qualquer coisa. Isso funciona para o ajuste, mas não funciona enquanto a música é tocada.
Provavelmente, o sintonizador está fazendo FFT e, devido à fórmula aguarda 1 segundo para obter a resolução de 1Hz.
Para A = 440Hz, a diferença de frequência entre duas notas é 440 * 0,05946 = 26,16 Hz, para obter essa resolução de frequência, é necessário usar o tempo de aquisição de 0,038 seg, ou seja, no andamento = 196bpm, a FFT é capaz de distinguir apenas duas observa que, a 98 bpm, é capaz de detectar um erro desafinado de 50%, desde que inicie a aquisição no momento exato em que o tom muda. Se permitirmos a mudança de tom no decorrer de um período de aquisição, obteremos 49 bpm, o que é muito lento. Além disso, é muito desejável ser mais preciso quanto à frequência, digamos, detectar um erro desafinado de 25% ou 12%.
Existe uma maneira de medir a frequência (detectar tom) melhor que a FFT, ou seja, com melhor resolução em menos tempo de aquisição? (Pelo menos 2 vezes melhor, idealmente, 8 a 16 vezes melhor.) Em troca, não preciso distinguir entre notas de oitavas diferentes, por exemplo, 440 e 880 podem ser reconhecidas como A. Não preciso da linearidade da FFT saída, uma escala logarítmica seria melhor. (Provavelmente, são possíveis mais trocas, apenas nada mais vem à minha mente no momento.)
Aqui está um desenho muito bom: