O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Formatos de Dados

Usa o Android uma grande variedade de áudio formatos de dados internamente e expõe um subconjunto destes em APIs públicas, formatos de arquivo , e o Hardware Abstraction Layer (HAL).

Propriedades

Os formatos de dados de áudio são classificados por suas propriedades:

Compressão
Descompactado , sem perdas comprimido , ou com perdas comprimido . PCM é o formato de áudio não compactado mais comum. FLAC é um formato compactado 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. Normalmente, é igual à profundidade de bits, mas às vezes bits de preenchimento adicionais 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 recipiente é exatamente igual à profundidade de bits, a representação é chamado embalado. Caso contrário, a representação é desempacotado. Os bits significativos da amostra são normalmente alinhados com o bit mais à esquerda (mais significativo) ou mais à direita (menos significativo) do contêiner. É convencional para usar os termos embalado e desembalado somente quando a profundidade de bits não é uma potência de dois .
Assinatura
Se as amostras são assinadas ou não.
Representação
Ponto fixo ou ponto flutuante; Veja abaixo.

Representação de ponto fixo

Ponto fixo é a representação mais comum para dados de áudio PCM não comprimido, especialmente em interfaces de hardware.

Um número de ponto fixo tem um número fixo (constante) de dígitos antes e após o ponto de raiz . Todas as nossas representações usar base 2 , de modo que substituir bit para dígitos e ponto binário ou simplesmente apontar para o ponto de raiz. Os bits à esquerda do ponto são a parte inteira, e os bits à direita do ponto são a parte fracionária .

Falamos de PCM inteiro, porque os valores de ponto fixo são normalmente armazenados e manipulados como valores inteiros. A interpretação como ponto fixo está implícita.

Usamos complemento de dois para todas as representações de ponto fixo assinados, então o seguinte detém onde todos os valores são em unidades de um LSB :

|largest negative value| = |largest positive value| + 1

Notação Q e U

Existem várias notações para representação de ponto fixo em um número inteiro. Nós usamos Q notação : Q m. significa n m bits inteiros e n bits fraccionada. O "Q" conta como um bit, embora o valor seja expresso em complemento de dois. O número total de bits é m + n + 1.

L m. o símbolo n representa os números não assinados: m bits de inteiros e n bits fraccionais, e as contagens de "U" como zero bits. O número total de bits é m + n.

A parte inteira pode ser usada no resultado final ou ser temporária. Neste último caso, os bits que compõem a parte inteira são chamados de bits de guarda. Os bits de guarda permitem que um cálculo intermediário transborde, desde que o valor final esteja dentro do intervalo ou possa ser fixado para estar dentro do intervalo. Note-se que os bits de guarda de ponto fixo estão na esquerda, enquanto de ponto flutuante unidade de dígitos de guarda são usados para reduzir os erros de arredondamento e estão à direita.

Representação de ponto flutuante

Ponto flutuante é uma alternativa ao ponto fixo, no qual a localização do ponto pode variar. As principais vantagens do ponto flutuante incluem:

  • Maior altura livre e alcance dinâmico ; aritmética de ponto flutuante tolera faixas nominais excedentes durante o cálculo intermediário, e apenas fixa valores no final
  • Suporte para valores especiais, como infinitos e NaN
  • Mais fácil de usar em muitos casos

Historicamente, a aritmética de ponto flutuante era mais lenta do que a aritmética de ponto flutuante ou inteiro, mas agora é comum que o ponto flutuante seja mais rápido, desde que as decisões de fluxo de controle não sejam baseadas no valor de um cálculo.

Formatos Android para áudio

Os principais formatos Android para áudio estão listados na tabela abaixo:

Notação
Propriedade Q0.15 Q0.7 1 Q0.23 Q0.31 flutuador
Recipiente
bits
16 8 24 ou 32 2 32 32
Bits significativos
incluindo sinal
16 8 24 24 ou 32 2 25 3
Headroom
em dB
0 0 0 0 4 126
Gama dinâmica
em dB
90 42 138 138 a 186 900 5

