Formati dei dati

Android utilizza un'ampia varietà di audio formati dei dati internamente ed espone un sottoinsieme di questi in API pubbliche, formati file, e ai HAL (Hardware Abstraction Layer) (HAL).

Proprietà

I formati dei dati audio sono classificati in base alle loro proprietà:

Compressione
Non compresso, compresso senza perdita di dati, o compresso con perdita di dati. PCM è il formato audio non compresso più comune. Il file FLAC è un file compresso senza perdita mentre MP3 e AAC sono formati compressi con perdita di dati.
Profondità di bit
Numero di bit significativi per campione audio.
Dimensioni contenitore
Numero di bit utilizzati per memorizzare o trasmettere un campione. Di solito equivale alla profondità di bit, ma a volte anche i bit di spaziatura interna sono allocati per l'allineamento. Ad esempio, un Un campione a 24 bit potrebbe essere contenuto in una parola a 32 bit.
Allineamento
Se le dimensioni del container corrispondono esattamente alla profondità di bit, una rappresentazione è chiamata compressa. In caso contrario, la rappresentazione è non pacchettizzato. I bit significativi del campione sono in genere in linea con l'opzione più a sinistra (più significativa) o quella più a destra (meno significativo) del container. È convenzionale usare i termini packed e unpacked solo quando la parte la profondità non è una potenza di due.
Firma
Indica se i campioni sono firmati o meno.
Rappresentazione
Punto fisso o rappresentazione in virgola mobile vedi sotto.

Rappresentazione del punto fisso

Punto fisso è la rappresentazione più comune per i dati audio PCM non compressi, soprattutto nelle interfacce hardware.

Un numero a punto fisso ha un numero fisso di cifre prima e dopo il punto radix. Tutte le nostre rappresentazioni utilizzano base 2, quindi sostituisci bit con cifra, e binary point o semplicemente point per radix point. I bit a sinistra del punto sono la parte intera, e le punte a destra del punto 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 punto fisso firmate, quindi quanto segue vale dove tutti i valori sono in unità di uno LSB:

|largest negative value| = |largest positive value| + 1

Notazione Q e U

Esistono vari notazioni per la rappresentazione a punto fisso in un numero intero. Utilizziamo la notazione Q: Qm.n indica m bit interi e n bit frazionari. La "Q" conta come un bit, anche se il valore è espresso nel complemento a due. Il numero totale di bit è m + n + 1.

Um.n si riferisce ai numeri non firmati: m bit interi e n bit frazionari, e la "U" viene conteggiato come zero bit. Il numero totale di bit è m + n.

La parte intera può essere utilizzata nel risultato finale oppure essere temporanea. Nel secondo caso, i bit che compongono la parte intera vengono chiamati punti di guardia. I bit di guardia consentono l'overflow di un calcolo intermedio, purché il valore finale rientri nell'intervallo o possa essere bloccato in modo che rientri nell'intervallo. Nota che i bit di guardia a punto fisso si trovano a sinistra, mentre l'unità a virgola mobile cifre di guardia sono utilizzati per ridurre gli errori di arrotondamento e si trovano a destra.

Rappresentazione con rappresentazione in virgola mobile

Virgola mobile è un'alternativa al punto fisso, in cui la posizione del punto può variare. I vantaggi principali della rappresentazione in virgola mobile includono:

  • Margine maggiore e Dynamic Range; tolleranze aritmetiche in virgola mobile che superano gli intervalli nominali durante il calcolo intermedio e blocca solo i valori alla fine
  • Supporto di valori speciali come l'infinito e il NaN
  • Maggiore facilità di utilizzo in molti casi

Storicamente, l'aritmetica in virgola mobile era più lenta di un numero intero o di un punto fisso aritmetica, ma ora è comune che il valore in virgola mobile sia più veloce, le decisioni del flusso di controllo fornite non si basano sul valore di un calcolo.

Formati Android per l'audio

Nella tabella che segue sono elencati i principali formati Android per l'audio:

Notazione
Proprietà D0.15 D0.7 1 D0.23 D0.31 in virgola mobile
Bit
contenitore
16 8 24 o 322 32 32
Parti significative
con segno
16 8 24 24 o 322 25 3
Margine
in dB
0 0 0 0 126 4
Intervallo dinamico
in dB
90 42 138 Da 138 a 186 900 5

