Android usa una amplia variedad de audio formatos de datos de forma interna y expone un subconjunto de estos en APIs públicas, formatos de archivo, y las Capa de abstracción de hardware (HAL).
Propiedades
Los formatos de datos de audio se clasifican según 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 una tecnología sin pérdida mientras que MP3 y AAC son formatos comprimidos con pérdida.
- Profundidad de bits
- Cantidad de bits significativos por muestra de audio.
- Tamaño del contenedor
- Cantidad de bits que se usan para almacenar o transmitir una muestra. Precio habitual es igual a la profundidad de bits, pero a veces los bits de relleno se asignan para la alineación. Por ejemplo, un La muestra de 24 bits puede estar incluida en una palabra de 32 bits.
- Alineación
- Si el tamaño del contenedor es exactamente igual a la profundidad de bits, el la representación se denomina empaquetada. De lo contrario, la representación desempaquetado. Por lo general, las partes importantes de la muestra alineado con el extremo izquierdo (el más significativo) o el derecho (menos importante) del contenedor. Es convencional usar los términos empaquetado y desempaquetado solo cuando el bit la profundidad no es un la potencia de dos.
- Firma
- Indica si las muestras están firmadas o no.
- Representación
- Punto fijo o flotante consulta a continuación.
Representación de punto fijo
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 una cantidad fija (constante) de dígitos. antes y después del punto de radiación. Todas nuestras representaciones usan Base 2, Sustituimos bit por digit, y punto binario o, simplemente, punto para punto de radiación. Los bits a la izquierda del punto son la parte entera, y los bits a la derecha del punto son las parte fraccionaria.
Hablamos de PCM con número entero porque los valores de punto fijo por lo general, se almacenan y manipulan como valores de números enteros. La interpretación como punto fijo es implícita.
Usamos el complemento de dos para todas las representaciones de punto fijo firmadas, donde todos los valores están en unidades de uno LSB:
|largest negative value| = |largest positive value| + 1
Notación Q y U
Existen varios tipos notaciones para la representación de punto fijo en un número entero. Usamos la notación Q: Qm.n significa m bits enteros y n bits fraccionarios. La “Q” cuenta como un bit, aunque el valor se expresa en un complemento de dos. La cantidad total de bits es m + n + 1.
Um.n es para números sin signo: m bits enteros y n bits fraccionarios, y la "U" cuenta como cero bits. La cantidad total de bits es m + n.
La parte entera se puede usar en el resultado final o ser temporal. En este último caso, los bits que conforman la parte de número entero 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 lo esté. Ten en cuenta que los bits de protección de punto fijo están a la izquierda, mientras que la unidad de punto flotante dígitos de guarda se usan para reducir el error de redondeo y están a la derecha.
Representación de punto flotante
Punto flotante es una alternativa al punto fijo, en el que la ubicación del punto puede variar. Estas son algunas de las ventajas principales del punto flotante:
- Mayor margen y rango dinámico; la aritmética de punto flotante tolera que excede los rangos nominales durante el procesamiento intermedio y solo fija los valores al final
- Compatibilidad con valores especiales como infinitos y NaN
- Son más fáciles de usar en muchos casos.
Históricamente, la aritmética de punto flotante era más lenta que los números enteros o el punto fijo. aritmética, 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
En la siguiente tabla, se enumeran los principales formatos de audio de Android:
Propiedad | P0.15 | P0.7 1 | P0.23 | P0.31 | float | |
---|---|---|---|---|---|---|
Bits del contenedor |
16 | 8 | 24 o 322 | 32 | 32 | |
Puntos significativos incluido el signo |
16 | 8 | 24 | 24 o 322 | 25 3 | |
Margen en dB |
0 | 0 | 0 | 0 | 126 4 | |
Rango dinámico en dB |
90 | 42 | 138 | De 138 a 186 | 900 5 |
Todos los formatos de punto fijo anteriores tienen un rango nominal de -1.0 a +1.0 menos un LSB. Existe un valor negativo más que positivo debido al del complemento de dos.
Notas al pie:
-
Todos los formatos anteriores expresan los valores de muestra firmados.
Por lo general, el formato de 8 bits se denomina "sin firma", pero
en realidad es un valor firmado con un sesgo de
0.10000000
. - Q0.23 puede empaquetarse en 24 bits (tres bytes de 8 bits, small-endian) o puede desempaquetarse en 32 bits. Si se descomprimen, los bits significativos se justifican a la derecha hacia el LSB con relleno de extensión de signo hacia el MSB (Q8.23), o justificado a la izquierda hacia el MSB sin relleno hacia el LSB (P0.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.
- El punto flotante de precisión simple tiene 23 bits explícitos más un bit oculto y el bit de signo. lo que da como resultado 25 bits significativos en total. Números desnormales tienen menos bits significativos.
- El punto flotante con precisión simple puede expresar valores de hasta ±1.7e+38, lo que explica el amplio margen.
- El rango dinámico que se muestra corresponde a denormales hasta el máximo nominal valor ±1.0. Ten en cuenta que algunas implementaciones de punto flotante específicas de la arquitectura, NEON no son compatibles con los denormales.
Conversiones
En esta sección, se analizan conversiones de datos entre varias representaciones.
Conversiones de punto flotante
Para convertir un valor de formato Qm.n a punto flotante, haz lo siguiente:
- Convierte el valor en punto flotante como si fuera un número entero (ignorando el punto).
- Multiplica por 2-n.
Por ejemplo, para convertir un valor interno del Q4.27 en punto flotante, usa lo siguiente:
float = integer * (2 ^ -27)
Las conversiones de punto flotante a punto fijo siguen estas reglas:
- El número de punto flotante con precisión simple tiene un rango nominal de ±1.0, pero el rango completo para los valores intermedios es ±1.7e+38. Conversión entre el punto flotante y el punto fijo para la representación externa (como la salida a dispositivos de audio) considerará solo el rango nominal, con la restricción de los valores que exceden ese rango. En particular, cuando se convierte +1.0 a un formato de punto fijo, se fija en +1.0 menos un LSB.
- Se permiten en la representación los valores desnormales (subnormales) y +/- 0.0, pero puede convertirse en 0.0 sin emitir sonido durante el procesamiento.
- Los infinitos pasarán por las operaciones o se limitarán de forma silenciosa. a +/- 1.0. Por lo general, esta última opción se usa para la conversión a un formato de punto fijo.
- El comportamiento de NaN es indefinido: un NaN puede propagarse como un NaN idéntico o puede convertido en un NaN predeterminado, se puede limitar silenciosamente a +/- 1.0. se convertirá silenciosamente en 0.0, o dará como resultado un error.
Conversiones de puntos fijos
Las conversiones entre diferentes formatos de Qm.n siguen estas reglas:
- Cuando m aumenta, el signo extiende la parte del número entero a la izquierda.
- Cuando se reduce m, restringe la parte de número entero.
- Cuando n aumenta, cero extiende la parte fraccionaria a la derecha.
- Cuando se disminuye n, interpola, redondea o trunca los bits fraccionarios excedentes a la derecha.
Por ejemplo, para convertir un valor de Q4.27 a Q0.15 (sin interpolación o redondeo), desplazar a la derecha el valor Q4.27 por 12 bits y restringir los resultados que superen el rango de 16 bits con firma. Esto alinea el punto del Q.
Para convertir Q7.24 a Q7.23, haz una división por 2 con signo, o, de manera equivalente, agrega el bit de signo a la cantidad de números enteros Q7.24 y, luego, el signo de desplazamiento hacia la derecha en 1. Ten en cuenta que un simple desplazamiento hacia la derecha con signo no equivale a una división por 2 con signo.
Conversiones con y sin pérdidas
Una conversión no tiene pérdidas si tiene
invertible:
una conversión del A
al B
C
resulta en A = C
.
De lo contrario, la conversión es con pérdidas.
Permiso de conversiones sin pérdida conversión de formato de ida y vuelta.
Las conversiones de una representación de punto fijo con 25 bits significativos o menos a punto flotante no tienen pérdidas. Las conversiones de punto flotante a cualquier representación de punto fijo común tienen pérdidas.