Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Formatos de datos

Android utiliza una amplia variedad de formatos de datos de audio internamente y expone un subconjunto de estos en API públicas, formatos de archivo y la capa de abstracción de hardware (HAL).

Propiedades

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

Compresión
Sin comprimir , comprimido sin pérdida o comprimido con pérdida . 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 en 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 empaquetada . De lo contrario, la representación se desempaqueta . Los bits significativos de la muestra suelen estar alineados con el bit más a la izquierda (más significativo) o el más a la derecha (menos significativo) del contenedor. Es convencional usar los términos empaquetado y desempaquetado solo cuando la profundidad de bits no es una potencia de dos .
Firma
Si las muestras están firmadas o no firmadas.
Representación
Ya sea en coma fija o en coma flotante; vea abajo.

Representación de punto fijo

El punto fijo es la representación más común para datos de audio PCM sin comprimir, especialmente en interfaces de hardware.

Un número de punto fijo tiene un número fijo (constante) de dígitos antes y después del punto de base . Todas nuestras representaciones usan base 2 , así que sustituimos bit por dígito 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 de enteros , porque los valores de punto fijo generalmente se almacenan y manipulan como valores enteros. La interpretación como punto fijo está implícita.

Usamos el complemento a dos para todas las representaciones de punto fijo con signo, por lo que lo siguiente es válido cuando 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. Usamos la notación Q: Q m . n significa m bits enteros yn 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 enteros yn bits fraccionarios, y la "U" cuenta 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 el último caso, los bits que componen la parte entera se denominan bits de guarda . 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 guarda de coma fija están a la izquierda, mientras que los dígitos de guardia de la unidad de coma flotante se utilizan para reducir el error de redondeo y están a la derecha.

Representación de punto flotante

El punto flotante es una alternativa al 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 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 importantes
incluyendo signo
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 positivo debido a la representación del complemento a dos.

Notas al pie:

  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 con signo con un sesgo de 0.10000000 .
  2. Q0.23 se puede empaquetar en 24 bits (tres bytes de 8 bits) o desempaquetar 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. Los números desnormales tienen menos 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 punto flotante específicas de la arquitectura, como NEON , no admiten desnormales.

Conversiones

Esta sección analiza las conversiones de datos entre varias representaciones.

Conversiones de punto flotante

Para convertir un valor de Q m . n formato a 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 pueden convertirse silenciosamente a 0.0 durante el procesamiento.
  • Los infinitos pasarán por las operaciones o se limitarán silenciosamente a +/- 1.0. Generalmente, el ú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

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 m disminuye, apriete la parte entera.
  • Cuando n se incrementa, cero extienden la parte fraccionaria de la derecha.
  • Cuando n se reduce, dithering, round o trunca el exceso de bits fraccionarios a la derecha.

Por ejemplo, para convertir un valor Q4.27 en Q0.15 (sin tramado ni redondeo), cambie a la derecha el valor 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 en Q7.23, haga una división con signo entre 2 o, de manera equivalente, sume el bit de signo a la cantidad entera de Q7.24 y luego el desplazamiento a la derecha con signo en 1. Tenga en cuenta que un desplazamiento a la derecha con signo simple no es equivalente a una división firmada por 2.

Conversiones con pérdida y sin pérdida

Una conversión no tiene pérdidas si es invertible : una conversión de A a B a C da como resultado A = C De lo contrario, la conversión tiene pérdidas .

Las conversiones sin pérdida permiten la conversión de 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.