4.5.1 Codifica DC e sequenza a zig-zag

Dopo la quantizzazione dei coefficienti, ottengo una matrice 8x8 come quella di tabella 3 in cui molti coefficienti sono nulli, bisogna ora rappresentare in modo più efficiente questa matrice.

Possiamo notare che i coefficienti diversi da 0, sono concentrati nella matrice nella parte in alto a sinistra, poiché i valori 0 rappresentano alte frequenze, mentre i restanti basse frequenze, cerchiamo di ordinarle in modo da poter trovare i valori 0 alla fine della matrice, creando per la fase successiva, lunghe sequenze di zero che permettono una più efficace compressione.

Il processo di ordinamento richiesto per questa fase segue un percorso a zig-zag come in figura 14.

 

Figura 14 - Codifica a zig-zag

 

Il primo coefficiente della matrice (coordinate 0, 0) è chiamato coefficiente DC, mentre i restanti 63 coefficienti sono chiamati coefficienti AC.

Dopo aver ordinato i coefficienti, posso codificarli con una codifica di tipo "run-lenght encoding" (RLE), in cui codificherò in modo efficiente le sequenze di zeri.

Il coefficiente DC del blocco è codificato come differenza con il coefficiente DC del blocco precedente; questa differenza sarà indicata come (Dcdiff), questo numero lo codificheremo ulteriormente nel seguente modo: si costruisce una coppia (Size, Ampiezza) dove Size è il numero di bit necessari a rappresentare il coefficiente DC, e Ampiezza è il Dcdiff stesso. Size può essere calcolato attraverso la tabella 4.

Size

Ampiezza

1

-1

  1

2

-3, -2

  2, 3

3

-7 …-4

  4 … 7

4

-15 … -8

  8 … 15

5

-31 … - 16

  16 … 31

6

-63 … - 32

  32 … 63

7

- 127 … - 64

  64 … 127

8

- 255 … -128

  128 … 125

9

- 511 … -256

  256 … 511

10

-1023 … -512

  512 … 1023

Tabella 4 - Baseline Entropy Encoding

I restanti 63 coefficienti (AC), vengono rappresentati nel seguente modo: (Runlenght, Size)(Ampiezza) dove Runlenght è il numero di zeri consecutivi e può rappresentare sequenze di zero da 0 a 15; ad esempio il simbolo (15, 0) rappresenta 16 zeri consecutivi e posso usarne sino a tre in sequenza e poi dovrò mettere il simbolo (Ampiezza) del valore non nullo dopo la sequenza di zeri.

La sequenza di zeri che termina senza un numero diverso da zero non viene codificata in quanto il numero di elementi finali, nella decodifica, dovrà comunque essere uguale a 63, quindi una volta decodificati gli elementi sino al primo non nullo, aggiungo degli zeri per completare la sequenza sino a 63 elementi.

Size è equivalente alla codifica per coefficiente DC. Ampiezza è il primo numero diverso da zero che viene trovato dopo la sequenza di zeri. Dopo questa codifica per tenere traccia di dove finisce un blocco si usa il simbolo (0, 0), questo simbolo codifica anche gli zeri restanti.