← Voltar aos projetos

Áudio

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.

440 Hz
Notação

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 p(t). O microfone mede essa pressão muitas vezes por segundo. Essa taxa é a frequência de amostragem fs: 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 fs=44100 Hz. O resultado é uma sequência de números x[n]:

x[n]=p(nfs)n=0,1,2,…,N−1

Trabalho com blocos de N=2048 amostras. A 44,1 kHz, cada bloco cobre N/fs≈46 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 x(t)=x(t+T), em que T é o período (segundos por ciclo). A frequência é só o seu inverso: f=1T. Achar a nota é achar o período.

2. Frequência e período, na prática

A onda mais simples é a senoide x(t)=sin⁡(2πft). Lendo a fórmula em palavras: o valor oscila entre −1 e +1, e o termo 2πf diz quão rápido. Quanto maior f, mais ciclos por segundo. O período é o tempo de um ciclo, T=1f. Por exemplo, um Lá de 440 Hz tem T=1/440≈2,3 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:

220 Hz

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 x0,x1,x2,… 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:

  • xj: o valor da j-ésima amostra (a altura da onda naquele instante, entre −1 e +1).
  • j: 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.
  • xj+τ: a amostra τ posições à frente de xj, a "cópia deslocada".
  • N: 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 xj−xj+τ, elevamos ao quadrado e somamos tudo:

d′(τ)=∑j=0N−1−τ(xj−xj+τ)2

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, d′(τ) é 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 j=0 só até N−1−τ, e não até N−1? Porque xj+τ precisa existir: se j+τ passasse do fim do bloco, não haveria amostra para comparar. Consequência importante: quanto maior o deslocamento τ, menos pares sobram para somar (apenas N−τ deles). Guarde isto, porque vai voltar já já.

Quando τ chega ao período, cada xj encontra um xj+τ quase igual, as diferenças vão a zero e d′(τ)≈0, formando um "vale". Para passar da ideia de diferença para a de semelhança, abrimos o quadrado (a−b)2=a2−2ab+b2 em cada termo da soma. Surgem três pedaços, e o terceiro é o mais importante, a autocorrelação r′(τ):

d′(τ)=∑jxj2+∑jxj+τ2−2∑jxjxj+τcomr′(τ)=∑j=0N−1−τxjxj+τ

Olhe os três pedaços. Os dois primeiros, ∑jxj2 e ∑jxj+τ2, 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, r′(τ)=∑jxjxj+τ. Como ele entra com sinal negativo na diferença, deixar d′(τ) pequeno é o mesmo que deixar r′(τ) 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 [1,−1,1,−1]. Comparando com ele mesmo (τ=0): 1⋅1+(−1)(−1)+1⋅1+(−1)(−1)=4, tudo positivo. Deslocando 1 amostra, os pares ficam 1⋅(−1)+(−1)⋅1+1⋅(−1)=−3: 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 xj→2xj. Aí cada produto xjxj+τ fica 4 vezes maior (2⋅2=4), e r′(τ) 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ó N−τ parcelas? Com τ maior, há menos produtos sendo somados, então r′(τ) 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

m′(τ)=∑j=0N−1−τ(xj2+xj+τ2)

obtemos a NSDF (normalized square difference function, ou função de diferença quadrática normalizada):

n′(τ)=2r′(τ)m′(τ)−1≤n′(τ)≤1

Dividir pela energia m′(τ) conserta os dois defeitos do passo anterior de uma só vez:

  • Volume: se o som dobra (xj→2xj), o numerador 2r′(τ) fica 4 vezes maior, mas a energia m′(τ) 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 (N−τ). 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: n′(τ)=1 é o encaixe perfeito (cópia idêntica), n′(τ)=0 indica que não há relação e n′(τ)=−1 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 f0 e múltiplos inteiros dela: 2f0, 3f0, 4f0… 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:

x(t)=sin⁡(2πf0t)+a2sin⁡(2π⋅2f0t)+a3sin⁡(2π⋅3f0t)+…