Tutti i formati a punto fisso sopra riportati 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 del rappresentazione in complemento di due.

Note a piè di pagina:

  1. Tutti i formati precedenti esprimono valori di esempio con segno. Il formato a 8 bit è comunemente chiamato "non firmato", ma in realtà è un valore con segno con bias di 0.10000000.
  2. Q0.23 può essere pacchettizzato in 24 bit (tre byte a 8 bit, Litt-endian) o a 32 bit. Se non pacchettizzati, i bit significativi sono giustificati a destra verso l’LSB con l’estensione del segno di spaziatura verso l’MSB (Q8.23), o giustificato a sinistra verso l'MSB con riempimento zero verso l'LSB (D0.31). Q0.31 consente teoricamente fino a 32 bit significativi, ma le interfacce hardware che accettano Q0.31 raramente usano tutti i bit.
  3. La rappresentazione 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. Numeri denormali ci sono meno bit significativi.
  4. La rappresentazione in virgola mobile a precisione singola può esprimere valori fino a ±1,7e+38, il che spiega il grande margine.
  5. L'intervallo dinamico mostrato riguarda le denormali fino al massimo nominale valore ±1,0. Tieni presente che alcune implementazioni in virgola mobile specifiche dell'architettura, come ad esempio NEON non supportano i valori denormali.

Conversioni

Questa sezione tratta conversioni di dati tra varie rappresentazioni.

Conversioni con virgola mobile

Per convertire un valore dal formato Qm.n al formato in virgola mobile:

  1. Converti il valore in rappresentazione in virgola mobile come se fosse un numero intero (ignorando il punto).
  2. Moltiplica per 2-n.

Ad esempio, per convertire un valore interno Q4.27 in rappresentazione in virgola mobile, utilizza:

float = integer * (2 ^ -27)

Le conversioni da virgola mobile a punto fisso 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. Conversione tra rappresentazione in virgola mobile e punto fisso per la rappresentazione esterna (come l'output ai dispositivi audio) prenderà in considerazione solo l'intervallo nominale, con blocco per i valori che superano questo intervallo. In particolare, quando si converte +1.0 in un formato a punto fisso, viene bloccato su +1,0 meno un LSB.
  • Nella rappresentazione sono ammessi sia i denormali (subnormali) sia +/- 0,0. ma potrebbe essere automaticamente convertita a 0,0 durante l'elaborazione.
  • Gli infiniti passeranno attraverso le operazioni o saranno silenziosamente limitati a +/- 1,0. il secondo è per la conversione in un formato a punto fisso.
  • Il comportamento dei NaN non è definito: un NaN può propagarsi come un NaN identico oppure convertiti in NaN predefinito, possono essere limitati a +/- 1, 0 o automaticamente a 0, 0 o generare un errore.

Conversioni a punto fisso

Le conversioni tra i diversi formati Qmn seguono queste regole:

  • Quando m aumenta, il segno estende la parte intera a sinistra.
  • Quando m diminuisce, blocca la parte intera.
  • Quando n aumenta, zero estende la parte frazionaria a destra.
  • Quando n è diminuito, 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 l'arrotondamento), sposta a destra il valore di Q4.27 di 12 bit e blocca tutti i risultati che superano l'intervallo con segno a 16 bit. In questo modo il punto Rappresentazione D.

Per convertire D7.24 in D7.23, dividere con segno per 2, o equivalente, aggiungi il bit di segno alla quantità intera Q7.24, quindi firma lo spostamento a destra di 1. Tieni presente che un semplice spostamento a destra firmato non equivale a una divisione con segno per 2.

Conversioni con perdita e senza perdita

Una conversione è senza perdita se è invertibile: di una conversione da A a B a C risultati in A = C. In caso contrario, la conversione è in perdita.

Autorizzazione per le conversioni senza perdita di dati conversione del formato round-trip.

Le conversioni da una rappresentazione a punto fisso con un massimo di 25 bit significativi a una rappresentazione in virgola mobile sono senza perdita di dati. Le conversioni da rappresentazione in virgola mobile a qualsiasi rappresentazione in virgola fissa comune sono con perdita di dati.