Tuner
Afinador de trompete que roda no navegador. Identifica a nota pelo microfone com o método de McLeod (MPM) e explica, passo a passo, a matemática por trás.
Nenhuma nota detectada
— Hz— cents
Ligue o microfone e toque uma nota.
Forma de onda (domínio do tempo)
Como funciona: a matemática por trás
Aqui explico, com rigor mas sem mistério, todo o caminho do som até a nota. As fórmulas estão na notação de verdade, mas cada uma vem com a ideia intuitiva, um exemplo numérico e, em vários pontos, um experimento interativo para você mexer e ver acontecer.
1. Do som ao sinal: amostragem
O som é uma variação contínua da pressão do ar no tempo, uma função . O microfone mede essa pressão muitas vezes por segundo. Essa taxa é a frequência de amostragem : no navegador, normalmente 44,1 kHz ou 48 kHz, conforme o aparelho (o afinador acima mostra a do seu enquanto o microfone está ligado). Nos exemplos deste texto, uso Hz. O resultado é uma sequência de números :
Trabalho com blocos de amostras. A 44,1 kHz, cada bloco cobre ms de som, tempo suficiente para conter vários ciclos mesmo das notas mais graves do trompete.
Por que isso importa? Um som periódico obedece , em que é o período (segundos por ciclo). A frequência é só o seu inverso: . Achar a nota é achar o período.
2. Frequência e período, na prática
A onda mais simples é a senoide . Lendo a fórmula em palavras: o valor oscila entre −1 e +1, e o termo diz quão rápido. Quanto maior , mais ciclos por segundo. O período é o tempo de um ciclo, . Por exemplo, um Lá de 440 Hz tem ms por ciclo.
No experimento abaixo, a janela de tempo é fixa em 20 ms, como a tela de um osciloscópio. Por isso, ao aumentar a frequência, mais ciclos se espremem na tela e a faixa destacada, que marca um período, encolhe. Ao diminuir, acontece o contrário. Mexa e veja:
Período T = 4,55 ms · nota ≈ Lá3 · 4,4 ciclos em 20 ms
3. Medindo o quanto a onda se parece consigo mesma
O sinal é a lista de amostras A ideia central do MPM é que um som afinado se repete. Então, se eu pegar o sinal e uma cópia dele deslocada por uma certa quantidade de amostras, as duas versões ficam quase idênticas exatamente quando o deslocamento for igual a um período. Achar o período é achar esse deslocamento.
Antes das fórmulas, o que cada símbolo significa:
- : o valor da j-ésima amostra (a altura da onda naquele instante, entre −1 e +1).
- : o índice da amostra (0, 1, 2, …), a posição no tempo.
- (tau): o deslocamento em amostras entre a onda e a cópia. É o que estamos procurando; em inglês, lag.
- : a amostra posições à frente de , a "cópia deslocada".
- : o tamanho do bloco (2048 amostras).
A primeira medida natural de quão diferentes a onda e sua cópia estão é a função de diferença quadrática (SDF, na sigla em inglês). Para cada amostra, calculamos a diferença , elevamos ao quadrado e somamos tudo:
Por que elevar ao quadrado? Por dois motivos. O quadrado torna toda diferença positiva (tanto faz se a cópia está acima ou abaixo: o desencaixe conta como erro de qualquer jeito) e penaliza mais os desencaixes grandes. Assim, é sempre maior ou igual a zero e funciona como um placar de erro: quanto menor, melhor o encaixe.
E por que a soma vai de só até , e não até ? Porque precisa existir: se passasse do fim do bloco, não haveria amostra para comparar. Consequência importante: quanto maior o deslocamento , menos pares sobram para somar (apenas deles). Guarde isto, porque vai voltar já já.
Quando chega ao período, cada encontra um quase igual, as diferenças vão a zero e , formando um "vale". Para passar da ideia de diferença para a de semelhança, abrimos o quadrado em cada termo da soma. Surgem três pedaços, e o terceiro é o mais importante, a autocorrelação :
Olhe os três pedaços. Os dois primeiros, e , são a energia dos dois trechos (a soma dos quadrados das amostras): variam devagar e de forma parecida entre si. Toda a ação está no terceiro, . Como ele entra com sinal negativo na diferença, deixar pequeno é o mesmo que deixar grande. Ou seja: menor diferença ⟺ maior autocorrelação.
Por que a autocorrelação cresce no encaixe? Ela multiplica cada amostra pela sua cópia. Dois números de mesmo sinal dão produto positivo (+×+ e −×−); de sinais opostos, produto negativo. Quando a cópia está alinhada, picos batem com picos e vales com vales: quase todos os produtos ficam positivos e a soma dispara. Desalinhada, ela mistura positivos e negativos que se cancelam, e a soma cai para perto de zero.
Mini-exemplo concreto. Pegue o trechinho . Comparando com ele mesmo (): , tudo positivo. Deslocando 1 amostra, os pares ficam : os sinais opostos se cancelam. Alinhado, grande; desalinhado, pequeno.
Essa autocorrelação "crua", porém, tem dois defeitos que impedem usá-la diretamente como medida de afinação:
Defeito 1: depende do volume. Toque a mesma nota mais forte e todas as amostras crescem na mesma proporção, digamos . Aí cada produto fica 4 vezes maior (), e também. O número muda só porque o som está mais alto, mesmo com o encaixe idêntico. Uma boa medida de semelhança não deveria depender do volume.
Defeito 2: encolhe conforme cresce. Lembra que a soma tem só parcelas? Com maior, há menos produtos sendo somados, então diminui sozinha, mesmo num som perfeitamente periódico. Resultado: o pico no dobro do período nasce menor que o do período, formando uma "ladeira" que pode esconder o pico certo ou favorecer um errado.
Os dois defeitos têm a mesma cura: normalizar, ou seja, dividir pela energia dos trechos comparados, para o resultado virar um número entre −1 e 1 que não depende do volume nem de . É exatamente o que a NSDF faz, no próximo passo.
4. A NSDF: o coração do MPM
McLeod e Wyvill resolvem os dois defeitos dividindo a autocorrelação pela energia dos trechos comparados. Definindo
obtemos a NSDF (normalized square difference function, ou função de diferença quadrática normalizada):
Dividir pela energia conserta os dois defeitos do passo anterior de uma só vez:
- Volume: se o som dobra (), o numerador fica 4 vezes maior, mas a energia também, porque as duas são feitas de produtos das mesmas amostras. Os dois fatores se cancelam na divisão e o resultado não muda.
- Encolhimento com : numerador e denominador têm o mesmo número de parcelas (). Quando cresce e sobram menos termos, os dois encolhem juntos, na mesma proporção, então a razão entre eles continua justa.
O resultado é adimensional e fica sempre entre −1 e +1: é o encaixe perfeito (cópia idêntica), indica que não há relação e seria o oposto exato (onda espelhada).
Um aparte importante: o que são harmônicos? Uma senoide pura é o som mais "limpo" que existe (uma flauta chega perto). Mas quase todo instrumento real produz, ao mesmo tempo, a frequência fundamental e múltiplos inteiros dela: , , … Essas frequências extras são os harmônicos, e a "receita" deles (quais são fortes, quais são fracos) é o que dá o timbre, o que faz um trompete soar diferente de um clarinete tocando a mesma nota. O sinal vira uma soma de senoides:
Aqui , , … são as amplitudes de cada harmônico, a tal "receita": quanto maior , mais forte aquele harmônico soa (o fundamental entra com amplitude 1). É essa mistura que define o timbre.
O detalhe crucial: todos esses harmônicos compartilham o mesmo período , porque , … completam ciclos inteiros dentro de . Somá-los muda só o formato de cada período (a onda fica mais pontuda e cheia de detalhes), mas não muda o período. Por isso, a altura da nota continua sendo , não importa o timbre. No experimento, troque entre Senoide pura e Trompete: a forma da onda muda muito, mas os picos da NSDF ficam nos mesmos lugares.
"Então os picos repetidos são os harmônicos?" Não! Essa é a confusão clássica. Os picos da NSDF em aparecem simplesmente porque um sinal que se repete a cada amostras também se repete a cada , …: deslocar a cópia por 2 períodos a realinha tão bem quanto por 1. A prova é que a senoide pura, sem harmônicos, tem exatamente os mesmos picos repetidos. Selecione Senoide pura e veja! Ou seja, os picos repetidos são o sinal se repetindo, não os harmônicos. É justamente isso que torna o passo 5 necessário: entre vários picos quase perfeitos, qual é o período fundamental (o primeiro), e não o dobro dele (uma oitava abaixo)?
Experimento: deslize a cópia e veja a NSDF
Em cima, a onda original (linha contínua) e a cópia deslocada por (linha tracejada). Embaixo, a curva inteira, com guias no período e no seu dobro. Arraste : ao chegar ao período, a cópia se sobrepõe à original e sobe para perto de 1; no dobro, sobe de novo. Troque o sinal: mudar os harmônicos muda o formato da onda, mas não a posição dos picos. Até a senoide pura tem os mesmos.
5. Escolha do pico certo
Do passo 4 saiu a curva inteira, cheia de picos. Agora precisamos escolher um: o que corresponde ao período fundamental. Não basta pegar o mais alto, e aqui está o porquê, em etapas (em inglês, essa escolha se chama peak picking):
- Ignorar o pico trivial. Em , a onda é comparada com ela mesma, então sempre, o que não diz nada sobre o período. Pulamos esse primeiro "morro" da curva, até ela cruzar o zero pela primeira vez.
- Achar os máximos-chave. A curva sobe e desce, cruzando o zero várias vezes. Entre uma subida que cruza o zero e a descida seguinte há uma "corcova", e o ponto mais alto de cada corcova é um máximo-chave. Olhar só para esses pontos evita confundir pequenas ondulações com picos de verdade.
- Medir o mais alto de todos, . Esse valor é também a clareza do som, de 0 a 1: perto de 1, a nota está bem definida; baixo, o som é ruidoso ou não existe. É com esse número que o afinador decide se há nota para mostrar, e é ele que aparece como "clareza" nas mensagens do afinador.
- Escolher o primeiro pico bom o bastante. Definimos um limiar , com , e pegamos, varrendo da esquerda para a direita, o primeiro máximo-chave que o ultrapassa, e não o mais alto.
Por que o primeiro, e não o mais alto? Lembre do passo 4: os picos se repetem em e todos têm altura parecida. O pico em corresponde a um período duas vezes maior, ou seja, a uma frequência pela metade: uma oitava abaixo. Se pegássemos o mais alto e ele fosse o de , o afinador mostraria a nota uma oitava errada. O primeiro pico forte é sempre o período fundamental: o mais curto, a frequência mais alta, a nota certa.
Exemplo passo a passo, justamente o caso traiçoeiro. Suponha máximos-chave de altura 0,93 (em ), 0,97 (em ) e 0,90 (em ). O mais alto é o de , então e o limiar é . Se pegássemos o mais alto, escolheríamos , o dobro do período e uma oitava abaixo: erro! Mas, varrendo da esquerda, o primeiro a passar de 0,873 é o de (0,93 ≥ 0,873), e paramos ali. Período de 150 amostras: o fundamental correto.
O do pico escolhido é o nosso período, ainda em número inteiro de amostras. No próximo passo, refinamos isso para frações de amostra.
6. Precisão de subamostra: interpolação parabólica
A NSDF só é calculada em valores inteiros de (amostra a amostra), mas o período real quase nunca cai exatamente sobre uma amostra: ele fica entre dois pontos. A 44,1 kHz, um Lá de 440 Hz tem período amostras. Arredondar para 100 daria Hz, cerca de 4 cents de erro só de arredondamento. Precisamos do pico com precisão de fração de amostra.
Por que justamente uma parábola? Dois fatos se encaixam:
- Todo pico suave, visto de bem perto, é uma parábola. É o que diz a série de Taylor: perto de um máximo , a inclinação é zero, então , que é a equação de uma parábola (com a boca para baixo, pois num máximo a curvatura é negativa).
- Três pontos definem uma única parábola. A parábola tem 3 incógnitas, e temos 3 pontos: , e . Existe uma e só uma, com fórmula fechada. Uma reta nem teria pico, e um grau maior poderia ondular e inventar picos falsos.
O vértice dessa parábola é o palpite refinado do pico. Chamando de , e os três valores da NSDF, o vértice (em ) dá o deslocamento :
A fórmula conta uma história. O denominador é a curvatura, o quão pontudo é o pico. O numerador mede a assimetria: se o vizinho da esquerda é mais alto, o pico real puxa para a esquerda (); se os vizinhos são iguais, e o pico cai bem na amostra.
O é uma fração de amostra, entre −0,5 e +0,5. Aí a frequência sai direto:
A interpolação em ação
A curva real tem o pico num ponto fracionário (linha vertical tracejada), mas só medimos os 3 pontos inteiros em volta. A parábola ajustada passa por esses 3 pontos, e o vértice dela é a estimativa. Arraste o período real: repare como o vértice acompanha o valor verdadeiro, enquanto só arredondar erraria.
Exemplo numérico: com Hz, se o pico está em e a parábola dá , então e Hz. Sem o , daria 441,0 Hz, uma diferença de cerca de 3 cents.
7. Da frequência à nota e aos cents
No temperamento igual, a oitava (dobrar a frequência) é dividida em 12 semitons iguais, em escala logarítmica. Partindo do Lá4 de referência , que você ajusta no controle Referência do afinador (440 Hz, 442 Hz…), a frequência da nota a semitons de distância é:
Invertendo com logaritmo na base 2, descobrimos a quantos semitons a nossa frequência está:
Arredondando , achamos a nota mais próxima. O que sobra, multiplicado por 100, é o desvio em cents (100 cents = 1 semitom):
Calculadora: frequência → nota
Digite uma frequência e a referência para ver a fórmula sendo calculada e a nota resultante. Experimente 446 Hz com referência de 440 Hz: dá Lá4, +23 cents.
Trompete em Si♭ (transposição): ao ler um Dó escrito, o instrumento soa um Si♭ de concerto, 2 semitons abaixo. Para mostrar o nome da nota escrita, somamos um deslocamento inteiro ao índice da nota, . Como é um número inteiro de semitons, o desvio em cents não muda. Só muda o nome da nota.
8. Estabilidade: mediana e filtro exponencial
A análise roda cerca de 60 vezes por segundo, e cada leitura tem um pequeno erro aleatório: a frequência estimada "treme" alguns décimos de Hz a cada quadro. Ligar a agulha direto nisso a deixaria vibrando. Por isso, aplico dois filtros em sequência, cada um resolvendo um problema diferente.
Primeiro filtro, a mediana: elimina as leituras fora da curva. Guardo as últimas 7 frequências e uso a mediana delas, o valor do meio depois de ordenar a lista. A mediana é imune a um valor absurdo isolado, coisa que a média comum não é.
Mediana ou média, na prática. Suponha as leituras , em que 880 é uma leitura errada (um salto de oitava em um quadro). A média daria Hz, puxada pelo erro. Já a mediana (ordenando: 439, 440, 440, 441, 880) é 440 Hz: a leitura errada vira só "a maior da lista" e é descartada. A janela é ímpar (7) justamente para sempre haver um elemento exatamente no meio.
Segundo filtro, a média móvel exponencial: alisa o tremor que resta. Este é aplicado já à posição da agulha, o desvio em cents. Em vez de saltar para a leitura nova, misturo uma fração dela com o valor que já estava na tela:
Lendo a fórmula: o novo valor exibido é (12%) da leitura nova somado a 88% do valor anterior . Isso é um filtro passa-baixas: deixa passar mudanças lentas (você realmente subindo a nota) e barra as rápidas (o tremor de um quadro para o outro). Como cada leitura empurra a agulha só 12% rumo ao novo valor, ela leva cerca de quadros (uns 130 ms) para assentar: rápido para o olho e lento o bastante para não tremer.
Quando a nota muda, a média recomeça. Sem isso, ao passar de +49 cents numa nota para −49 cents na seguinte, a agulha atravessaria o "afinado" no caminho.
O compromisso do : um valor menor (por exemplo, 0,05) deixa a agulha mais calma, porém mais lenta para reagir; um maior (por exemplo, 0,30) a deixa mais responsiva, porém mais nervosa. O 0,12 é um meio-termo confortável, e foi exatamente a esse número que cheguei quando a agulha estava nervosa demais.
Juntando tudo
Esse é o caminho completo, repetido cerca de 60 vezes por segundo: o microfone vira amostras (passos 1 e 2); a NSDF mede o quanto a onda se parece com uma cópia deslocada dela mesma (passos 3 e 4); a escolha do pico encontra o período fundamental, fugindo do erro de oitava (passo 5); a parábola refina o período para frações de amostra (passo 6); a frequência vira nome de nota e cents (passo 7); e a mediana com o filtro exponencial deixa a agulha estável (passo 8). Do ar à nota afinada, em poucos milissegundos.
Referência
- Philip McLeod e Geoff Wyvill, A Smarter Way to Find Pitch, Proceedings of the International Computer Music Conference (ICMC), 2005.