Fundamentos · 03

Bandas de Oitava

O RTA não mostra bins de FFT crus — mostra bandas de largura proporcional, de 1/1 a 1/48 de oitava. Esta página cobre onde cada banda fica e como a energia dos bins entra nela.

Sistema de razão base-10

O Spectra segue o sistema de bandas de largura relativa constante da ANSI S1.11 / IEC 61260-11, na variante base-10 (a mais usada na prática em vez da base-2 exata):

Razão de banda
$$ G = 10^{3/10} \approx 1{,}99526 $$

Centro de cada banda, indexado por x (inteiro, relativo à banda de referência de 1 kHz) e N = número de bandas por oitava (a fração):

Centro de banda
$$ f_c(x) = \begin{cases} 1000 \cdot G^{\,x/N} & N \text{ ímpar} \\[6pt] 1000 \cdot G^{\,(2x+1)/(2N)} & N \text{ par (convenção ANSI)} \end{cases} $$

Bordas da banda: f_c · G^(±1/2N).

Duas convenções, um bug de 1 kHz

A fórmula par/ímpar acima é a ANSI S1.11 literal — e ela tem uma consequência contraintuitiva: para N par (1/6, 1/12, 1/48...), nenhuma banda cai exatamente em 1 kHz — uma borda de banda cai lá. Um tom de 1 kHz lido sob essa convenção saía rotulado 992,8 Hz em 1/48, 989,3 Hz em 1/32, 978,6 Hz em 1/16, 957,8 Hz em 1/8 e 944,1 Hz em 1/6 — cada fração errando por um valor diferente.

Por isso o Spectra usa, por padrão, uma segunda convenção (.referenceCentered): aplica sempre a fórmula ímpar, mesmo para N par, garantindo que toda fração tenha uma banda exatamente em 1 kHz. A convenção ANSI literal continua disponível em Ajustes › Grade de bandas, para quem precisa de relatório normativo estrito.

Valores de referência (ANSI, testados)

FraçãoCentros exatos (Hz)
1/1 oitava501,2 · 1000,0 · 1995,3 · 3981,1
1/3 oitava794,3 · 1000,0 · 1258,9 · 1584,9 (nominal: 800 / 1000 / 1250 / 1600)

Frações e largura relativa

Frações suportadas: 1/1, 1/3, 1/6, 1/8, 1/12, 1/16, 1/24, 1/32, 1/48. A largura relativa de banda:

Largura relativa de banda
$$ \text{borda} = G^{1/2N} \qquad\qquad \text{largura relativa} = \text{borda} - \frac{1}{\text{borda}} $$

≈ 23% em 1/3 de oitava · ≈ 1,44% em 1/48 de oitava.

A partir de N ≥ 12, a largura de banda (~5,9% em 1/12) fica quase idêntica à razão de semitom da escala igualmente temperada (2^(1/12) ≈ 1,0595) — por isso 1/12 de oitava resolve notas musicais individuais.

Integração de energia por sobreposição real de bins

Cada bin k da FFT cobre um intervalo de frequência [(k−0,5)·Δf, (k+0,5)·Δf] (bin 0 é um caso especial, clampado em [0, Δf/2) por estar em DC). O BandEnergy reparte a potência de cada bin entre as bandas proporcionalmente à fração desse intervalo que cada banda cobre:

Peso de sobreposição bin → banda
$$ \text{overlap} = \min(f_{k,\text{alto}}, f_{\text{banda,alto}}) - \max(f_{k,\text{baixo}}, f_{\text{banda,baixo}}) $$ $$ w = \frac{\max(0,\ \text{overlap})}{f_{k,\text{alto}} - f_{k,\text{baixo}}} \qquad\qquad P_{\text{banda}} = \sum_k w_k \cdot P[k] $$
O bug que isso corrigiu O método anterior atribuía cada bin inteiro à banda cujo centro caísse mais perto, e para bandas mais estreitas que 1 bin (comum em 1/48) pegava uma fatia fixa e arbitrária do bin mais próximo. Medido com ruído rosa, isso deixava as barras de 1/48 cerca de 5 dB abaixo dos ~9 dB que a largura de banda 8× menor já explicaria — e criava serrilhado entre bandas vizinhas.

A integração por sobreposição real conserva energia: a soma de todas as bandas bate com a soma bruta dos bins na faixa 20 Hz–20 kHz, dentro de 0,1–0,25 dB (testado para as frações 1, 3, 6 e 48). Um tom caindo exatamente sobre uma borda de banda também é preservado — cada banda vizinha sozinha lê cerca de 3 dB abaixo do nível real (metade da energia cada), mas a soma das duas recupera o nível dentro de 0,2 dB.

Implementação: para cada banda, um intervalo contíguo de bins e seus pesos é pré-computado (BandBinMap), permitindo resolver cada banda com uma única chamada vetorizada (vDSP_dotpr). O mapa só é reconstruído quando bandas, taxa de amostragem ou tamanho de FFT mudam — em 1/48 isso pode envolver ~480 bandas contra até 16 mil bins.