Floating point, le basi della codifica audio in virgola mobile.

Ciao, benvenuto nel mio blog. Oggi voglio parlarti della codifica numerica floating point, virgola mobile in italiano.

La codifica floating point comporta numerosi vantaggi. Molti Sequencer e attrezzature digitali hanno iniziato sfruttare la codifica in virgola mobile. In questo articolo ti spiegherò i concetti che stanno alla  sua base e i vantaggi che essa porta. 

Se non sai come il suono viene convertito da analogico a digitale ne ho parlato in questo articolo. 

Avventuriamoci inseme in questo “fantastico” mondo fatto di matematica e bit. Ma non ti preoccupare; cercherò di spiegarti il floating point e i concetti matematici nella maniera più semplice possibile.

la notazione scientifica

La codifica floating point deriva dalla notazione scientifica. Durante gli studi scientifici infatti è necessario eseguire i calcoli con numeri molto grandi oppure molto piccoli. Per eseguire questi calcoli è quindi più comodo rappresentare tali cifre con numeri in maniera esponenziale.

Nella notazione scientifica il valore viene scritto con un numero moltiplicato per una potenza in base 10. La base viene poi elevata alla potenza necessaria a rappresentare ordine di grandezza del numero. Possiamo riassumere il concetto con la seguente formula:

n x 10p

dove n è il numero decimale, p è la potenza in base 10 che descrive la grandezza di n.

Essendo il nostro sistema decimale la potenza in base 10 è comoda in quanto rappresenta il cambio di ordine di grandezza. Dieci unità fanno una decina, 10 decine fanno un centinaio e via discorrendo

Un numero elevato a 0 da come risultato 1, quindi qualsiasi numero naturale può essere interpretato come:

n x 100

Dove n rappresenta il numero. Facciamo un esempio:

35 x 100 = 35

Cambiando potenza possiamo rappresentare numeri decisamente maggiori:

35×101=350
35×102 = 3.500

Facciamo un esempio con un numero molto grande per capire meglio la e il suo reale utilizzo. Il numero 560.000.000.000 in notazione scientifica è rappresentabile come:

5.60×1011

L’elevamento a 11 rappresenta di quante posizioni si è spostata la virgola, e quindi la potenza a cui elevare la base 10 da moltiplicare per 5.60.

Per rappresentare numeri molto piccoli è necessario invece fare lo stesso procedimento ma con un esponente negativo. Quindi il numero 0,00.000.000.001 e rappresentabile come:

1×10-11

L’utilizzo del floating point: IEEE754

Con l’avanzamento della tecnologia alcune DAW hanno iniziato a introdurre la codifica floating point per rappresentare i segnali audio. Lo standard in questione è conosciuto nell’ambito informatico come IEEE 754.

Lo standard IEEE è suddiviso in due varianti: a 32 bit (single precision) e 64 bit (double precision). Esistono altre varianti dello standard ma che noi non prenderemo in considerazione in quanto non usate in ambito audio.

Rispetto al codifica lineare, vista nel precedente articolo, il floating point utilizza una frase binaria costruita in maniera completamente diversa. La diversità nasce dal fatto che si rappresenta il valore del sample con un numero esponenziale. Esattamente come accade nella notazione scientifica, anche durante codifica audio l’utilizzo di un numero esponenziale rende possibile rappresentare un numero elevato di valori. Il floating point rispetto alla notazione scientifica potenze in base 2. Essendo i computer basati su matematica binaria, la base 2 è facilmente rappresentabile da i computer.

NB: quando parliamo di codifica a 32 o 64 bit non stiamo intendendo l’architettura del processore. Un programma scritto per sfruttare architetture a 64 bit userà frasi binarie di tale lunghezza per descrivere ogni azione che deve eseguire. Usando la nomenclatura 64 bit per entrambi gli standard si fà spesso confusione. In questo paragrafo ti parlo della scrittura del sample audio e di quanti bit sono usati durante il processo di quantizzazione.

La struttura della fase binaria IEEE 754

Nella rappresentazione binaria di un numero esponenziale è necessario allocare alcuni bit per rappresentare il valore del decimale e altri bit per l’esponente. La frase binaria è quindi composta di 3 sezioni, chiamate Segno, esponente e mantissa; indicate con le lettere s,e, F. L’ordine delle sezioni è il seguente:

Bit di segno – Esponente – Mantissa

64 bit floating point, struttura della frase binaria
  • s: il Bit di segno. indica se il valore positivo o negativo del numero; se il valore del bit è 0 il numero sarà positivo, al valore 1 corrisponderanno valori negativi
  • e: l’esponente è il valore a cui elevare la base 2.
  • F: la mantissa è il valore numerico indicante il numero decimale da moltiplicare per l’esponete.

