Formato dei dati

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:

Notazione
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:

  1. 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 .
  2. 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.
  3. 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.
  4. La virgola mobile a precisione singola può esprimere valori fino a ±1,7e+38, il che spiega l'ampio margine.
  5. 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:

  1. Converti il ​​valore in virgola mobile come se fosse un numero intero (ignorando il punto).
  2. 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.