Reconhecimento de tom rápido

8

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 df=1/T 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:

Observe as frequências vinculadas da Wikipedia

18446744073709551615
fonte
Belo desenho. eles devem virá-lo de cabeça para baixo, para que os símbolos da clave (e da equipe musical) fiquem com o lado direito para cima. mas então todos os números de frequência e período e MIDI ficariam de cabeça para baixo.
Robert Bristow-johnson
Parece que você precisa de uma detecção de afinação polifônica em vez de uma detecção monofônica (isto é, uma nota de cada vez). Isso está correto?
Jazzmaniac
@Jazzmaniac Polyphonic definitivamente seria uma vantagem, ou seja, monofônico seria uma restrição. Se eu pudesse usar a FFT, exibia vários picos em um diagrama de tempo de frequência 2D. Por outro lado, se bem entendi, os instrumentos de sopro são monofônicos, e o violino é bem próximo disso.
18446744073709551615
Instrumentos de sopro definitivamente funcionam com algoritmos de detecção monofônicos. No entanto, os instrumentos de corda (com mais de uma corda) são complicados, e a maioria, se não todos, os detectores monofônicos produzem resultados não confiáveis ​​ou mesmo inutilizáveis ​​na presença de tons em decomposição de cordas que não são perfeitamente silenciadas, cordas abertas que ressoam ou apenas interferência do microfone. Dito isto, a detecção polifônica é difícil. No entanto, como você realmente não precisa de uma detecção precisa de notas, mas apenas uma detecção precisa em sintonia, você pode muito bem encontrar um algoritmo adequado. No entanto, não será um detector de tom monofônico.
quer
Isso pode explicar o voto negativo da resposta de RBJ, ou alguém pode ter se ofendido com seu argumento de vendas um tanto quanto não objetivo. De qualquer forma, não pule no navio dele muito cedo. Existem outras opções para o que você deseja e, possivelmente, melhores também.
Jazzmaniac

Respostas:

9

" 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)

Qx[k]=n|x[n]-x[n-k]|

Função de diferença quadrática média (ASDF)

Qx[k]=n(x[n]-x[n-k])2

Função de autocorrelação (AF)

Rx[k]=nx[n]x[n-k]

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:

  1. você sempre pode correlacionar os mais atuais N 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.

  2. você não precisa calcular a correlação para cada atraso inteiro k. de fato, como você gosta da frequência do log, o espaçamento parak pode ser maior que o espaçamento para menores k.

  3. quando um potencial nulo (AM_F) ou pico (AF) for encontrado, você poderá calcular a correlação para valores inteiros adjacentes de k.

  4. entre valores inteiros adjacentes de k, 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.

  5. 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.

Robert Bristow-Johnson
fonte
1
Um comentário sobre voto negativo seria apreciado. Se houver algo errado, eu quero saber disso. Esta resposta não fornece receita, mas pelo menos há uma lista do que ler (bem, isso não soa como uma leitura fácil, mas é algo melhor do que nada). Por favor, não apague esta resposta.
18446744073709551615
1
quem excluiria a resposta? mim?
Robert Bristow-johnson
3

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.

hotpaw2
fonte
duas notas: se você deseja que a detecção de tom seja " rápida ", eu não recomendaria fazê-lo no domínio da frequência (a menos que talvez esteja fazendo alguma coisa com várias taxas com várias FFTs. a razão é que você você não pode nem começar a FFT até obter todas as amostras. Para uma FFT de tamanho decente (para obter resolução suficiente em tons baixos), você já esperou, digamos, 0,1 segundo. pitch (e volume) são medidas psicoacústicas que às vezes correlacionam-se bem com as propriedades físicas como período (e poder) para sinos, toms, você vai ter um campo, mas isso pode não significar a coisa certa..
Robert Bristow-johnson
mas acabei de executar meu pequeno script do matlab em um hit gravado e pareceu -me que o tom retornado seria um valor plausível para a nota.
Robert Bristow-johnson