Analizzando le varie parti dell’esempio precedente di +5,60×1011 possiamo affermare che:

  • +: valore del bit di segno indicante una rappresentazione positiva dell’esponente.
  • 11: valore dell’esponente, allocato negli appositi bit.
  • 5.60: la parte decimale, indicato nella mantissa

Due valori sono costanti e vengono dati per scontati, quindi non è necessario allocare bit nella frase binaria per descriverli. I valori in questione sono:

  • la base 2 dell’esponente
  • il valore intero 1 prima dei numeri decimali della mantissa.

Questo permette di risparmiare bit da sfruttare per ottenere rappresentazioni di maggior valore del numero.

In questo tipo di codifica è interessante notare come siano importanti i numeri decimali della mantissa. Avere più valori allocabili alla rappresentazione decimale della mantissa permette di avere dei risultati più precisi. Una minore di valori rappresentabili alla mantissa genererà un aumento delle approssimazioni. Ogni incremento dell’approssimazione ha come un risultato un minore SQNR del sistema.

Valore di bias

Lo standard implementa un valore di correzione per l’esponente, denominato valore di bias, rappresentato con la lettera k. Il valore di bias è definito arbitrariamente dallo standard e dipende dalla lunghezza della frase binaria utilizzata. Il valore di K equivale alla metà dei valori rappresentabili dall’esponente -1. Questo valore serve per rappresentare numeri negativi. Semplicemente basta che il valore dell’esponente sia minore del numero di bias ed esso darà origine a un valore negativo. Nei prossimi paragrafi ti farò degli esempi per capire meglio.

IEEE 754 single precisione e double precision.

Floating point binary phrases
frasi digitali folating point

Come abbiamo visto nei paragrafi precedenti esistono due tipologie di codifiche floating point. La differenza principale sta nel numero di bit che vengono sfruttati per rappresentare il segnale audio.

Nei due paragrafi successivi riporto degli esempi. Tuttavia non è cosi importate saper sviluppare questi calcoli; ciò è finalizzato a darti l’ordine di grandezza dei valori che possono essere rappresentati in un sistema floating point.

single precision

La single precision utilizza frasi binarie di 32 bit.

in questo standard sono allocati 8 bit all’esponente consentendo di rappresentare 256 valori. Non tutti i valori vengono assegnati a una rappresentazione numerica. Lo standard IEEE754 assegna alle frasi binarie corrispondenti ai valori 0 e 256 funzioni speciali. Questi due valori non vengono rappresentati come esponenti possibili.

Il valore di bias in standard single precision è 127.

Per calcolare i possibili valori di un esponente single precision bisogna eseguire la seguente formula

28 -2 -k

dove:

  • 28 sono i valori possibili rappresentabili dal sistema in base al numero di bit
  • -2 è il numero di valori allocati per altri usi dal sistema; che quindi non saranno utilizzati nella rappresentazione del segnale.
  • -k è il fattore di correzione del sistema, pari a 127.

Applicando quindi la formula per calcolare l’esponente otteniamo che il massimo valore rappresentabile è:

28-2-127 =127

Per la mantissa invece sono allocati 23 bit. La mantissa determina quante cifre significative può rappresentare il sistema. Il numero intero 1 prima della virgola è sottinteso, quindi tutti i 23 bit possono essere allocati per la rappresentazione dei numeri decimali. I valori decimali della mantissa sono quindi:

223= 8.388.608

quindi la frase binaria massima di un sistema 32 bit floating point è di:

2(2^8)-2-k x 1,(223)

Traducendo la formula nei numeri

2127 x 1,8.388.608

Double precision

La struttura della frase in double precision è analoga a quella vista precedentemente. Avendo a disposizione il doppio dei bit la frase binaria a 64 floating point riesce a rappresentare più valori.

I bit della frase della double precision sono rispettivamente allocati:

  • 1 bit di segno
  • 11 bit di esponente
  • 52 bit di mantissa

L’utilizzo di 11 bit di esponente migliora significativamente le potenze rappresentabili dal sistema. Questo rende possibile di rappresentare valori maggiori rispetto alla single precision.

Il fattore k in sistemi con un esponente a 11 bit equivale a 1023. La formula per calcolare i valori del’esponente del double precision è la medesima della rappresentazione 32 bit floating, ovviamente cambiano i valori dei numeri. I valori dell’esponete double precison sono quindi:

211-2-k

211 -2 -1.023 = 1.023

