Non sono solo canzonette
Il 17 agosto 1982 il primo CD per utilizzo commerciale venne prodotto in una fabbrica della Philips ad Hannover in Germania: La Sinfonia delle Alpi di Richard Strauss diretta da Herbert Von Karajan con la Berliner Philharmoniker. La foto di un iridescente dischetto da 12cm sarebbe stata sicuramente più rappresentativa dell’argomento di questo paragrafo, ma ho preferito aprire con un’immagine più gradevole come il ritratto del celebre compositore.
Il Compact Disc ha ormai compiuto 40 anni e la sua paternità spetta ad una joint venture tra DuPont e Philips che, verso la metà degli anni 70, gettarono le basi per realizzare un dispositivo robusto e versatile per l’archiviazione della musica ad alta qualità. La DuPont, che aveva partecipato inizialmente per cercare un nuovo impiego commerciale per il policarbonato di cui deteneva il brevetto, si tirò indietro dopo i primi studi preliminari. I nuovi dispositivi per la lettura dei compact disc sembravano troppo costosi per avere una grossa diffusione sul mercato e gli stessi dischi, con una capacità stimata di 600MB, sembravano troppo avanti rispetto alle capacità di archiviazione dei supporti in uso all’epoca. Ricordiamo che in quel periodo una dimensione tipica per un hard disk da computer era intorno ai 20MB.
Il progetto fu poi portato avanti da una joint venture fra Philips e Sony, che firmarono anche la stesura del cosiddetto Red Book (1982). Cioè il documento che definisce nei dettagli il modo con cui vengono codificati i dati da registrare sul supporto ottico.
Mentre nell’ascolto di un tradizionale disco in vinile è il nostro orecchio a filtrare i crepitii e i fruscii dovuti alla polvere che si deposita sui microsolchi, nei compact disc è necessario mettere il microprocessore nelle condizioni di interpretare correttamente le informazioni presenti sul disco. Graffi, sporcizia, impronte e in generale il deterioramento della superficie del supporto, da un punto di vista del processore, non sono altro che errori di lettura.
Nella definizione dello standard di codifica è stato necessario quindi inserire dei sistemi di correzione dell’errore e, come vedremo, i padri del CD non si sono fatti mancare nulla!
Innanzitutto cerchiamo di quantificare il messaggio originale che si vuole memorizzare.
La musica che deve essere memorizzata sul supporto digitale deve essere dapprima digitalizzata. Nel caso del CD si usa una frequenza di campionamento di 44100Hz e la dimensione dei campioni è di 16 bit.
La sorgente si considera sempre stereo quindi il flusso di informazione totale è di 44100 x 16 x 2 = 1411200 bit al secondo, cioè circa 172KB/s.
Ciò che viene memorizzato però non è il flusso continuo di suono digitalizzato, ma piuttosto una sequenza di “pacchetti” detti frames che contengono solo 6 campioni di musica per ciascun canale. In totale 6 campioni da 16 bit per canale, cioè 24 bytes.
A questi 24 bit di informazione “utile” si aggiunge una certa quantità di ridondanza avente principalmente la funzione di individuazione e correzione degli errori.
Controllo di Parità
Il primo meccanismo che viene impiegato per il controllo degli errori sui CD è il cosiddetto controllo di parità.
Si tratta di uno dei meccanismi più semplici e consiste nel contare il numero di 1 presenti nel messaggio che si vuole trasmettere e aggiungere un 1 o uno 0 al messaggio finale per fare in modo che esso abbia sempre la stessa parità.
Per esempio se il messaggio è M=100101 esso avrà parità dispari contenendo tre 1. Si può quindi scegliere di creare un messaggio T con parità pari aggiungendo un 1: T=1001011, oppure un messaggio con parità dispari aggiungendo uno 0: T=1001010.
In questo modo il ricevitore può eseguire il controllo di parità sul messaggio T ricevuto e aspettarsi di trovare sempre un valore di parità pari o dispari a seconda dello standard adottato. In presenza di un risultato diverso avrebbe la certezza di essere in presenza di un errore, o di un numero dispari di errori. La vulnerabilità di questo sistema è ovviamente che è insensibile ad un numero pari di errori. Anche un sistema così semplice può essere però utilizzato in modo da permettere una certa capacità di correzione se lo si applica a blocchi in modo da conferirgli una certa ciclicità.
Nell’immagine seguente vediamo un esempio di un blocco di messaggio, a sinistra, rappresentato come una matrice. Quelli visibili sotto e a destra delle linee blu sono i bit calcolati rispettivamente per ciascuna colonna e ciascuna riga. Nella parte destra dell’immagine vediamo lo stesso messaggio in cui un bit, a causa di un errore, è stato trasformato da 1 a 0. Confrontando il bit di parità calcolato sia per le righe che per le colonne si può individuare in quale incrocio si trova l’errore.
Per rendere più efficace il meccanismo del controllo di parità, nei CD esso viene utilizzato in congiunzione con un’altra tecnica: l’interlacciamento.
La codifica CIRC
L’acronimo CIRC sta per Cross-Interleaved Reed-Solomon Code e rappresenta una tecnica per “mescolare” fra loro i bit del messaggio da codificare in modo che eventuali raffiche di errori non lo danneggino in modo irrecuperabile.
Per illustrare meglio il funzionamento della tecnica di interlacciamento è meglio affidarsi ad un esempio.
Supponiamo che il messaggio da trasmettere sia:
Un danneggiamento del supporto potrebbe portare al cancellamento di una parte significativa del messaggio, per esempio:
Sorvoliamo sull’evidente riconoscibilità del verso del Leopardi usato nell’esempio e notiamo che in questo caso la particella “mi” in esso contenuta è completamente scomparsa a causa dell’errore.
Se invece sottoponiamo il messagio ad un processo di interlacciamento troviamo qualcosa del tipo:
Se il messaggio interlacciato avesse lo stesso danneggiamento visto sopra diventerebbe:
Ma l’applicazione all’inverso di un processo di deinterlacciamento porta ad un messaggio originale come segue:
Che è molto più “riconoscibile” in quanto nessuna parola è stata distrutta completamente.
Tornando alla costruzione del frame di dati per un cd, ai 24 byte del materiale musicale di partenza vengono quindi aggiunti 4 byte di parità e, dopo aver effettuato il processo di interlacciamento se ne aggiungono altri 4 per un totale di 32 byte.
Oltre i 32 byte di parità si aggiunge ora un singolo byte detto di subcode il quale contiene delle informazioni sulla traccia e sulla sincronizzazione. Questo byte è funzionale per il lettore CD e non è, in sè, un’aggiunta necessaria per il controllo dell’errore.
Vediamo adesso l’ultima codifica che viene fatta sui dati prima di essere registrati sul supporto ottico.
Codifica EFM
La sigla EFM sta per Eight to Fourteen Modulation. Per capire meglio la necessità di questo ulteriore passaggio di codifica del segnale, può essere utile vedere come appare la superficie di un CD osservata al microscopio.
Quello che appare un disegno a tratto-punto, come se fosse un codice Morse, è effettivamente la superficie del CD su cui sono presenti dei “rilievi”. La testina laser che effettua la lettura rileva la variazione di intensità della luce riflessa da questi rilievi e la converte in segnale digitale.
Ciò che è interessante è che la testina non associa uno 0 ad una “valle” e un 1 ad una “cresta”, come sarebbe intuitivo pensare, ma associa un 1 ad ogni variazione di intensità. Quindi l’uno sarà il risultato del passaggio del laser da una cresta ad una valle o viceversa.
Appare evidente che, se nel messaggio ci fossero due 1 vicini, questi non sarebbero praticamente rilevabili e inoltre, per rendere ancora più robusta la codifica nei confronti di errori, dovuti anche dalle eventuali variazioni di velocità del disco, è importante che gli 1 siano quando più sparpagliati possibile all’interno della parola di codice.
Per questo motivo è stata costruita una che associa ad ogni codice numerico di 8 bit un univoco codice su 14 bit fatto in modo che fra due 1 successivi vi siano sempre almeno due 0 e al massimo 10. In questo modo si riesce rendere distinguibili gli 1, avere una buona densità di informazione e permettere alla testina laser di essere sempre a fuoco sul supporto.
Nell’immagine seguente vediamo illustrato l’intero processo di lettura.
Quindi per ogni byte di informazione che vogliamo inserire nel nostro frame dobbiamo utilizzare una corrispondente parola di 14 bit scelta nella tabella EFM con l’aggiunta di 3 ulteriori bit, detti merge bit, che servono a fare in modo che la condizione di due zeri minimo e 10 zeri massimo sia conservata anche fra due parole adiacenti e non solo all’interno della stessa parola. In totale abbiamo 17 bit per ogni 8 bit di informazione da codificare.
Infine all’inizio di ogni frame si aggiungono ulteriori 24 bit più 3 merge bit che rappresentano un codice di sincronizzazione.
In totale abbiamo raggiunto ben 588 bit di informazione per riuscire a trasmentterne 192. Cioè solo il 33% di quanto viene registrato su un CD è reale segnale musicale. I due terzi sono informazioni necessarie a rendere il sistema robusto nei confronti dell’errore!
Dec. | Binary | EFM |
---|---|---|
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 |
00000000 00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000 00001001 00001010 00001011 00001100 00001101 00001110 00001111 00010000 00010001 00010010 00010011 00010100 00010101 00010110 00010111 00011000 00011001 00011010 00011011 00011100 00011101 00011110 00011111 00100000 00100001 00100010 00100011 00100100 00100101 00100110 00100111 00101000 00101001 00101010 00101011 00101100 00101101 00101110 00101111 00110000 00110001 00110010 00110011 00110100 00110101 00110110 00110111 00111000 00111001 00111010 00111011 00111100 00111101 00111110 00111111 01000000 01000001 01000010 01000011 01000100 01000101 01000110 01000111 01001000 01001001 01001010 01001011 01001100 01001101 01001110 01001111 01010000 01010001 01010010 01010011 01010100 01010101 01010110 01010111 01011000 01011001 01011010 01011011 01011100 01011101 01011110 01011111 01100000 01100001 01100010 01100011 01100100 01100101 01100110 01100111 01101000 01101001 01101010 01101011 01101100 01101101 01101110 01101111 01110000 01110001 01110010 01110011 01110100 01110101 01110110 01110111 01111000 01111001 01111010 01111011 01111100 01111101 01111110 01111111 10000000 10000001 10000010 10000011 10000100 10000101 10000110 10000111 10001000 10001001 10001010 10001011 10001100 10001101 10001110 10001111 10010000 10010001 10010010 10010011 10010100 10010101 10010110 10010111 10011000 10011001 10011010 10011011 10011100 10011101 10011110 10011111 10100000 10100001 10100010 10100011 10100100 10100101 10100110 10100111 10101000 10101001 10101010 10101011 10101100 10101101 10101110 10101111 10110000 10110001 10110010 10110011 10110100 10110101 10110110 10110111 10111000 10111001 10111010 10111011 10111100 10111101 10111110 10111111 11000000 11000001 11000010 11000011 11000100 11000101 11000110 11000111 11001000 11001001 11001010 11001011 11001100 11001101 11001110 11001111 11010000 11010001 11010010 11010011 11010100 11010101 11010110 11010111 11011000 11011001 11011010 11011011 11011100 11011101 11011110 11011111 11100000 11100001 11100010 11100011 11100100 11100101 11100110 11100111 11101000 11101001 11101010 11101011 11101100 11101101 11101110 11101111 11110000 11110001 11110010 11110011 11110100 11110101 11110110 11110111 11111000 11111001 11111010 11111011 11111100 11111101 11111110 11111111 |
01001000100000 10000100000000 10010000100000 10001000100000 01000100000000 00000100010000 00010000100000 00100100000000 01001001000000 10000001000000 10010001000000 10001001000000 01000001000000 00000001000000 00010001000000 00100001000000 10000000100000 10000010000000 10010010000000 00100000100000 01000010000000 00000010000000 00010010000000 00100010000000 01001000010000 10000000010000 10010000010000 10001000010000 01000000010000 00001000010000 00010000010000 00100000010000 00000000100000 10000100001000 00001000100000 00100100100000 01000100001000 00000100001000 01000000100000 00100100001000 01001001001000 10000001001000 10010001001000 10001001001000 01000001001000 00000001001000 00010001001000 00100001001000 00000100000000 10000010001000 10010010001000 10000100010000 01000010001000 00000010001000 00010010001000 00100010001000 01001000001000 10000000001000 10010000001000 10001000001000 01000000001000 00001000001000 00010000001000 00100000001000 01001000100100 10000100100100 10010000100100 10001000100100 01000100100100 00000000100100 00010000100100 00100100100100 01001001000100 10000001000100 10010001000100 10001001000100 01000001000100 00000001000100 00010001000100 00100001000100 10000000100100 10000010000100 10010010000100 00100000100100 01000010000100 00000010000100 00010010000100 00100010000100 01001000000100 10000000000100 10010000000100 10001000000100 01000000000100 00001000000100 00010000000100 00100000000100 01001000100010 10000100100010 10010000100010 10001000100010 01000100100010 00000000100010 01000000100100 00100100100010 01001001000010 10000001000010 10010001000010 10001001000010 01000001000010 00000001000010 00010001000010 00100001000010 10000000100010 10000010000010 10010010000010 00100000100010 01000010000010 00000010000010 00010010000010 00100010000010 01001000000010 00001001001000 10010000000010 10001000000010 01000000000010 00001000000010 00010000000010 00100000000010 01001000100001 10000100100001 10010000100001 10001000100001 01000100100001 00000000100001 00010000100001 00100100100001 01001001000001 10000001000001 10010001000001 10001001000001 01000001000001 00000001000001 00010001000001 00100001000001 10000000100001 10000010000001 10010010000001 00100000100001 01000010000001 00000010000001 00010010000001 00100010000001 01001000000001 10000010010000 10010000000001 10001000000001 01000010010000 00001000000001 00010000000001 00100010010000 00001000100001 10000100001001 01000100010000 00000100100001 01000100001001 00000100001001 01000000100001 00100100001001 01001001001001 10000001001001 10010001001001 10001001001001 01000001001001 00000001001001 00010001001001 00100001001001 00000100100000 10000010001001 10010010001001 00100100010000 01000010001001 00000010001001 00010010001001 00100010001001 01001000001001 10000000001001 10010000001001 10001000001001 01000000001001 00001000001001 00010000001001 00100000001001 01000100100000 10000100010001 10010010010000 00001000100100 01000100010001 00000100010001 00010010010000 00100100010001 00001001000001 10000100000001 00001001000100 00001001000000 01000100000001 00000100000001 00000010010000 00100100000001 00000100100100 10000010010001 10010010010001 10000100100000 01000010010001 00000010010001 00010010010001 00100010010001 01001000010001 10000000010001 10010000010001 10001000010001 01000000010001 00001000010001 00010000010001 00100000010001 01000100000010 00000100000010 10000100010010 00100100000010 01000100010010 00000100010010 01000000100010 00100100010010 10000100000010 10000100000100 00001001001001 00001001000010 01000100000100 00000100000100 00010000100010 00100100000100 00000100100010 10000010010010 10010010010010 00001000100010 01000010010010 00000010010010 00010010010010 00100010010010 01001000010010 10000000010010 10010000010010 10001000010010 01000000010010 00001000010010 00010000010010 00100000010010 |
Lascia un commento