Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Formatos de datos

Usos Android una amplia variedad de audio formatos de datos internamente, y expone un subconjunto de estos en API públicas, formatos de archivo , y el Hardware Abstraction Layer (HAL).

Propiedades

Los formatos de datos de audio se clasifican por sus propiedades:

Compresión
Sin comprimir , sin pérdida comprimido o con pérdida comprimido . PCM es el formato de audio sin comprimir más común. FLAC es un formato comprimido sin pérdida, mientras que MP3 y AAC son formatos comprimidos con pérdida.
Profundidad de bits
Número de bits significativos por muestra de audio.
Tamaño de contenedor
Número de bits utilizados para almacenar o transmitir una muestra. Por lo general, esto es lo mismo que la profundidad de bits, pero a veces se asignan bits de relleno adicionales para la alineación. Por ejemplo, una muestra de 24 bits podría estar contenida dentro de una palabra de 32 bits.
Alineación
Si el tamaño del contenedor es exactamente igual a la profundidad de bits, la representación se llama lleno. De lo contrario, la representación es descomprimido. Los bits significativos de la muestra normalmente se alinean con el bit más a la izquierda (más significativo) o más a la derecha (menos significativo) del contenedor. Es convencional para utilizar los términos embalado y desembalado sólo cuando la profundidad de bits no es una potencia de dos .
Firma
Si las muestras están firmadas o sin firmar.
Representación
Ya sea en coma fija o en coma flotante; vea abajo.

Representación de punto fijo

Punto fijo es la representación más común para datos de audio PCM sin compresión, especialmente en las interfaces de hardware.

Un número de coma fija tiene un (constante) número fijo de dígitos antes y después del punto de base . Todas nuestras representaciones usar base 2 , por lo sustituimos bits para dígitos y punto binario o simplemente punto por punto de base. Los bits a la izquierda del punto son la parte entera, y los bits a la derecha del punto son la parte fraccionaria .

Hablamos de PCM número entero, porque los valores de punto fijo generalmente se almacenan y se manipulan como valores enteros. La interpretación como punto fijo está implícita.

Utilizamos complemento a dos para todas las representaciones de punto fijo firmados, por lo que se cumple lo siguiente, donde todos los valores están en unidades de un LSB :

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

Notación Q y U

Hay varias notaciones para la representación de punto fijo en un número entero. Utilizamos Q notación : Q m. n medios m bits enteros y n bits fraccionarios. La "Q" cuenta como un bit, aunque el valor se expresa en complemento a dos. El número total de bits es m + n + 1.

U m. n es para números sin signo: m bits de enteros y n bits fraccionarios, y los recuentos de "U" como bits cero. El número total de bits es m + n.

La parte entera puede usarse en el resultado final o ser temporal. En este último caso, los bits que componen la parte entera se llaman bits de guardia. Los bits de guarda permiten que un cálculo intermedio se desborde, siempre que el valor final esté dentro del rango o se pueda fijar para que esté dentro del rango. Tenga en cuenta que los bits de guardia de punto fijo son a la izquierda, mientras que la unidad de punto flotante dígitos guardia se utilizan para reducir el error de redondeo y están a la derecha.

Representación de punto flotante

Punto flotante es una alternativa a punto fijo, en el que la ubicación del punto puede variar. Las principales ventajas del punto flotante incluyen:

  • Mayor espacio para la cabeza y el rango dinámico ; la aritmética de punto flotante tolera exceder los rangos nominales durante el cálculo intermedio, y solo fija los valores al final
  • Soporte para valores especiales como infinitos y NaN
  • Más fácil de usar en muchos casos

Históricamente, la aritmética de punto flotante era más lenta que la aritmética de números enteros o de punto fijo, pero ahora es común que el punto flotante sea más rápido, siempre que las decisiones de flujo de control no se basen en el valor de un cálculo.

Formatos de Android para audio

Los principales formatos de Android para audio se enumeran en la siguiente tabla:

Notación
Propiedad Q0.15 Q0.7 1 Q0.23 Q0.31 flotador
Envase
bits
dieciséis 8 24 o 32 2 32 32
Bits significativos
incluyendo letrero
dieciséis 8 24 24 o 32 2 25 3
Espacio para la cabeza
en dB
0 0 0 0 126 4
Gama dinámica
en dB
90 42 138 138 hasta 186 900 5