Il vantaggio maggiore della codifica double precision è la quantità di bit allocati alla mantissa, che consente una maggiore precisione di rappresentazione. la mantissa riesce a rappresentare:

254 = ‭18.014.398.509.481.984‬

Per calcolare i valori massimi rappresentabili da un sistema 64 bit float il calcolo da eseguire è il seguente:

21.023 x 1,‭18.014.398.509.481.984‬

calcolo dei decibel floating point e la gamma dinamica.

Floating point dynamic range vs linear dynaic range
Gamma dinamica di sistemi digitale a confronto

Per convertire un valore Floating point in decibel la formula e la seguente

dB=20log(m x be)

Dove:

  • m = mantissa
  • b = base
  • e = esponente

Per scoprire la gamma dinamica rappresentabile da un sistema è quindi necessario calcolare il valore più alto e quello più basso del sistema stesso. Quindi le formule per rappresentare in decibel un segnale floating point single precison:

dbmin = 20log ( 2-126 x 1,8.388.608 )= -758

dbmax = 20log ( 2127 x 1,8.388.608 ) = 770

per la double precison la gamma dinamica rappresentabile dal sistema è:

dBmin = 20log ( 2-1.022 x 1,‭18.014.398.509.481.984‬ ) = -6.153 dB

dBmax = 20log ( 21.023 x 1,‭18.014.398.509.481.984‬ ) = 6.165 dB

il floating point: i vantaggi

Anche se 144dB di codifica lineare 24 bit possono gestire la dinamica di un singolo microfono, il problema sorge nel momento in cui le nostre varie tracce vengono sommate nel nostro sequencer. La sommatoria di due o più tracce possono generare picchi di ampiezza notevole che facilmente sforano il limite di 0 dBfs.

La condifica 32 bit può rappresentare valori da -750 a +770 dB circa, quindi una gamma dinamica di 1.500 dB. Se i valori generati dalla codifca in 32 bit ti sembrano enormi non potrai credere alla gamma dinamica della double precision. Con un numero così elevato di bit il sistema riesce a rappresentare valori compresi da -6.000 o a +6000 dB; garantendo una gamma dinamica di 12.000 dB.

I valori della codifica floating point sono sbalorditivi, soprattutto se pensiamo che la massima ampiezza di un suono nel mondo reale e di 210 dB circa.

Un altro pregio di questa codifica è la quantità di decibel in valore negativi. Le dimensioni di rappresentazione fino allo 0 dBfs permette una suddivisione di step di quantizzazione molto più fitta.

Questa codifica rende il classico concetto di 0 dBfs come limite massimo del dominio digitale obsoleto.

La quantizzazione floating point

floating point quantizzation
scala della quantizzazione floating point

Le rappresentazioni esponenziali dei numeri creano delle scale con rapporti ben precisi tra i valori in esse contenuti. A esponenti maggiori la distanza di due valori nella scala sarà più ampia rispetto alla rappresentazione dello stesso intervallo con valori di esponente minore.

Facciamo un esempio per capire meglio il concetto. Supponiamo che la mantissa possa rappresentare numeri decimali da 0 a 9. Noi in questo modo prima di modificare l’esponente possiamo rappresentare valori da:

1×101 a 9×101

per rappresentare numeri più ampi cambiamo esponente:

1×102

Andiamo ad analizzare cosa succede se calcoliamo il risultato di analoghi valori della mantissa ma con esponenti diversi:

1×100=1
2×100=2
3×100=3
4×100=4
5×100=5
6×100=6
7×100=7
8×100=8
9×100=9

1×101=10
2×101=20
3×101=30
4×101=40
5×101=50
6×101= 60
7×101=70
8×101=80
9×101=90

1×102=100
2×102=200
3×102=300
4×102=400
5×102=500
6×102=600
7 x102=700
8×102=800
9×102=900

Questo semplice e banale esempio spiega come le approssimazioni tipiche della quantizzazione float siano proporzionali al valore della potenza.

Una maggior approssimazione genera rapporto SQNR minore. Tale rapporto è inversamente proporzionale al numero di valori possibile per la rappresentazione del segnale. Da questa caratteristica deriva una minor possibilità di predeterminare i valori di SQNR di un sistema floating point nel suo complesso.

Rappresentando il rumore di quantizzazione su di un grafico il risultato che ne deriva è una curva gaussiana, dove nei valori minori il rumore di quantizzazione è minore.

Gli svantaggi della codifica floating point.

