Casino online









Mercato forex







Il formato WAV



Cos'è e cosa contiene un Wav
Il nome dell'estensione, wav, è l'inizio della parola Waveform, che significa "forma d'onda": infatti, i file di questo tipo non sono altro che contenitori per una certa onda rappresentante un segnale audio. Al contrario degli mp3, spiegati nelle precedenti lezioni di questa sezione, i file wav sono, di norma, loseless, ossia non comportano la perdita di dati. Come avevo spiegato in precedenza, la codifica degli mp3, oltre ad un potente algoritmo di compressione (algoritmo di Huffman), fa anche uso di tecniche euristiche per rintracciare ed eliminare frequenze inutili, in quanto non percepibili dall'orecchio umano. Nei wav questo non succede: il segnale viene preservato nella sua interezza e proprio per questa sua caratteristica viene impiegato in ambiti specifici, come il DSP (Digital Signal Processing), che, dovendo analizzare a fondo un segnale, deve disporre di tutte le informazioni possibili, anche di quelle apparentemente insignificanti. Ne fanno uso anche utenti molto amanti della musica per cercare di ottenere e riprodurre con la massima fedeltà possibile ogni pezzo.
Anche se esistono diversi tipi di codifica, alcuni compressi, altri no, il tipo in assoluto più utilizzato è il PCM. Esso è, inoltre, il più semplice, poiché prevede il salvataggio dell'onda così come viene ottenuta dal dispositivo di registrazione: non si deve applicare nessun filtro, nessuna trasformazione, niente di complicato, bisogna solo trascrivere i dati, linearmente, sul file. In questo tutorial mi occuperò dei file wave pcm.


I chunks
Il formato wav è un sottogruppo del più generale formato RIFF (Resource Interchange File Format). Quest'ultimo prevede che i file siano strutturati secondo una struttura formata da chunk, ossia blocchi di dati. Ognuno di questi blocchi deve essere contraddistinto da un id (identificativo), formato da 4 lettere in codifica ascii standard (quella a 128 bit), immediatamente seguito da una serie di 4 bytes che indicano la dimensione dell'intero chunk (esclusi questi 8 bytes di intestazione). Lo si può, quindi, schematizzare come segue:

Struttura di un chunk
Id Dimensione Contenuto
4 bytes 4 bytes [Dimensione] bytes

Prima di procedere, è importantissimo dire che tutte le dimensioni e i numeri interi sono codificati secondo il modello little-endian, ed è necessario agire di conseguenza quando si leggono o si scrivono dati di questo tipo. Sebbene abbia già introdotto il concetto di endianness nei Fondamenti di Informatica, lo ripeto brevemente anche qui. Secondo il modello big-endian, i bits più significativi si trovano all'inizio, perciò il numero 300 sarà espresso come segue:

300 = 100101100 = 00000001 00101100 = 01 2C

Quest'ultima è anche la notazione convenzionale e più logica usata per esprimere un numero in base 2. Nell'esempio ho aggiunto degli 0 all'inizio per far notare che la rappresentazione utilizza 2 bytes di spazio. Nel modello little-endian, invece, i bits più significativi vanno posti alla fine, perciò i due bytes usati per rappresentare normalmente quel numero saranno invertiti:

2C 01 = 00101100 00000001 = 11265

11265 sarebbe il risultato ottenuto leggendo dal file i due bytes 2C 01 nel caso non sapessimo che sono codificati in little-endian. Tuttavia, una volta giunti a conoscenza di questo fatto, non avremo problemi a leggere e scrivere dati numerici nella forma corretta, evitando, quindi, una marea di errori e incompressioni che sorgerebbero certamente in caso contrario. Ora possiamo procedere con la descrizione dei chunk caratteristici.


Il RIFF chunk
Il primo e più importante chunk da conoscere, ed anche il primo presente nella struttura del file, è RIFF. Questo chunk contiene praticamente tutti gli altri, ossia costituisce da solo tutto il file: viene usato, inoltre, per riconoscere il formato RIFF, poiché nel caso lo stream non presenti questo blocco di dati iniziali sicuramente non sarà un file riff. Il suo id, ovviamente, è "RIFF" (tutto maiuscolo, mi raccomando), mentre la sua dimensione è uguale alla grandezza del file meno 8. I primi 8 bytes, infatti, sono l'header del chunk stesso, 4 per l'id e 4 per la dimensione. Dopo questi primi bytes viene una parola di 4 lettere che identifica il tipo di risorsa codificata: poiché si tratta di un file audio, nel nostro caso sarà "WAVE" (sempre maiuscolo).

Struttura del RIFF chunk
Id ("RIFF") Dimensione Tipo di risorsa ("WAVE") Contenuto
4 bytes 4 bytes 4 bytes [Dimensione - 4] bytes

Potete scaricare questo campione audio per controllare con un editor esadecimale tutto quello che andrò a spiegare tra poco.


