Por Que a Sua Imagem de Forma de Onda Está Sem a Bateria
Desenhar uma forma de onda é um problema de redução: vários milhões de números precisam virar algumas centenas de colunas de pixels. Quase toda ferramenta responde isso do mesmo jeito, em uma linha, e essa linha está errada de um modo que dá para medir com exatidão.
Eis a aritmética que transforma isso em problema. Uma faixa de três minutos a 44,1 kHz tem 7.938.000 amostras. Desenhada com 800 px de largura, cada coluna de pixel precisa representar 9.922,5 delas. Alguma coisa tem que decidir o que a altura de uma coluna significa.
A resposta comum é pegar uma amostra de cada coluna e desenhar a altura dela. Isso lê 800 amostras de 7.938.000 — 0,0101 % do arquivo. Não é um resumo da coluna. É uma amostragem pontual dela, a uma taxa milhares de vezes abaixo da do próprio sinal, que é o cenário de manual para aliasing.
Um tom em escala cheia desenhado como linha reta
O jeito mais limpo de enxergar isso é desenhar um áudio cujo desenho correto você já conhece. Geramos 180 segundos de um tom constante com amplitude 1,0 — escala cheia da primeira à última amostra. O desenho verdadeiro é um bloco sólido de altura 1,000, em todas as colunas, sem discussão.
Veja o que uma amostra por coluna devolve, quando a única coisa que muda é a frequência:
| Tom | Uma amostra por coluna | Todas as amostras (pico) |
|---|---|---|
| 100 Hz | 0,0036 | 1,0000 |
| 220 Hz | 0,0078 | 1,0000 |
| 261,63 Hz | 0,6361 | 1,0000 |
| 440 Hz | 0,0157 | 1,0000 |
| 441 Hz | 0,6352 | 1,0000 |
| 1000 Hz | 0,0356 | 1,0000 |
| 2000 Hz | 0,0710 | 1,0000 |
| 5000 Hz | 0,1744 | 1,0000 |
Áudio idêntico, no mesmo volume, e as respostas vão de 0,0036 a 0,6361. Cento e oitenta segundos de um tom que nunca sai da escala cheia desenham como uma linha reta em 440 Hz — e em 441 Hz, um hertz adiante, como uma onda com 64 % de altura.
Nada disso é uma propriedade do áudio. É uma propriedade de como o período do tom se divide no passo das colunas: 440 Hz a 44,1 kHz são 100,227 amostras por ciclo, e 9.922,5 amostras por coluna são 99,0 desses ciclos — então coluna após coluna cai quase na mesma fase. O retrato é da aritmética, não do som.
Redimensione a imagem e a onda muda de forma
Este é o sinal que a maioria já viu sem saber nomear. Pegue aquele mesmo arquivo de 440 Hz e redesenhe em larguras diferentes, sem mudar mais nada:
| Largura | Amostras por coluna | Uma amostra por coluna | Todas as amostras |
|---|---|---|---|
| 600 px | 13.230,0 | 0,0000 | 1,0000 |
| 700 px | 11.340,0 | 0,6259 | 1,0000 |
| 800 px | 9.922,5 | 0,0157 | 1,0000 |
| 900 px | 8.820,0 | 0,0000 | 1,0000 |
| 1000 px | 7.938,0 | 0,6155 | 1,0000 |
| 1200 px | 6.615,0 | 0,0000 | 1,0000 |
| 1920 px | 4.134,4 | 0,5114 | 1,0000 |
Um arquivo, um tom, sete desenhos — três deles em branco. Se você já exportou uma onda em dois tamanhos e achou o segundo estranho, você tinha razão, e é por isso. Um desenho que muda quando você muda a tela não está descrevendo o áudio.
Uma faixa de bateria sem bateria
O caso da frequência é uma demonstração limpa, mas o caso que custa trabalho de verdade são os transientes. Um estouro de 2 ms a 44,1 kHz tem 88 amostras — 0,89 % de uma coluna de 9.922 amostras. Ler uma amostra por coluna cai em cima dele cerca de 0,89 % das vezes.
Montamos uma trilha de cliques: 360 estouros em escala cheia, um a cada 500 ms, ao longo de três minutos. Depois desenhamos das duas maneiras.
| Medição | Uma amostra por coluna | Todas as amostras (pico) |
|---|---|---|
| Colunas que mostram um estouro | 0 de 800 | 360 de 800 |
| Coluna mais alta | 0,0000 | 0,8973 |
| Amostra única em escala cheia achada (200 posições aleatórias) | 0 / 200 | 200 / 200 |
| Estouro de 2 ms achado (200 posições aleatórias) | 3 / 200 | 200 / 200 |
Zero. Não bateria mais fraca — bateria nenhuma. Cada uma das 360 batidas em escala cheia caiu entre as amostras observadas, e o desenho voltou como uma linha reta. Escondendo uma única amostra em escala cheia num arquivo silencioso e movendo-a para 200 posições aleatórias, o atalho a encontrou nenhuma das 200 vezes; alargando para um estouro de 2 ms, encontrou três.
Por que ninguém percebe
Porque nunca falha alto. Uma onda 65 % mais curta, ou sem os transientes, ou com forma diferente em outro tamanho, continua parecendo uma onda. Tem picos e vales, começa onde o áudio começa e termina onde ele termina, e é em geral mais alta nas partes altas. Não há erro, não há aviso e não há com o que comparar — que é exatamente o formato dos outros defeitos que seguimos encontrando em ferramentas criativas pequenas: um anel desenhado com metade da largura pedida parece um anel mais fino, não um bug, e uma fatia de carrossel deslocada meio pixel parece uma foto um pouco mole.
O motivo para se importar não é estético. Se você está cortando pela onda, alinhando uma legenda a uma batida ou tirando silêncio no olho, está decidindo a partir de um desenho que jogou fora 99,99 % das evidências.
A correção, e quanto ela custa
Guarde o mínimo e o máximo de cada coluna. É só isso. Não tem como perder uma amostra porque lê todas, é estável ao redimensionar porque não depende de quais amostras foram olhadas por acaso, e pega um transiente de 88 amostras pelo mesmo motivo.
O custo: reduzir todas as 7.938.000 amostras a 800 colunas levou 4,70 ms, melhor de cinco execuções, num navegador comum. O atalho levou 0,00 ms. Essa é a economia inteira que está sendo defendida, e ela compra um desenho que não é do seu áudio.
RMS é outra pergunta, não uma resposta errada
Há uma terceira opção que vale nomear, porque as ferramentas a misturam em silêncio. RMS é a energia média da coluna, e não a amostra mais forte dela. Para uma senoide, o RMS é 0,7071 contra um pico de 1,0000 — uma onda em RMS é 29,29 % mais baixa do que uma onda em pico do mesmo áudio.
Nenhuma das duas está errada. O pico mostra transientes; o RMS acompanha o volume percebido e sai mais suave. Errado é não saber qual delas você está olhando, ou uma ferramenta que usa uma para a prévia e outra para a exportação.
Confirmado num arquivo real, depois que a ferramenta foi ao ar
Sinais sintéticos provam o mecanismo; um arquivo real prova que ele sobrevive ao contato com áudio de verdade. Soltamos um trecho de fala de 20 segundos — 960.000 amostras, mono, 48 kHz — no gerador de imagem de forma de onda pronto e lemos os números da própria página, não de uma reimplementação dela.
| Largura | Pico real (todas as amostras) | Pico achado por uma amostra |
|---|---|---|
| 600 px | 0,2964 | 0,2387 |
| 800 px | 0,2964 | 0,2172 |
| 1000 px | 0,2964 | 0,1886 |
| 1200 px | 0,2964 | 0,2387 |
| 1920 px | 0,2964 | 0,2343 |
O pico real é 0,2964 em todas as larguras, porque é um fato sobre o arquivo. A resposta do atalho vagueia entre 0,1886 e 0,2387 dependendo só da largura que você pediu para a imagem. No mesmo trecho, 88 de 480 colunas alcançam metade do pico real; ler uma amostra por coluna encontra 10. O desenho dele fica 65,42 % mais baixo, em média.
A ferramenta desenha o seu arquivo das duas maneiras, lado a lado, e imprime esses números para o que você der a ela — então a comparação é algo que você roda, e não algo em que você acredita.
Perguntas frequentes
Isso é um defeito de verdade ou implicância de purista?
É um defeito com números anexados. Numa trilha de cliques sintética o atalho desenhou 0 de 360 batidas e devolveu uma coluna mais alta de 0,0000 para um áudio que bate em escala cheia repetidamente. Num trecho de fala real de 20 segundos ele reportou o pico entre 0,1886 e 0,2387 dependendo só da largura da imagem, contra um pico real de 0,2964. Nada disso é questão de gosto.
Por que alguém leria uma amostra por coluna?
Porque é de graça e parece certo. Reduzir 7.938.000 amostras direito levou 4,70 ms num navegador; o atalho levou 0,00 ms. E o resultado continua parecendo uma forma de onda, então nada reclama — não há erro nem nada óbvio com o que comparar.
Isso também afeta arquivos curtos?
Bem menos. O estrago cresce com quantas amostras uma coluna precisa representar. Um arquivo de 10 segundos a 800 px são 551 amostras por coluna e um de 10 minutos são 33.075. Trechos curtos desenhados largos são o caso mais seguro; arquivos longos desenhados estreitos são o pior.
E se eu tirar a média da coluna?
A média das amostras com sinal é pior que as duas — uma onda simétrica tem média perto de zero, então áudio alto desenha como linha reta por outro motivo. A média dos valores absolutos ou o RMS são defensáveis, mas ambos são mais baixos que o pico por construção: o RMS de uma senoide é 0,7071 contra um pico de 1,0000.
Ler todas as amostras deixa a página lenta?
Não. 4,70 ms para uma faixa de três minutos é imperceptível, e acontece a cada redesenho, não continuamente. O custo dominante no navegador é decodificar o arquivo comprimido em amostras, o que toda abordagem precisa fazer de qualquer jeito.
Onde eu testo a comparação com o meu próprio áudio?
O gerador de imagem de forma de onda desenha o seu arquivo das duas maneiras na mesma página e reporta o pico real, o pico que o atalho achou, quantas colunas cada método mostra acima da metade do pico real e quanto mais baixo fica o desenho do atalho. Nada é enviado — a decodificação e o desenho acontecem no seu navegador.