APPENDICE:UN'APPLICAZIONE PER LA RIPRODUZIONE DEI SEGNALI AUDIO DIGITALIZZATI
Spesso,i segnali audio digitali vengono memorizzati su files con estensione .WAV.
Un file WAV consta di un'intestazione di 4 bytes che codifica la stringa "RIFF",seguita
da uno o più blocchi logici chiamati chunks.
Ogni chunk è così composto:
bytes 0-3 :dimensione del chunk (esclusi i primi 4 bytes)
bytes 4-7 :stringa "WAVE"
bytes 8-? :area info
bytes 8-11 :stringa "fmt "
bytes 12-15 :dimensione dell'area info (esclusi i primi 8 bytes)
bytes 16-17 :formato dei dati audio (1=PCM)*
bytes 18-19 :numero di canali utilizzati (1=MONO,2=STEREO,3=SURROUND 2+1 ecc.)
bytes 20-23 :tasso di campionamento (in campioni/secondo)
bytes 24-27 :tasso di riproduzione (in bytes/secondo)
bytes 28-29 :numero di allineamento (bytes per ciascun sample-frame)
bytes 30-31 :numero di bit usati per rappresentare un campione
bytes 32-? :info aggiuntive per la decompressione del segnale (assenti nella codifica PCM)*
bytes x-? :area dati
bytes x-x+3 :stringa "data"
bytes x+4-x+7 :dimensione (in bytes) dei campioni audio
bytes x+8-? :campioni del segnale audio
Per un segnale polifonico (stereo o superiore),si dice che i canali sono interlacciati
tra loro,in altre parole ad ogni campione audio letto in sequenza è associato un canale in
ordine progressivo.
Ad esempio il primo campione audio di un segnale stereo è associato al primo canale,il
secondo al secondo canale,il terzo di nuovo al primo canale,il quarto di nuovo al secondo
canale e così via;le schede audio montate nei PC attuali possono gestire facilmente anche
6-7 canali contemporaneamente.
Ogni sequenza di campioni associati allo stesso istante di tempo viene chiamata sample-
frame:ad esempio,per un segnale stereofonico quantizzato con 16 bit/campione il sample-frame
è di 4 bytes (2 bytes per campione*2 canali),mentre per un segnale monofonico quantizzato
con 8 bit/campione è di un solo byte (1 byte per campione*1 canale).
I più attenti avranno notato alcune ridondanze:per esempio,il campo tasso di riproduzione
è superfluo,perchè si può ricavare moltiplicando il tasso di campionamento per il numero di
bit/campione e per il numero di canali,e dividendo per 8;allo stesso modo,il numero di
allineamento si può ottenere moltiplicando il numero di canali per il numero di bit/campione
e dividendo per 8...e via dicendo.
Il motivo è che è importante che i dati multimediali vengano trasmessi in tempo reale,per cui
si cerca di ridurre al minimo la quantità di calcoli da far compiere all'hardware (questo è
specialmente vero per i dispositivi audio più vecchi e lenti).
Giusto per chiarire ulteriormente le idee,questa è una tipica intestazione WAV
00000000 52 49 46 46 e0 15 46 02 57 41 56 45 66 6d RIFFà.F.WAVEfm
0000000e 74 20 10 00 00 00 01 00 02 00 44 ac 00 00 t ........D¬..
0000001c 10 b1 02 00 04 00 10 00 64 61 74 61 bc 15 .±......data¼.
0000002a 46 02 00 00 00 00 00 00 00 00 00 00 00 00 F.............
Da cui si possono ricavare tutte le informazioni viste prima:
lunghezza chunk: 38147552(024615e0h) bytes
lunghezza area info: 16(00000010h) bytes
formato campioni: 1(0001h)=PCM
#canali: 2(0002h)=STEREO
tasso di campionamento: 44100(0000ac44h) campioni/secondo
tasso di riproduzione: 176400(0002b110h) bytes/secondo
allineamento: 4(0004h) bytes
bit/campione: 16(0010h)
dimensione campioni audio: 38147516(024615bch) bytes
Questo archivio contiene le classi Java di una piccola API che permette di riprodurre file
audio in formato WAV non compresso;per i volenterosi ho incluso anche il codice sorgente
commentato.
--------------
Nota a margine
--------------
* PCM sta per "modulazione a codice d'impulso" (Pulse Code Modulation).
E' la tecnica di codifica più semplice perchè associa ad ogni campione audio l'intensità del
segnale in corrispondenza di quel campione e non prevede alcun tipo di compressione.
Va indrè