Il Format chunk
Questo chunk serve a comunicare tutte le informazioni generale sull'onda e su come riprodurla. Il suo id è "fmt " (tutto minuscolo, e seguito da uno spazio), e la sua dimensione è, generalmente, 16. Il contenuto di questo blocco consiste in una serie di numeri interi, variabilmente da 2 o da 4 bytes, che indicano alcuni parametri molto importanti. Nell'ordine in cui si trovano, sono: Noterete che sommando le dimensioni di questi valori (2+2+4+4+2+2) si ottiene 16, ossia la dimensione standard di questo chunk. È possibile, nel caso si file wave compressi o comunque di tipo diverso dal pcm, che oltre ai 16 sopracitati siano presenti altri bytes, contenenti ulteriori informazioni: in questo caso i primi 2 bytes successivi al blocco dei 16 conterranno un numero indicante quanti altri bytes di informazione sono presenti nel chunk. Riassumendo:

Struttura del Format chunk
Id
"fmt "
Dimensione
16 o più
Codice Numero canali Sample rate Bytes / secondo Dimensione blocchi Bits / sample
4 bytes 4 bytes 2 bytes 2 bytes 4 bytes 4 bytes 2 bytes 2 bytes

Appendice opzionale del Format chunk
Dimensione Altre informazioni
2 bytes x bytes


Il Data chunk
Eccoci arrivati al cuore del file wave: il data chunk. Esso contiene il vero e proprio segnale audio. Il suo id è "data", e la dimensione varia a seconda della lunghezza del segnale audio.

Struttura del Data chunk
Id ("data") Dimensione Segnale audio
4 bytes 4 bytes x bytes

Il segnale audio riproduce un'onda discreta. Come ho spiegato nell'introduzione al formato mp3, il suono si trasmette attraverso onde meccaniche che sono date dall'oscillazione di punti dello spazio, nella fattispecie dalla compressione o dall'espansione dell'aria. Nella realtà, l'onda è continua, ossia il suo grafico è una funzione continua. Poiché una funzione continua implica un numero di punti infinito, è ovvio che la macchina non può contenere e memorizzare alcun segnale di questo tipo. Può simularlo prendendo tanti punti, vicinissimi, in modo che l'onda risultante sembri continua. Come ho già detto, con una frequenza di campionamento di 44100Hz l'orecchio umano non riesce a percepire la differenza tra un segnale digitale (discreto) e uno analogico (continuo). Ciò detto, se rappresentiamo l'onda su un grafico, un campione (o sample) contiene l'ascissa di ogni punto:



Ogni quadratino è un campione dell'onda discreta. Ora, l'onda era molto semplice, e la frequenza di campionamento molto bassa (ammettiamo 20Hz), tuttavia il principio è lo stesso. Avremo, quindi, a che fare con onde del genere:



Che rappresenta un segnale continuo di questo tipo:



In questi esempi, l'ampiezza dell'onda in ogni punto era compresa tra valori dell'ordine delle decine. I campioni contengono ampiezze variabili, che cambiando di entità a seconda di bits per campione. Se, infatti, un campione ha a disposizione 8 bits, potrà assumere valori tra -127 e +127; se ne ha a disposizione 16, potrà andare da -32'768 a +32'768; se ne ha a disposizione 24, da -8'388'608 a +8'388'608; se ne ha a disposizione 32, da -2'147'483'648 a +2'147'483'648. Logicamente, poiché al variare dell'ampiezza varia il volume del suono, ed i volumi massimo e minimo sono fissi, all'aumentare dei bits concessi ad ogni sample, aumenterà la precisione dell'onda digitale: essa approssimerà meglio la funzione continua (a parità di frequenza di campionamento). Con questo, bisogna fare alcune precisazioni: C'è ancora un'altra importante postilla da illustrare. Se i canali sono più di uno, un singolo campione non conterrà un solo valore, ma tanti quanti sono i canali. Se stiamo parlando di un audio in stereo, un sample sarà costituito da due numeri, scritti uno di seguito all'altro, il primo indicante l'onda riprodotta sul canale sinistro (left) e il secondo quella sul canale destro (right). Se si tratta, invece, di un audio in mono, ogni sample sarà costituito da un solo valore. Una volta capiti questi concetti, è semplice comprendere e schematizzare la struttura di tutto il file. Per facilitarvi il compito, propongo alcuni esempi di campioni:

16 Bits per sample - Stereo
Sample 1 Sample 2
LeftRight LeftRight
12'457 9'126 12'870 9'340

8 Bits per sample - Mono
Sample 1 Sample 2
Left Left
127 -7

A questo punto sarà facile intuire come calcolare l'allineamento dei blocchi, ossia la dimensione, in bytes, di ogni sample:
Allineamento = Canali * Bits per sample / 8
Infatti, un byte è costituito da 8 bits, e in un campione ci sono tanti valori quanti i canali: ecco che otteniamo questo magnifico numero. Prendendo la dimensione del Data chunk (numero di bytes dell'informazione audio), dividendola per l'allineamento (numero di bytes per campione), otteniamo il numero di campioni che costituiscono l'onda; se dividiamo quest'ultimo per il sample rate (numero di samples riprodotti al secondo), otterremo la durata del brano, in secondi.





 

The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.