Todos os formatos de ponto fixo acima têm uma faixa nominal de -1,0 a +1,0 menos um LSB. Há mais um valor negativo do que positivo devido à representação de complemento de dois.

Notas de rodapé:

  1. Todos os formatos acima expressam valores de amostra assinados. O formato de 8 bits é comumente chamado de "sem sinal", mas na verdade é um valor assinado com viés de 0.10000000 .
  2. Q0.23 pode ser compactado em 24 bits (três bytes de 8 bits, little-endian) ou descompactado em 32 bits. Se desempacotado, os bits significativos são justificados à direita em direção ao LSB com preenchimento de extensão de sinal em direção ao MSB (Q8.23) ou justificados à esquerda em direção ao MSB com preenchimento de zero em direção ao LSB (Q0.31). Q0.31 teoricamente permite até 32 bits significativos, mas as interfaces de hardware que aceitam Q0.31 raramente usam todos os bits.
  3. O ponto flutuante de precisão simples tem 23 bits explícitos mais um bit oculto e um bit de sinal, resultando em um total de 25 bits significativos. Números denormal têm menos bits significativos.
  4. O ponto flutuante de precisão simples pode expressar valores de até ± 1,7e + 38, o que explica o grande espaço livre.
  5. A faixa dinâmica mostrada é para denormais até o valor máximo nominal ± 1,0. Note-se que algumas implementações ponto flutuante específicas de arquitetura, como NEON não suportam denormals.

Conversões

Esta seção discute as conversões de dados entre várias representações.

Conversões de ponto flutuante

Para converter um valor de Q m. n formato de ponto flutuante:

  1. Converta o valor em ponto flutuante como se fosse um inteiro (ignorando o ponto).
  2. Multiplicar 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 simples tem uma faixa nominal de ± 1,0, mas a faixa completa para valores intermediários é ± 1,7e + 38. A conversão entre ponto flutuante e ponto fixo para representação externa (como saída para dispositivos de áudio) considerará apenas a faixa nominal, com fixação para valores que excedam essa faixa. Em particular, quando +1,0 é convertido para um formato de ponto fixo, é fixado em +1,0 menos um LSB.
  • Denormais (subnormais) e ambos +/- 0,0 são permitidos na representação, mas podem ser convertidos silenciosamente para 0,0 durante o processamento.
  • Os infinitos passarão pelas operações ou serão silenciosamente limitados a +/- 1.0. Geralmente, o último é para conversão para um formato de ponto fixo.
  • O comportamento de NaN é indefinido: um NaN pode se propagar como um NaN idêntico, ou pode ser convertido em um NaN padrão, pode ser silenciosamente limitado a +/- 1,0, ou silenciosamente convertido em 0,0, ou resultar em um erro.

Conversões de pontos fixos

As conversões entre diferentes Q m. n formatos seguir estas regras:

  • Quando m é aumentada, sinal estender a parte inteira na esquerda.
  • Quando m é diminuída, prender a parte inteira.
  • Quando n é aumentada, de zero estender a parte fraccionada à direita.
  • Quando n é diminuído, quer pontilhamento, redonda, ou truncar o excesso de bits fraccionai a direita.

Por exemplo, para converter um valor Q4.27 em Q0.15 (sem pontilhamento ou arredondamento), desloque para a direita o valor Q4.27 em 12 bits e fixe quaisquer resultados que excedam o intervalo sinalizado de 16 bits. Isso alinha o ponto da representação Q.

Para converter Q7.24 para Q7.23, fazer uma divisão assinado por 2, ou equivalentemente adicionar o bit de sinal à quantidade Q7.24 inteiro, e em seguida, assinou deslocamento para a direita por 1. Observe que um simples assinado deslocamento para a direita não é equivalente a uma divisão assinada por 2.

Conversões com e sem perdas

A conversão é sem perdas, se for invertida , a conversão de A para B para C resultados em A = C . Caso contrário, a conversão é com perdas .

Conversões Lossless permitir a conversão do formato round-trip .

As conversões de representação de ponto fixo com 25 ou menos bits significativos para ponto flutuante são sem perdas. As conversões de ponto flutuante para qualquer representação comum de ponto fixo apresentam perdas.