Lo svantaggio principale della codifica floating point lo abbiamo analizzato nel paragrafo precedente. Rispetto alla codifica lineare, le approssimazioni di un sistema floating sono meno prevedibili. Il maggior difetto della codifica float è quindi l’impossibilità di determinare un valore SQNR univoco. Occorre però notare come le approssimazioni floating siano compensate dai nostri schemi percettivi. La presenza di maggior rumore a valori più elevati sarà meno problematica rispetto un sistema lineare, in quanto entra in gioco l’effetto di mascheramento.

Occorre osservare che però che la quantità di valori rappresentabili con una codifica 32 bit float è comunque molto più elevata rispetto a quella di un sistema 24 bit lineari. Il numero maggiore di regioni consente un miglior rapporto SQNR pur avendo una percentuale di approssimazione maggiore tra due regioni contigue.

Un altro svantaggio dell’utilizzo di formati di questo tipo è la maggior quantità di risorse necessarie. In codifica lineare si usano 24 bit contro i 32 bit minimo del floating point, per ottener risultati professionali. Questi bit descrivono un solo campione audio, quindi ogni campione audio verrà quantizzato con quel tale numero di bit. Non sembrano molti 8 bit ma in realtà è 1/3 in più dello standard professionale. Se consideriamo che il campionamento minimo per una registrazione è di 44.100 campioni per un secondo. Le tracce non sono tutte mono, se alcune tracce saranno stereo o multicanale la quantità di dati diventa rilevante.

Floating point e conversione in codifica lineare

Anche le schede audio più preformanti al giorno d’oggi campionano il sengale a 24 bit. Per sfruttare la tecnologia floating point il segnale deve essere riconvertito a partire dalla codifica lineare. Il segnale viene rielaborato prima di essere scritto sul file, oppure on fly prima di essere caricato in memoria RAM. Tieni presenti che i 64 bit sono sfruttati solo sul path di sommatoria interna dei canali. Il segnale viene poi ridotto a 24 bit nella fase di output della DAW. La conversione permette di non perdere compatibilità col mondo analogico.

Come ho accennato nell’articolo sulla saturazione, non tutti i plugin sono in grado di lavorare a 24 bit. Anche in questo caso il segnale dovrà essere convertito in codifica lineare per essere processato e gestito dal plugin. In output dal plugin sarà poi riconvertito in codifica float e gestito nel sequencer con i rispettivi vantaggi. Occorre quindi fare comunque attenzione ai livelli prima di una conversione in codifica lineare. Se questa condizione non viene rispettata si saturerà comunque il segnale.

conclusioni

La codifica floating point è stato certamente un passo avanti per la rappresentazione audio digitale. Grazie a tale codifica abbiamo a disposizione una gamma dinamica talmente alta da render il problema della saturazione digitale inesistente. Poter superare la soglia di 0 dBfs ha rappresentato uno sforzo ingegneristico notevole per le software house. Certamente si tratta di un compromesso, ma a parer mio il rapporto costi/benefici rendono vantaggioso il suo utilizzo. In un ambito come l’informatica, dove le risorse sono limitate e il loro utilizzo ponderato bene, la codifica floating è certamente una soluzione agevole.

Dall’inizio della rappresentazione digitale ne sono cambiate di cose. Agli arbori l’audio digitale era in grado di lavorare a 12 bit e non si riusciva a gestire audio in real-time. In meno di 30 anni siamo in grado di rappresentare segnali cosi grandi che superano pure i massimi valori che un suono può raggiungere nel mondo reale. Difficile riuscire a supporre cosa ci riserverà il futuro, ma a parer mio la codifica floating rimarrà usata per lungo tempo nell’ambito professionale.

Speculando un pò posso augurarmi che in un futuro vengano sviluppati dei convertitori AD/DA in grado di elaborare direttamente il suono in floating point. A parer mio sarebbe interessante la possibilità di poter sfruttare la grande quantità di valori di gamma dinamica per poter rappresentare intervalli di quantizzazione minimi. Questa tipologia di conversione porterebbe così a una rappresentazione molto accurata della forma d’onda. Le rappresentazioni più accurate consentirebbero di ridurre notevolmente l’SQNR (almeno a livello percettivo) immesso durante il processo di conversione. In fine sfruttando il numero elevato di regioni che questa codifica riesce a rappresentare potremmo abbassare di molto la distanza tra le rappresentazioni analogiche e quelle digitali.


Anche te sei appassionato di audio?

Aggiungimi sui miei canali social e rimaniamo in contatto!

www.facebook.com/gregorioferraris

www.instangram.com/gregorioferraris

http://www. inkedin.com/gregorioferraris

Se pensi che il mio lavoro sia utile anche ai tuoi amici condividilo sui tuoi social e aiutami a fare crescere il mio blog!

Stay tuned


Lascia un commento