Vai al contenuto

Lezione 05 · Rappresentazione del testo e dei dati multimediali

Cosa impari

  • come il calcolatore codifica un testo con il codice ASCII (e cosa sono le estensioni e Unicode);
  • cosa significano campionamento e quantizzazione per suoni, immagini e video;
  • a calcolare quanti bit servono per un testo, un brano audio, un'immagine o un film;
  • a cosa serve la compressione (MP3, JPEG, MPEG).

Nelle lezioni precedenti hai visto come il calcolatore rappresenta i numeri in binario. Ma un computer gestisce anche lettere, musica, foto e film. Anche queste informazioni devono diventare sequenze di bit. In questa lezione vedi come, e impari a calcolare quanto spazio occupano.

Codificare un testo: il codice ASCII

Per scrivere un testo in inglese servono le lettere maiuscole e minuscole, le cifre, la punteggiatura, le parentesi, gli operatori aritmetici, lo spazio e il simbolo di "a capo". In tutto bastano 128 simboli.

Il codice più diffuso è l'ASCII (American Standard Code for Information Interchange). Ogni carattere occupa 8 bit (un byte), ma si usano solo i 7 bit meno significativi: il bit più significativo, b7, vale sempre 0. Con 7 bit si ottengono 2⁷ = 128 simboli diversi.

Carattere Codice ASCII (binario) Decimale
C 01000011 67
i 01101001 105
a 01100001 97
o 01101111 111
spazio 00100000 32
. 00101110 46

Quindi la parola "Ciao" si codifica con 4 caratteri × 8 bit = 32 bit (4 byte).

La frase "Ciao a tutti." ha 13 caratteri (anche gli spazi e il punto contano!), quindi occupa 13 × 8 = 104 bit (13 byte).

La regola da ricordare

Un testo di n caratteri in ASCII occupa 8 · n bit = n byte.

Esempio: la frase «Quanti bit occorrono per codificare questo testo in ASCII?» ha n = 58 caratteri → 464 bit → 58 byte.

Il problema inverso: dai bit al testo

Data una sequenza di bit in ASCII, si ricava il testo così:

  1. si divide la sequenza in gruppi di 8 bit (un byte);
  2. si cerca il carattere corrispondente a ogni byte.
01101001 01101100 00100000 01010000 01101111 00101110
   i        l      spazio     P        o        .

Il testo è "il Po.".

Provalo in Python

In Python la funzione ord() restituisce il codice numerico di un carattere; la funzione chr() fa il contrario. Con format(numero, '08b') puoi vedere il numero in binario su 8 cifre, e con int(stringa, 2) puoi convertire una stringa binaria in intero.

parola = input('Scrivi una parola: ')

# Codifica: da carattere a byte
for carattere in parola:
    codice = ord(carattere)
    print(carattere, '->', codice, '->', format(codice, '08b'))

print('Bit necessari:', 8 * len(parola))

# Decodifica: da byte a carattere
sequenza = '01101001 01101100 00100000 01010000 01101111 00101110'
testo = ''
for byte in sequenza.split():
    testo = testo + chr(int(byte, 2))
print('La sequenza di bit codifica:', testo)

Prova con "Ciao": devi ritrovare gli stessi codici della tabella.

Oltre l'ASCII

Codifica Bit per carattere Caratteri
ASCII 8 (ne usa 7) 128
ASCII estesa 8 256 (128 in più, diversi per ogni variante)
Unicode storicamente 16 più di 65 000 (oggi oltre un milione di posizioni disponibili)

Le lettere accentate come è o à non sono nell'ASCII di base. Per questo esiste Unicode, che vuole dare un codice a tutti i caratteri di tutte le lingue. Unicode si scrive in memoria con i formati UTF (Unicode Transformation Format): UTF-8, UTF-16 e UTF-32. Il numero nel nome indica l'unità minima: in UTF-8 un carattere occupa da 1 a 4 byte (le lettere inglesi 1 byte, la è 2 byte).

