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:
fonte
Respostas:
" 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? "
sim existe. ou são. existem várias maneiras melhores de realizar a detecção de afinação musical em tempo real que são muito, muito melhores do que executar uma FFT.
considere :
Função de diferença de magnitude média (AMDF)
Função de diferença quadrática média (ASDF)
Função de autocorrelação (AF)
note que estou jogando rápido e sem limites com os limites da soma.
observe também que não existem suposições sobre o formato da forma de onda ou cruzamentos de zero ou outros cruzamentos de limite. a única suposição é que quando o atrasok é aproximadamente um período (ou dois períodos ou algum outro múltiplo inteiro da duração do período), x [ n ] parece muito x [ n - k ] . portanto, a única suposição é que o tom está relacionado à frequência fundamental de uma função periódica ou quase periódica (o que eu gosto de chamar de "quase periódico").
o meu favorito é o ASDF (e esse é um segredo comercial velado de forma discreta que acabei de anunciar a todos, mas o pessoal do comp.dsp já sabia disso). No domínio do tempo, o AMDF e o ASDF parecem muito semelhantes e o ASDF parece uma versão invertida do AF. você está procurando nulos no AMDF ou ASDF ou picos no AF, o que corresponderia a possíveis períodos de duração da entrada quase periódica.
Aqui estão alguns outros truques:
você sempre pode correlacionar os mais atuaisN amostras contra alguns N amostras atrasadas por k . Dessa forma, você está lidando com os dados mais atuais possíveis no aplicativo em tempo real.
você não precisa calcular a correlação para cada atraso inteirok . de fato, como você gosta da frequência do log, o espaçamento parak pode ser maior que o espaçamento para menores k .
quando um potencial nulo (AM_F) ou pico (AF) for encontrado, você poderá calcular a correlação para valores inteiros adjacentes dek .
entre valores inteiros adjacentes dek , você pode fazer a interpolação para determinar a localização do pico com uma precisão de amostra fracionária. Eu não vou te dizer como. use sua imaginação.
o truque todo (e esse é o molho secreto no qual se aplicam segredos comerciais e patentes de IVL) é escolher o pico correto ou nulo quando houver vários candidatos. escolher o pico incorreto ou nulo resultará em um "erro de oitava". Eu não vou te dizer como fazer isso. use sua imaginação.
envie-me um e-mail e podemos discutir os termos da contratação, se você quiser que eu projete um detector de arremesso. muito melhor que YIN, que, na minha opinião, funciona como uma merda.
fonte
Eu já respondi sua pergunta aqui: /programming/33667275/fast-frequency-measurement/33678202#33678202
Mas, em resumo, em determinadas circunstâncias, é possível interpolar um resultado da FFT para obter uma resolução mais fina do espaçamento entre compartimentos da FFT, permitindo assim que você use uma janela de dados mais curta para obter uma melhor resolução de tempo.
Mas a frequência da FFT não é a frequência de afinação. E para alguns instrumentos musicais (aqueles que produzem tons levemente desarmônicos), a função de autocorrelação (ou seus parentes, como o AMDF) também não é frequente. Isso porque o tom é um fenômeno psicoacústico.
fonte