Todos los formatos de punto fijo anteriores tienen un rango nominal de -1,0 a +1,0 menos un LSB. Hay un valor más negativo que un valor positivo debido a la representación del complemento a dos.

Notas a pie de página:

  1. Todos los formatos anteriores expresan valores de muestra firmados. El formato de 8 bits se denomina comúnmente "sin firmar", pero en realidad es un valor firmado con sesgo de 0.10000000 .
  2. Q0.23 puede empaquetarse en 24 bits (tres bytes de 8 bits, little-endian) o descomprimirse en 32 bits. Si se desempaqueta, los bits significativos se justifican a la derecha hacia el LSB con relleno de extensión de signo hacia el MSB (Q8.23), o se justifican a la izquierda hacia el MSB con relleno de cero hacia el LSB (Q0.31). Q0.31 teóricamente permite hasta 32 bits significativos, pero las interfaces de hardware que aceptan Q0.31 rara vez usan todos los bits.
  3. El punto flotante de precisión simple tiene 23 bits explícitos más un bit oculto y un bit de signo, lo que da como resultado un total de 25 bits significativos. Denormal números tienen un menor número de bits significativos.
  4. El punto flotante de precisión simple puede expresar valores de hasta ± 1,7e + 38, lo que explica el gran margen de maniobra.
  5. El rango dinámico mostrado es para desnormales hasta el valor máximo nominal ± 1.0. Tenga en cuenta que algunas implementaciones de coma flotante arquitectura específicos como NEON no son compatibles con denormals.

Conversiones

Esta sección trata de las conversiones de datos entre diferentes representaciones.

Conversiones de punto flotante

Para convertir el valor de Q m. n formato de punto flotante:

  1. Convierta el valor a punto flotante como si fuera un número entero (ignorando el punto).
  2. Multiplicar por 2 - n.

Por ejemplo, para convertir un valor interno Q4.27 a punto flotante, use:

float = integer * (2 ^ -27)

Las conversiones de punto flotante a punto fijo siguen estas reglas:

  • El punto flotante de precisión simple tiene un rango nominal de ± 1.0, pero el rango completo para valores intermedios es ± 1.7e + 38. La conversión entre punto flotante y punto fijo para representación externa (como salida a dispositivos de audio) considerará solo el rango nominal, con sujeción para valores que excedan ese rango. En particular, cuando +1.0 se convierte a un formato de punto fijo, se limita a +1.0 menos un LSB.
  • En la representación se permiten los valores anormales (subnormales) y ambos +/- 0.0, pero se pueden convertir silenciosamente a 0.0 durante el procesamiento.
  • Los infinitos pasarán por operaciones o se limitarán silenciosamente a +/- 1.0. Generalmente, este último es para la conversión a un formato de punto fijo.
  • El comportamiento de NaN no está definido: un NaN se puede propagar como un NaN idéntico, o se puede convertir a un NaN predeterminado, se puede limitar silenciosamente a +/- 1.0, o convertir silenciosamente a 0.0, o dar como resultado un error.

Conversiones de punto fijo

Las conversiones entre diferentes Q m. n formatos siguen estas reglas:

  • Cuando se aumenta m, señal de extender la parte entera de la izquierda.
  • Cuando se disminuye m, sujetar la parte entera.
  • Cuando n se incrementa, cero extienden la parte fraccionaria de la derecha.
  • Cuando n es disminuido, ya sea dither, redondo, o truncar los bits sobrantes fraccionarias a la derecha.

Por ejemplo, para convertir un valor de Q4.27 en Q0.15 (sin tramado ni redondeo), cambie a la derecha el valor de Q4.27 en 12 bits y fije los resultados que excedan el rango con signo de 16 bits. Esto alinea el punto de la representación Q.

Para convertir Q7.24 a Q7.23, hacer una división firmado por 2, o equivalentemente añadir el bit de signo de la cantidad Q7.24 número entero, y luego firmado por el desplazamiento a la derecha 1. Tenga en cuenta que un simple desplazamiento a la derecha firmado no es equivalente a una división firmada por 2.

Conversiones con pérdida y sin pérdida

Una conversión es sin pérdidas si es invertible : una conversión de A a B a C resultados en A = C . De lo contrario la conversión es con pérdidas .

Conversiones sin pérdidas permiten la conversión del formato de ida y vuelta .

Las conversiones de representación de coma fija con 25 bits significativos o menos a coma flotante no tienen pérdidas. Las conversiones de punto flotante a cualquier representación de punto fijo común tienen pérdida.