# Codifica di canale

In telecomunicazioni il termine codifica di canale designa, in una trasmissione digitale, l'insieme di tecniche di elaborazione del segnale informativo, a monte della trasmissione, volte a garantire il più possibile la trasmissione ottimale di un messaggio, ossia l'integrità dei dati attraverso un canale rumoroso che introduce errori nella trasmissione dei dati. In particolare si tratta di tecniche che introducono ridondanza in un flusso informativo digitale utilizzata poi per la rilevazione e/o la correzione dell'errore a valle in ricezione. Nelle telecomunicazioni la codifica di canale, assieme alla codifica di sorgente, rappresenta dunque uno dei vantaggi delle trasmissioni digitali rispetto a quelle analogiche essendo una prerogativa della rappresentazione in formato digitale dell'informazione.
L'elemento in trasmissione deputato alla codifica di canale è detto codificatore di canale, quello complementare in ricezione è detto decodificatore di canale. La tecnica, a parità di BER, in virtù della rilevazione e correzione degli errori, consente eventualmente anche la riduzione del rapporto segnale/rumore, che è un parametro direttamente legato alla probabilità di errore, ovvero quindi della potenza del segnale utile consentendo così un risparmio di potenza in trasmissione. Il prezzo che si paga per l'uso queste tecniche è la riduzione di efficienza di trasmissione di dati utili (Goodput) ovvero la riduzione di efficienza spettrale, data l'introduzione di ridondanza e la necessità di una banda maggiore per la nuova trasmissione a parità di velocità di trasmissione. L'operazione di codifica di canale fa uso di conoscenze proprie della teoria dei codici.

## Descrizione
### Tipologie di codici

Esistono varie tipologie di codici, principalmente divisibili in codici a blocchi (o lineari, come quello di Hamming) e codici convoluzionali.
Nel caso dei codici a blocchi, tutti i blocchi-dati sono legati tra loro da sequenze aggiunte ai pacchetti e distinguibili tra loro; nei codici convoluzionali invece ai pacchetti viene aggiunta una certa ridondanza Q e i pacchetti, sebbene non distinguibili, sono comunque tra loro legati.
Un caso particolare è costituito invece dall'uso di sistemi di codifica di canale concatenata ovvero l'utilizzo di più codici concatenati in cascata tra loro, per aumentare l'efficacia della correzione di errore (outer code e inner code).

### Codici di controllo e correzione

A seconda del tipo di messaggio da trasmettere si sceglierà il tipo di controllo degli errori e, eventualmente, di correzione. Per esempio, nell'invio di fotogrammi video in videoconferenza non è richiesto che arrivino integri tutti i dati; in altri casi, come ad esempio nella trasmissione FTP, è imperativo garantire l'arrivo corretto di tutti i dati. Di seguito sono brevemente introdotte le due modalità di codifica più usate: si distinguono codici a rilevazione d'errore e codici a rilevazione e correzione d'errore.

### Valutazione di un codice

Le prestazioni di un codice vengono misurate in:
* capacità di rivelazione: numero massimo di errori che si riescono a rivelare in una parola di codice.
* capacità di correzione: numero massimo di errori che si riescono a correggere in una parola di codice. Questa è sempre minore della capacità di rilevazione; di conseguenza in un codice a rilevazione/correzione non tutti gli errori vengono eliminati: tipicamente si riesce a ridurre il BER fino a valori dell'ordine di 10$^{-6}$.
* code rate: è il rapporto (minore di 1) fra i bit di messaggio (cioè l'informazione k) e la lunghezza totale della parola di codice (n), $R_{c}={\frac {k}{n}}$, con $n-k$ pari alla ridondanza introdotta. Rappresenta una misura in termini di efficienza del codice: tanto più tale rapporto è basso (cioè tanto più $n-k$ è alto) e tanto più si introduce ridondanza ed il codice di canale è efficiente, ma diminuisce l'efficienza di trasmissione dei dati utili ed aumenta la necessità di banda per la trasmissione (l'inverso del code rate $R_{c}$ è il fattore d'espansione di banda, spesso indicato con β).
In particolare se il codificatore di canale riceverà in ingresso un flusso di bit con tasso pari a Rs, esso dovrà garantire in uscita un ritmo di emissione almeno pari a quello di ingresso per evitare perdita di informazione; poiché di fatto esso introduce della ridondanza di bit il flusso in uscita dovrà avere un bit-rate complessivo Rc più alto di quello di ingresso per garantire la suddetta condizione.

## FEC (Forward Error Correction)

Il FEC (acronimo di Forward Error Correction) è un meccanismo di codifica che consente di mantenere la qualità di un segnale digitale rilevando ed entro certi limiti correggendo gli errori introdotti dal canale, trasmettendo insieme al segnale codificato utile una serie di dati di controllo aggiuntivi, ricavati dal segnale stesso applicando diversi tipi di algoritmi (es. Reed-Solomon). In ricezione, i dati di controllo vengono ricalcolati sul segnale utile ricevuto e confrontati con quelli trasmessi. Questo consente di rilevare dove sono presenti errori e di conseguenza correggere in tutto o in parte i dati ricevuti, a seconda dell'algoritmo e della quantità di errori introdotti dal canale. La tecnica si applica per ridurre gli effetti degli errori indotti per esempio dai disturbi atmosferici nel caso delle trasmissioni in aria libera o dall'attenuazione e da altri effetti fisici nelle trasmissioni su fibra ottica, aumentando di fatto sia la robustezza che la portata utile ottenibile a spese di un piccolo aumento di banda per l'aggiunta dei dati di verifica.