Non sono solo canzonette

Richard StraussIl 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.

[cml_media_alt id='1929']parity[/cml_media_alt]

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:

SempreCaroMiFuQuest’ermoColle

Un danneggiamento del supporto potrebbe portare al cancellamento di una parte significativa del messaggio, per esempio:

SempreCar____uQuest’ermoColle

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:

amCrQ.eEuer’flptilmsMoeeoCSuro

Se il messaggio interlacciato avesse lo stesso danneggiamento visto sopra diventerebbe:

amCrQ.eEue____lptilmsMoeeoCSuro

Ma l’applicazione all’inverso di un processo di deinterlacciamento porta ad un messaggio originale come segue:

Semp_eCaroMi_uQuest_ErmoColl_.

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.

superficie CDQuello 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.

Lettura_cd

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