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ì:
- si divide la sequenza in gruppi di 8 bit (un byte);
- si cerca il carattere corrispondente a ogni byte.
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:
0se nel quadratino prevale il bianco;1se 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.
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 laaè lai); - 01110100 = 64 + 32 + 16 + 4 = 116 →
t.
La parola è "Bit" (3 caratteri, 24 bit). Verifica:
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.
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.
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.
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 |
Più di mezzo gigabyte per soli 10 secondi: ecco perché esiste la compressione MPEG.