Android utilizza internamente un'ampia varietà di formati di dati audio ed espone un sottoinsieme di questi nelle API pubbliche, nei formati di file e nell'Hardware Abstraction Layer (HAL).
Proprietà
I formati dei dati audio sono classificati in base alle loro proprietà:
- Compressione
- Non compresso , compresso senza perdita o compresso con perdita . PCM è il formato audio non compresso più comune. FLAC è un formato compresso senza perdita, mentre MP3 e AAC sono formati compressi con perdita.
- Profondità di bit
- Numero di bit significativi per campione audio.
- Dimensioni del contenitore
- Numero di bit utilizzati per memorizzare o trasmettere un campione. Di solito è uguale alla profondità in bit, ma a volte vengono allocati bit di riempimento 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à in bit, la rappresentazione viene detta imballata . Altrimenti la rappresentazione viene spacchettata . I bit significativi del campione sono generalmente allineati con il bit più a sinistra (più significativo) o più a destra (meno significativo) del contenitore. È convenzionale utilizzare i termini compresso e non compresso solo quando la profondità di bit non è una potenza di due .
- Firma
- Se i campioni sono firmati o non firmati.
- Rappresentazione
- O virgola fissa o virgola mobile; vedi sotto.
Rappresentazione del punto fisso
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 il punto radice . Tutte le nostre rappresentazioni utilizzano la base 2 , quindi sostituiamo bit con cifra e punto binario o semplicemente punto con punto radice . I bit a sinistra del punto sono la parte intera, mentre i bit a destra del punto sono la parte frazionaria .
Parliamo di PCM intero , perché i valori a virgola fissa vengono solitamente memorizzati e manipolati come valori interi. L'interpretazione come punto fisso è implicita.
Usiamo il complemento a due per tutte le rappresentazioni in virgola fissa con segno, quindi vale quanto segue dove 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 in virgola fissa in un numero intero. Usiamo la notazione Q : Q m . n significa m bit interi e n bit frazionari. La "Q" conta come un bit, sebbene il valore sia espresso in complemento a due. Il numero totale di bit è m + n + 1.
Uhm . n è per numeri senza segno: m bit interi e n bit frazionari e la "U" conta come bit zero. 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 vengono detti bit di guardia . I bit di guardia consentono l'overflow di un calcolo intermedio, purché il valore finale rientri nell'intervallo o possa essere bloccato per rientrare nell'intervallo. Si noti che i bit di guardia a virgola fissa sono a sinistra, mentre le cifre di guardia unitaria a virgola mobile vengono utilizzate per ridurre l'errore di arrotondamento e sono a destra.
Rappresentazione in virgola mobile
La virgola mobile è un'alternativa alla virgola fissa, in cui la posizione del punto può variare. I principali vantaggi della virgola mobile includono:
- Maggiore headroom e gamma dinamica ; l'aritmetica in virgola mobile tollera il superamento degli intervalli nominali durante il calcolo intermedio e blocca i valori solo alla fine
- Supporto per valori speciali come infiniti e NaN
- Più facile da usare in molti casi
Storicamente, l'aritmetica in virgola mobile era più lenta dell'aritmetica dei numeri interi o della virgola fissa, ma ora è comune che l'aritmetica in virgola mobile sia più veloce, a condizione che le decisioni sul flusso di controllo non siano basate 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.71 | Q0.23 | Q0.31 | galleggiante | |
---|---|---|---|---|---|---|
Contenitore bit | 16 | 8 | 24 o 322 | 32 | 32 | |
Pezzi significativi compreso il segno | 16 | 8 | 24 | 24 o 322 | 253 | |
Altezza libera in dB | 0 | 0 | 0 | 0 | 1264 | |
Gamma dinamica in dB | 90 | 42 | 138 | 138-186 | 9005 |
Tutti i formati a virgola fissa sopra indicati hanno un intervallo nominale compreso tra -1,0 e +1,0 meno un LSB. C'è un valore negativo in più rispetto al valore positivo a causa della rappresentazione del complemento a due.
Note a piè di pagina:
- Tutti i formati sopra indicati esprimono valori campione con segno. Il formato a 8 bit è comunemente chiamato "senza segno", ma in realtà è un valore con segno con bias di
0.10000000
. - Q0.23 può essere compresso in 24 bit (tre byte da 8 bit, little-endian) o decompresso in 32 bit. Se non imballati, i bit significativi sono giustificati a destra verso l'LSB con riempimento di estensione del segno verso l'MSB (Q8.23), oppure giustificati a sinistra verso l'MSB con riempimento zero verso l'LSB (Q0.31). Q0.31 teoricamente consente fino a 32 bit significativi, ma le interfacce hardware che accettano Q0.31 raramente utilizzano tutti i bit.
- La 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 denormali hanno meno bit significativi.
- La virgola mobile a precisione singola può esprimere valori fino a ±1,7e+38, il che spiega l'ampio margine.
- La gamma dinamica mostrata è per denormali fino al valore massimo nominale ±1,0. Tieni presente che alcune implementazioni in virgola mobile specifiche dell'architettura come NEON non supportano i denormal.
Conversioni
In questa sezione vengono illustrate le conversioni dei dati tra varie rappresentazioni.
Conversioni in virgola mobile
Per convertire un valore da Q m . n formato in virgola mobile:
- Converti il valore in virgola mobile come se fosse un numero intero (ignorando il punto).
- Moltiplicare per 2 - n .
Ad esempio, per convertire un valore interno Q4.27 in virgola mobile, utilizzare:
float = integer * (2 ^ -27)
Le conversioni da virgola mobile a virgola fissa seguono queste regole:
- La 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 (come l'output su dispositivi audio) prenderà in considerazione solo l'intervallo nominale, con il blocco dei valori che superano tale intervallo. In particolare, quando +1.0 viene convertito in un formato a virgola fissa, viene limitato a +1.0 meno un LSB.
- Nella rappresentazione sono consentiti valori denormali (subnormali) ed entrambi +/- 0,0, ma possono essere convertiti silenziosamente in 0,0 durante l'elaborazione.
- Gli infiniti passeranno attraverso le operazioni o saranno silenziosamente limitati a +/- 1.0. Generalmente quest'ultimo serve per la conversione in un formato a virgola fissa.
- Il comportamento NaN non è definito: un NaN può propagarsi come un NaN identico o può essere convertito in un NaN predefinito, può essere limitato in modo rigido a +/- 1,0 o convertito in modo silenzioso a 0,0 oppure generare un errore.
Conversioni di punto fisso
Conversioni tra diversi Q m . I formati n seguono queste regole:
- Quando m viene aumentato, il segno estende la parte intera a sinistra.
- Quando m viene diminuito, bloccare la parte intera.
- Quando n viene aumentato, lo zero estende la parte frazionaria a destra.
- Quando n viene diminuito, eseguire il dithering, arrotondare o troncare i bit frazionari in eccesso a destra.
Ad esempio, per convertire un valore Q4.27 in Q0.15 (senza dithering o arrotondamento), spostare a destra il valore Q4.27 di 12 bit e bloccare tutti i risultati che superano l'intervallo con segno a 16 bit. Questo allinea il punto della rappresentazione Q.
Per convertire Q7.24 in Q7.23, eseguire una divisione con segno per 2, o in modo equivalente aggiungere il bit del segno alla quantità intera Q7.24, quindi spostare a destra con segno di 1. Si noti che un semplice spostamento a destra con segno non è equivalente a una divisione con segno per 2.
Conversioni con e senza perdite
Una conversione è senza perdite se è invertibile : una conversione da A
a B
a C
risulta in A = C
Altrimenti la conversione è con perdita .
Le conversioni senza perdita di dati consentono la conversione del formato di andata e ritorno .
Le conversioni dalla rappresentazione in virgola fissa con 25 o meno bit significativi alla rappresentazione in virgola mobile sono senza perdite. Le conversioni dalla virgola mobile a qualsiasi rappresentazione in virgola fissa comune sono con perdita di dati.