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):
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):
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ção | Centros exatos (Hz) |
|---|---|
| 1/1 oitava | 501,2 · 1000,0 · 1995,3 · 3981,1 |
| 1/3 oitava | 794,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:
≈ 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:
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.