Testo e formattazione

Per mostrare correttamente un documento (a video o su carta) non bastano i caratteri: servono anche informazioni di formattazione (colori, grassetto, dimensioni). Le codificano formati come HTML (le pagine web, ad esempio <font color="red"> testo rosso </font>), DOC (Microsoft Word), PDF e LaTeX.

Tool · ASCII e Unicode

Scrivi una parola e guarda i codici di ogni carattere; nella seconda scheda incolla dei byte e leggi il testo. Prova a scrivere una lettera accentata: vedrai che in UTF-8 occupa 2 byte.

Dati multimediali: dal continuo al discreto

Suoni, immagini e video sono grandezze continue: variano nel tempo e nello spazio senza "salti". Un calcolatore invece rappresenta solo informazioni discrete: un numero finito di valori, né infinitamente grandi né infinitamente piccoli.

Per passare dal mondo reale al digitale serve una conversione analogico-digitale, fatta in due passi:

  • campionamento: si scelgono solo alcuni punti (i campioni) dell'informazione reale. Si divide rispetto al tempo (suono), allo spazio (immagine) o a entrambi (video);
  • quantizzazione: ogni campione viene approssimato con il valore più vicino tra quelli rappresentabili con i bit a disposizione.

Il suono

Un oggetto produce suono vibrando in un mezzo come l'aria. Le vibrazioni creano onde di pressione che fanno vibrare i nostri timpani. L'intensità della pressione determina il volume; la frequenza (numero di oscillazioni al secondo, in hertz, Hz) determina la tonalità.

Campionamento del suono

Non si può registrare ogni punto dell'onda: si misura la sua altezza a intervalli regolari. Il numero di misure al secondo è la frequenza di campionamento. Più è alta, più la registrazione è fedele.

Regola di Nyquist

Per non perdere informazione, la frequenza di campionamento deve essere almeno il doppio della frequenza massima contenuta nel suono.

L'orecchio umano sente fino a circa 20 000 Hz, quindi bastano circa 40 000 Hz. Lo standard dei CD è 44 100 Hz (44,1 kHz).

Quantizzazione del suono

Ogni campione è un numero (positivo o negativo) scritto con un certo numero di bit. Più bit si usano, più il campione è preciso. Un CD audio campiona a 44,1 kHz e usa 16 bit per campione, cioè 2¹⁶ = 65 536 livelli.

Quanto spazio occupa un brano?

Esempio. Un brano di 3 minuti, campionato a 30 kHz, quantizzato a 16 bit:

Passo Calcolo Risultato
durata 3 min × 60 180 s
campioni al secondo 30 kHz 30 000
bit al secondo 30 000 × 16 480 000 bit
bit totali 480 000 × 180 86 400 000 bit
byte totali 86 400 000 / 8 10 800 000 byte
in KB 10 800 000 / 1024 ≈ 10 546,9 KB
in MB 10 546,9 / 1024 ≈ 10,3 MB

KB e MB

In queste pagine si usa 1 KB = 1024 byte e 1 MB = 1024 KB.

I vantaggi del suono digitale

  • Elaborazione: si può comprimere il segnale. La compressione MP3 è con perdita: elimina le frequenze che l'orecchio non sente e può ridurre il file fino a 10 volte (10:1).
  • Riproduzione: i bit si copiano senza perdere nulla. Originale e copia sono identici.

Le immagini

Un'immagine si divide con una griglia di righe orizzontali e verticali. Ogni quadratino si chiama pixel (picture element).

Per un'immagine in bianco e nero (senza grigi) basta 1 bit per pixel:

  • 0 se nel quadratino prevale il bianco;
  • 1 se prevale il nero.

L'immagine digitale è un'approssimazione di quella reale. È più fedele se i pixel sono di più (quadratini più piccoli). Per esempio, la stringa 0000000 0111100 0110000 0100000 descrive un'immagine di 4 righe × 7 colonne = 28 pixel. Disegnala con Python:

