O Android usa vários tipos de áudio formatos de dados internamente e expõe um subconjunto deles em APIs públicas, formatos de arquivo, e o Camada de abstração de hardware (HAL).
Propriedades
Os formatos de dados de áudio são classificados de acordo com as propriedades:
- Compactação
- Não compactado, compactado sem perda compactado com perda. O PCM é o formato de áudio não compactado mais comum. FLAC é uma solução compactada sem perdas enquanto MP3 e AAC são formatos compactados com perdas.
- Profundidade de bits
- Número de bits significativos por amostra de áudio.
- Tamanho do contêiner
- Número de bits usados para armazenar ou transmitir uma amostra. Preço normal: é a mesma que a profundidade de bits, mas às vezes os bits de preenchimento são alocados para alinhamento. Por exemplo, Uma amostra de 24 bits pode estar contida em uma palavra de 32 bits.
- Alinhamento
- Se o tamanho do contêiner for exatamente igual à profundidade de bits, o representação é chamada package (em inglês). Caso contrário, a representação será descompactado. As partes mais importantes da amostra são normalmente alinhada à mais à esquerda (mais significativa) ou à direita (menos significativo) do contêiner. É convencional usar os termos empacotado e descompactado somente quando o bit a profundidade não é um poder de dois.
- Assinante
- Se as amostras são assinadas ou não.
- Representação
- Ponto fixo ou flutuante; veja abaixo.
Representação de ponto fixo
Ponto fixo é a representação mais comum de dados de áudio PCM não compactados, especialmente em interfaces de hardware.
Um número de ponto fixo tem um número fixo (constante) de dígitos antes e depois do ponto base. Todas as nossas representações usam base 2, então, substituímos bit por dígito, e ponto binário ou simplesmente ponto como ponto base. Os bits à esquerda do ponto são a parte inteira, e os bits à direita do ponto são os parte fracionária.
Falamos de PCM inteiro, porque valores de ponto fixo costumam ser armazenados e manipulados como valores inteiros. A interpretação como ponto fixo é implícita.
Usamos o complemento de dois para todas as representações de ponto fixo com sinal, Portanto, o seguinte argumento mantém onde todos os valores estão em unidades de um LSB:
|largest negative value| = |largest positive value| + 1
Notação Q e U
Existem várias anotações para representação de ponto fixo em um número inteiro. Usamos a notação Q: Qm.n significa m bits inteiros e n bits fracionários. O "Q" conta como um bit, embora o valor seja expresso no complemento de dois. O número total de bits é m + n + 1.
Um.n é para números não assinados: m bits inteiros e n bits fracionários, e o "U" conta como zero bits. O número total de bits é m + n.
A parte inteira pode ser usada no resultado final ou ser temporária. No último caso, os bits que compõem a parte inteira são chamados bits de proteção. Os bits de proteção permitem estouro de um cálculo intermediário, desde que o valor final esteja dentro do intervalo ou possa ser ajustado para ficar dentro do intervalo. Os bits de proteção de ponto fixo ficam à esquerda, enquanto a unidade de ponto flutuante dígitos de segurança são usados para reduzir o erro de arredondamento e estão à direita.
Representação de ponto flutuante
Ponto flutuante é uma alternativa ao ponto fixo, em que a localização do ponto pode variar. As principais vantagens do ponto flutuante incluem:
- Maior espaço e intervalo dinâmico a aritmética de ponto flutuante tolera intervalos nominais durante a computação intermediária e fixa apenas os valores no final
- Suporte para valores especiais, como infinities e NaN
- Mais fácil de usar em muitos casos
Historicamente, a aritmética do ponto flutuante era mais lenta do que a aritmética de números inteiros ou de ponto fixo. aritmético, mas agora é comum que o ponto flutuante seja mais rápido, desde que as decisões do fluxo de controle não sejam baseadas no valor de um cálculo.
Formatos do Android para áudio
Os principais formatos do Android para áudio estão listados na tabela abaixo:
Propriedade | P0,15 | P0.7: 1 | P0,23 | P0,31 | float | |
---|---|---|---|---|---|---|
Contêiner bits |
16 | 8 | 24 ou 32 2 | 32 | 32 | |
Bits significativos incluindo sinal |
16 | 8 | 24 | 24 ou 32 2 | 25 3 | |
Margem em dB |
0 | 0 | 0 | 0 | 126 4 | |
Intervalo dinâmico em dB |
90 | 42 | 138 | 138 a 186 | 900 5 |
Todos os formatos de ponto fixo acima têm um intervalo nominal de -1,0 a +1,0 menos um LSB. Existe um valor negativo a mais do que um valor positivo devido à representação complementar de dois.
Notas de rodapé:
-
Todos os formatos acima expressam valores de amostra com sinal.
O formato de 8 bits é comumente chamado de "não assinado",
Na verdade, é um valor assinado com viés de
0.10000000
. - Q0.23 pode ser compactado em 24 bits (três bytes de 8 bits, few-endian) ou descompactado em 32 bits. Se descompactado, os bits significativos são justificados à direita em direção ao LSB com padding de extensão de sinal para o MSB (P8.23), ou justificado à esquerda em direção ao MSB com preenchimento zero para o LSB (P0,31). Teoricamente, Q0.31 permite até 32 bits significativos, mas as interfaces de hardware que aceitam Q0.31 raramente usam todos os bits.
- O ponto flutuante de precisão única tem 23 bits explícitos mais um bit oculto e um bit de sinal. resultando em um total de 25 bits significativos. Números normais com menos bits significativos.
- O ponto flutuante de precisão única pode expressar valores de até ±1,7e+38, o que explica essa grande margem.
- O intervalo dinâmico mostrado é para desnormalidades até o máximo nominal valor ±1,0. Algumas implementações de ponto flutuante específicas da arquitetura, como NEON (link em inglês) e não oferecem suporte a desnormalidades.
Conversões
Esta seção aborda conversões de dados entre várias representações.
Conversões de ponto flutuante
Para converter um valor do formato Qm.n em ponto flutuante:
- Converta o valor em ponto flutuante como se fosse um número inteiro (ignorando o ponto).
- Multiplique por 2-n.
Por exemplo, para converter um valor interno Q4.27 em ponto flutuante, use:
float = integer * (2 ^ -27)
As conversões de ponto flutuante para ponto fixo seguem estas regras:
- O ponto flutuante de precisão única tem um intervalo nominal de ±1,0, mas o intervalo completo para valores intermediários é ±1,7e+38. Conversão entre ponto flutuante e ponto fixo para representação externa (como saída para dispositivos de áudio) considera apenas a faixa nominal, com restrição de valores que excedem esse intervalo. Especificamente, quando +1,0 é convertido para um formato de ponto fixo, ele é limitado a +1,0 menos um LSB.
- São permitidos desnormalidades (subnormais) e +/- 0,0 na representação, mas pode ser silenciosamente convertido para 0.0 durante o processamento.
- O infinito vai passar pelas operações ou será limitado de forma silenciosa para +/- 1,0. Geralmente, o último é para conversão para um formato de ponto fixo.
- O comportamento do NaN é indefinido: um NaN pode se propagar como um NaN idêntico ou pode ser convertido em um NaN padrão, podem ser limitados silenciosamente para +/- 1.0 ou silenciosamente convertida para 0.0 ou resultar em um erro.
Conversões de pontos fixos
As conversões entre diferentes formatos Qm.n seguem estas regras:
- Quando m for aumentado, o sinal estende a parte inteira à esquerda.
- Quando m for reduzido, fixe a parte inteira.
- Quando n é aumentado, a parte fracionária à direita é estendida a zero.
- Quando n é reduzido, pontilha, arredonda ou trunca os bits fracionários em excesso à direita.
Por exemplo, para converter um valor Q4,27 em Q0,15 (sem pontilhamento ou arredondamento), deslocar para a direita o valor Q4.27 em 12 bits e limitar quaisquer resultados que excedem o intervalo assinado de 16 bits. Isso alinha o ponto do Representação Q.
Para converter Q7,24 para Q7,23, faça uma divisão assinada por 2, Ou, de maneira equivalente, adicione o bit de sinal à quantidade de números inteiros Q7.24 e, em seguida, sinalize para a direita em 1. Observe que um deslocamento à direita com sinal simples não é equivalente a uma divisão sinalizada por 2.
Conversões com e sem perda
Uma conversão sem perdas se não tiver
invertível:
uma conversão de A
para B
C
resultados em A = C
.
Caso contrário, a conversão terá perda.
As conversões sem perda permitem conversão de formato de ida e volta.
As conversões da representação de ponto fixo com 25 ou menos bits significativos para um ponto flutuante não têm perdas. As conversões de ponto flutuante para qualquer representação de ponto fixo comum têm perdas.