Android utilizza internamente un'ampia gamma di formati di dati audio ed espone un sottoinsieme di questi nelle API pubbliche, nei formati file e nell'Hardware Abstraction Layer (HAL).
Proprietà
I formati dei dati audio sono classificati in base alle loro proprietà:
- Compressione
- Non compresso, con compressione senza perdita di dati o con compressione con perdita di dati. PCM è il formato audio non compresso più comune. FLAC è un formato compresso senza perdita di dati, mentre MP3 e AAC sono formati compressi con perdita di dati.
- Profondità di bit
- Numero di bit significativi per campione audio.
- Dimensioni del contenitore
- Numero di bit utilizzati per memorizzare o trasmettere un campione. In genere corrisponde alla profondità di bit, ma a volte vengono allocati i bit di spaziatura interna aggiuntivi per l'allineamento. Ad esempio, un campione a 24 bit potrebbe essere contenuto in una parola a 32 bit.
- Allineamento
- Se la dimensione del contenitore è esattamente uguale alla profondità di bit, la representation è chiamata pacchettizzata. In caso contrario, la rappresentazione viene spacchettata. I bit significativi del campione sono in genere alinhati con il bit più a sinistra (più significativo) o più a destra (meno significativo) del contenitore. È consuetudine utilizzare i termini pacchettizzato e spacchettato solo quando la profondità di bit non è una potenza di due.
- Firma
- Indica se i sample sono firmati o meno.
- Rappresentazione
- Punto fisso o virgola mobile; vedi di seguito.
Rappresentazione a virgola fissa
Il punto fisso è la rappresentazione più comune per i dati audio PCM non compressi, soprattutto nelle interfacce hardware.
Un numero a virgola fissa ha un numero fisso (costante) di cifre prima e dopo la virgola di frazione. Tutte le nostre rappresentazioni utilizzano la base 2, quindi sostituiamo bit con cifra e virgola binaria o semplicemente virgola con virgola di frazione. I bit a sinistra del punto rappresentano la parte intera e quelli a destra del punto rappresentano la parte frazionaria.
Parliamo di PCM intero perché i valori a virgola fissa vengono solitamente memorizzati e manipolati come valori interi. L'interpretazione come a virgola fissa è implicita.
Utilizziamo il complemento a due per tutte le rappresentazioni a virgola fissa con segno, pertanto vale quanto segue se tutti i valori sono in unità di un LSB:
|largest negative value| = |largest positive value| + 1
Notazione Q e U
Esistono varie notazioni per la rappresentazione a virgola fissa in un numero intero. Utilizziamo la notazione Q: Qm.n indica m bit interi e n bit frazionari. "Q" viene conteggiato come un bit, anche se il valore è espresso in complemento a due. Il numero totale di bit è m + n + 1.
Um.n è per i numeri senza segno: m bit interi e n bit frazionari, e "U" viene conteggiato come zero bit. Il numero totale di bit è m + n.
La parte intera può essere utilizzata nel risultato finale o essere temporanea. In quest'ultimo caso, i bit che compongono la parte intera sono chiamati bit di guardia. I bit di guardia consentono un overflow di un calcolo intermedio, purché il valore finale rientri nell'intervallo o possa essere limitato in modo da rientrare nell'intervallo. Tieni presente che i bit di guardia a virgola fissa si trovano a sinistra, mentre le cifre di guardia dell'unità a virgola mobile vengono utilizzate per ridurre l'errore di arrotondamento e si trovano a destra.
Rappresentazione in virgola mobile
Il punto fluttuante è un'alternativa al punto fisso, in cui la posizione del punto può variare. I principali vantaggi del numero in virgola mobile includono:
- Maggiore headroom e gamma dinamica; l'aritmetica in virgola mobile tollera il superamento degli intervalli nominali durante il calcolo intermedio e limita i valori solo alla fine
- Supporto di valori speciali come infiniti e NaN
- Più facile da usare in molti casi
In passato, l'aritmetica a virgola mobile era più lenta dell'aritmetica a virgola fissa o a virgola fissa, ma ora è comune che l'aritmetica a virgola mobile sia più veloce, a condizione che le decisioni relative al flusso di controllo non si basino sul valore di un calcolo.
Formati Android per l'audio
I principali formati Android per l'audio sono elencati nella tabella seguente:
Proprietà | Q0,15 | Q0,7 1 | Q0.23 | Q0,31 | galleggiare | |
---|---|---|---|---|---|---|
Container bits |
16 | 8 | 24 o 32 2 | 32 | 32 | |
Bit significativi incluso il segno |
16 | 8 | 24 | 24 o 32 2 | 25 3 | |
Headroom in dB |
0 | 0 | 0 | 0 | 126 4 | |
Gamma dinamica in dB |
90 | 42 | 138 | Da 138 a 186 | 900 5 |
Tutti i formati a virgola fissa sopra indicati hanno un intervallo nominale compreso tra -1,0 e +1,0 meno un LSB. Esiste un valore negativo in più rispetto al valore positivo a causa della representatione in complemento a due.
Note a piè di pagina:
-
Tutti i formati riportati sopra esprimono valori di esempio firmati.
Il formato a 8 bit è comunemente chiamato "senza segno", ma
in realtà è un valore con segno con un bias di
0.10000000
. - Q0.23 può essere impacchettato in 24 bit (tre byte di 8 bit, little-endian) o simballato in 32 bit. Se non sono stati scompattati, i bit significativi sono giustificati a destra verso il LSB con spaziatura di estensione del segno verso il MSB (Q8.23), o giustificati a sinistra verso il MSB con riempimento di zeri verso il LSB (Q0.31). Q0.31 consente teoricamente fino a 32 bit significativi, ma le interfacce hardware che accettano Q0.31 raramente utilizzano tutti i bit.
- Il numero in virgola mobile a precisione singola ha 23 bit espliciti più un bit nascosto e un bit di segno, per un totale di 25 bit significativi. I numeri non normalizzati hanno meno bit significativi.
- Il numero in virgola mobile a precisione singola può esprimere valori fino a ±1,7e+38, il che spiega l'ampio margine di manovra.
- L'intervallo dinamico mostrato è per i valori non normalizzati fino al valore massimo nominale ±1,0. Tieni presente che alcune implementazioni di numeri in virgola mobile specifiche dell'architettura, come NEON non supportano i valori non normalizzati.
Conversioni
Questa sezione illustra le conversioni dei dati tra varie rappresentazioni.
Conversioni in virgola mobile
Per convertire un valore dal formato Qm.n a virgola mobile:
- Converti il valore in virgola mobile come se fosse un numero intero (ignorando il punto).
- Moltiplica per 2-n.
Ad esempio, per convertire un valore interno Q4.27 in virgola mobile, utilizza:
float = integer * (2 ^ -27)
Le conversioni da virgola mobile a virgola fissa seguono queste regole:
- La rappresentazione in virgola mobile a precisione singola ha un intervallo nominale di ±1,0, ma l'intervallo completo per i valori intermedi è ±1,7e+38. La conversione tra virgola mobile e virgola fissa per la rappresentazione esterna (ad esempio l'output su dispositivi audio) prenderà in considerazione solo l'intervallo nominale, con clamping per i valori che superano questo intervallo. In particolare, quando +1,0 viene convertito in un formato a virgola fissa, viene limitato a +1,0 meno un LSB.
- I valori non normali (subnormali) e +/- 0,0 sono consentiti nella rappresentazione, ma possono essere convertiti in silenzio in 0,0 durante l'elaborazione.
- Gli infiniti verranno trasmessi alle operazioni o verranno limitati in modo silenzioso a +/- 1,0. Generalmente, quest'ultimo è destinato alla conversione in un formato a virgola fissa.
- Il comportamento di NaN non è definito: un valore NaN può essere propagato come un NaN identico, può essere convertito in un NaN predefinito, può essere limitato in modo silenzioso a +/- 1, 0 o convertito in modo silenzioso in 0, 0 oppure può generare un errore.
Conversioni a virgola fissa
Le conversioni tra diversi formati Qm.n seguono queste regole:
- Quando m aumenta, estendi il segno della parte intera a sinistra.
- Quando m diminuisce, blocca la parte intera.
- Quando n aumenta, lo zero estende la parte frazionaria a destra.
- Quando n viene diminuito, applica il dither, arrotonda o tronca i bit frazionari in eccesso a destra.
Ad esempio, per convertire un valore Q4.27 in Q0.15 (senza dither o arrotondamento), sposta a destra il valore Q4.27 di 12 bit e blocca tutti i risultati che superano l'intervallo a 16 bit con segno. Questo allinea il punto della representatione di Q.
Per convertire Q7.24 in Q7.23, esegui una divisione con resto per 2, oppure, in modo equivalente, aggiungi il bit di segno alla quantità intera Q7.24, quindi esegui uno spostamento a destra con segno di 1. Tieni presente che un semplice scorrimento a destra con segno non è equivalente a una divisione con segno per 2.
Conversioni con perdita di dati e senza perdita di dati
Una conversione è senza perdita di dati se è
invertible:
una conversione da A
a B
a
C
genera A = C
.
In caso contrario, la conversione è con perdita.
Le conversioni senza perdita di dati consentono la conversione del formato avanti e indietro.
Le conversioni dalla rappresentazione a virgola fissa con massimo 25 bit significativi a virgola mobile sono senza perdita di dati. Le conversioni da virgola mobile a qualsiasi rappresentazione comune a virgola fissa sono con perdita.