bit = '0000000 0111100 0110000 0100000'

for riga in bit.split():
    disegno = ''
    for pixel in riga:
        if pixel == '1':
            disegno = disegno + '██'   # pixel nero
        else:
            disegno = disegno + '··'   # pixel bianco
    print(disegno)

Con 28 pixel la figura è molto grossolana. Con 112 pixel (griglia più fitta) la stessa figura sarebbe molto più riconoscibile.

Livelli di grigio e colori

Con 1 bit per pixel hai solo bianco e nero. Per le sfumature di grigio servono più bit per pixel:

Con L bit per pixel si codificano 2^L livelli (di grigio o di colore).

Bit per pixel Livelli
1 2 (bianco e nero)
4 16
8 256
24 16 777 216 (≈ 16,7 milioni)

Le sfumature intermedie vengono approssimate con il livello più vicino.

Per i colori si usa spesso la codifica RGB: il colore di ogni pixel è la somma di tre colori fondamentali, Rosso (Red), Verde (Green) e Blu (Blue). La profondità di colore è il numero di bit per pixel:

  • 24 bit (8 per R, 8 per G, 8 per B): circa 16,7 milioni di colori, detti "colori veri";
  • 48 bit: alta definizione.

Questa rappresentazione pixel per pixel si chiama codifica bitmap. Le dimensioni in pixel dell'immagine (ad esempio 640×480, 1024×768, 1280×720) si chiamano risoluzione.

Risoluzione e densità

Per uno schermo si parla anche di pixel per pollice (ppi): è la densità dei pixel, cioè quanto sono fitti. Negli esercizi "risoluzione 640×480" indica invece quanti pixel ha l'immagine.

Quanto spazio occupa un'immagine?

bit = numero di pixel × bit per pixel

Esempio. Immagine bitmap 640×480 a 256 colori:

  • pixel: 640 × 480 = 307 200;
  • 256 colori = 2⁸ → 8 bit per pixel;
  • bit totali: 307 200 × 8 = 2 457 600 bit;
  • byte: 2 457 600 / 8 = 307 200 byte = 300 KB ≈ 0,29 MB.
larghezza = int(input('Larghezza in pixel: '))
altezza = int(input('Altezza in pixel: '))
bit_per_pixel = int(input('Bit per pixel: '))

pixel = larghezza * altezza
bit = pixel * bit_per_pixel
byte = bit / 8
print('Colori possibili per pixel:', 2 ** bit_per_pixel)
print('Pixel:', pixel)
print('Bit:', bit)
print(f'Byte: {byte:.0f}  =  {byte / 1024:.1f} KB  =  {byte / 1024 / 1024:.2f} MB')

Prova con 640, 480, 8: devi ottenere 307200 byte = 300.0 KB.

Compressione delle immagini

Formati come TIFF e JPEG riducono lo spazio. Il JPEG sfrutta un fatto: l'occhio è poco sensibile alle piccole variazioni di tonalità (colore), ma molto sensibile alle variazioni di luminosità. Descrivendo il colore in modo meno preciso, il JPEG comprime fino a 20:1 senza differenze visibili.

I video

Un video è una sequenza di immagini nel tempo. La retina mantiene un'immagine per qualche millesimo di secondo: se le immagini scorrono abbastanza in fretta, le vediamo in movimento.

Il campionamento nel tempo consiste nel catturare un certo numero di immagini (frame) al secondo, misurato in fps (frame per second):

  • cinema: 24 fps;
  • televisione: 25–30 fps.

bit = pixel per frame × bit per pixel × fps × secondi

Esempio. Film 4K (3840×2160), profondità 48 bit, 24 fps, durata 2 ore:

Passo Calcolo Risultato
pixel per frame 3840 × 2160 8 294 400
bit per frame 8 294 400 × 48 398 131 200
bit al secondo 398 131 200 × 24 9 555 148 800
secondi 2 × 3600 7 200
bit totali 9 555 148 800 × 7 200 68 797 071 360 000
byte / 8 8 599 633 920 000
in GB / 1024 / 1024 / 1024 ≈ 8 009 GB ≈ 7,8 TB