Aqui a2, a3, … são as amplitudes de cada harmônico, a tal "receita": quanto maior ak, 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 T=1/f0, porque 2f0, 3f0… completam ciclos inteiros dentro de T. 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 f0, 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 τ=P,2P,3P,… aparecem simplesmente porque um sinal que se repete a cada P amostras também se repete a cada 2P, 3P…: 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 n′(τ) inteira, com guias no período e no seu dobro. Arraste τ: ao chegar ao período, a cópia se sobrepõe à original e n′ 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.

Onda original Cópia deslocada por τ
Curva n′(τ) τ atual
0
n′(τ) = 1,00

5. Escolha do pico certo

Do passo 4 saiu a curva n′(τ) 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):

  1. Ignorar o pico trivial. Em τ=0, a onda é comparada com ela mesma, então n′(0)=1 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.
  2. 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.
  3. Medir o mais alto de todos, nmax⁡. 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.
  4. Escolher o primeiro pico bom o bastante. Definimos um limiar k⋅nmax⁡, com k=0,9, 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 τ=P,2P,3P,… e todos têm altura parecida. O pico em 2P 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 2P, 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 τ=150), 0,97 (em τ=300) e 0,90 (em τ=450). O mais alto é o de τ=300, então nmax⁡=0,97 e o limiar é 0,9⋅0,97=0,873. Se pegássemos o mais alto, escolheríamos τ=300, o dobro do período e uma oitava abaixo: erro! Mas, varrendo da esquerda, o primeiro a passar de 0,873 é o de τ=150 (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 τ=44100/440≈100,2 amostras. Arredondar para 100 daria 44100/100=441 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:

  1. Todo pico suave, visto de bem perto, é uma parábola. É o que diz a série de Taylor: perto de um máximo x0, a inclinação é zero, então f(x)≈f(x0)+12f′′(x0)(x−x0)2, que é a equação de uma parábola (com a boca para baixo, pois num máximo a curvatura f′′ é negativa).
  2. Três pontos definem uma única parábola. A parábola y=ax2+bx+c tem 3 incógnitas, e temos 3 pontos: τ−1, τ e τ+1. 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 n−1, n0 e n+1 os três valores da NSDF, o vértice (em x=−b/2a) dá o deslocamento δ:

δ=12⋅n−1−n+1n−1−2n0+n+1τ⋆=τ+δ

A fórmula conta uma história. O denominador n−1−2n0+n+1 é a curvatura, o quão pontudo é o pico. O numerador n−1−n+1 mede a assimetria: se o vizinho da esquerda é mais alto, o pico real puxa para a esquerda (δ<0); se os vizinhos são iguais, δ=0 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:

f=fsτ⋆

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.

Curva real Pontos medidos Parábola ajustada Pico real Estimativa (vértice)
100,27
pico na amostra inteira τ = 100correção da parábola δ = +0,27estimativa τ⋆ = τ + δ = 100,27 → f = 439,8 Hz só arredondando daria 441,0 Hz, erro de ~5 cents

Exemplo numérico: com fs=44100 Hz, se o pico está em τ=100 e a parábola dá δ=−0,18, então τ⋆=99,82 e f=44100/99,82≈441,8 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 fref, que você ajusta no controle Referência do afinador (440 Hz, 442 Hz…), a frequência da nota a n semitons de distância é:

f(n)=fref⋅2n/12

Invertendo com logaritmo na base 2, descobrimos a quantos semitons a nossa frequência está:

n=12log2⁡(ffref)

Arredondando n, achamos a nota mais próxima. O que sobra, multiplicado por 100, é o desvio em cents (100 cents = 1 semitom):

cents=(n−round⁡(n))⋅100=1200log2⁡(ffmais próxima)

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.

Hz
Hz
n = 12 · log₂(446,0 / 440) = 0,234 semitonsnota mais próxima: Lá4desvio: +23 cents (alto)

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, n+2. 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 [440,441,439,880,440], em que 880 é uma leitura errada (um salto de oitava em um quadro). A média daria (440+441+439+880+440)/5=528 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:

st=α⋅xt+(1−α)⋅st−1α=0,12

Lendo a fórmula: o novo valor exibido st é α=0,12 (12%) da leitura nova xt somado a 88% do valor anterior st−1. 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 1/α≈8 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 x[n] (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.

© 2026 Giuliano Geiss Arnhold. Todos os direitos reservados.

Privacidade

giuliano.codes