Quasi 8 terabyte per un film: per questo i video vanno compressi.

Compressione dei video

Formati come MPEG e VVC comprimono i video. L'MPEG usa la stessa idea del JPEG sui singoli frame. In più, due frame consecutivi sono quasi uguali: l'MPEG memorizza solo la differenza tra un frame e il successivo, e così raggiunge compressioni molto elevate.

Tool · Spazio occupato da immagini, suoni e video

Inserisci i dati dell'esercizio: il tool rifà la tabella dei passaggi e converte il risultato in KB, MB o GB.

Errori frequenti negli esercizi

Errore Cosa succede Come si corregge
dimenticare spazi e punteggiatura nel conteggio dei caratteri numero di byte troppo basso conta ogni carattere, anche spazi e punti
usare il numero di colori al posto dei bit (256 invece di 8) risultato 32 volte più grande bit per pixel = esponente: 256 = 2⁸ → 8 bit
dimenticare di convertire i minuti (o le ore) in secondi risultato 60 volte troppo piccolo porta sempre la durata in secondi
confondere bit e byte risultato sbagliato di un fattore 8 byte = bit / 8
dividere per 1000 invece che per 1024 piccola differenza nel risultato usa la convenzione di queste pagine: 1 KB = 1024 byte

Esercizi

Esercizio 1 · Decodifica ASCII. Quale parola codifica la sequenza 01000010 01101001 01110100? Suggerimento: A vale 65 (01000001) e a vale 97 (01100001); le lettere successive hanno codici consecutivi.

# Puoi verificare la tua risposta qui
Soluzione

Dividi in byte e converti in decimale:

  • 01000010 = 64 + 2 = 66 → B (65 è A, quindi 66 è B);
  • 01101001 = 64 + 32 + 8 + 1 = 105 → i (97 è a, 105 − 97 = 8, l'ottava lettera dopo la a è la i);
  • 01110100 = 64 + 32 + 16 + 4 = 116 → t.

La parola è "Bit" (3 caratteri, 24 bit). Verifica:

for byte in '01000010 01101001 01110100'.split():
    print(int(byte, 2), chr(int(byte, 2)))

Esercizio 2 · Immagine a 65 536 colori. Quanti byte servono per un'immagine bitmap 1024×768 in cui ogni pixel può avere 65 536 colori? Esprimi il risultato anche in KB e MB.

# Puoi verificare la tua risposta qui
Soluzione
  • pixel: 1024 × 768 = 786 432;
  • 65 536 = 2¹⁶ → 16 bit per pixel (2 byte);
  • bit: 786 432 × 16 = 12 582 912 bit;
  • byte: 12 582 912 / 8 = 1 572 864 byte = 1 536 KB = 1,5 MB.
byte = 1024 * 768 * 16 / 8
print(byte, byte / 1024, byte / 1024 / 1024)

Esercizio 3 · Un breve video. Quanto spazio occupa, senza compressione, un video di 10 secondi con risoluzione 1280×720, profondità di colore 24 bit, a 25 fps? Dai il risultato in bit, byte e MB.

# Puoi verificare la tua risposta qui
Soluzione
Passo Calcolo Risultato
pixel per frame 1280 × 720 921 600
bit per frame 921 600 × 24 22 118 400
bit al secondo 22 118 400 × 25 552 960 000
bit totali 552 960 000 × 10 5 529 600 000 bit
byte / 8 691 200 000 byte
MB / 1024 / 1024 ≈ 659,2 MB
bit = 1280 * 720 * 24 * 25 * 10
print(bit, bit / 8, bit / 8 / 1024 / 1024)

Più di mezzo gigabyte per soli 10 secondi: ecco perché esiste la compressione MPEG.

Verifica