Se necesitan
mecanismos de detección de errores para garantizar transmisiones
libres de errores. Si el receptor detecta algún error, puede
actuar de diversas maneras según los protocolos que esté
utilizando. La solución más sencilla es enviarle un mensaje
al emisor pidiéndole que le reenvíe de nuevo la información
que llegó defectuosa.
Los mecanismos de detección se basan en añadir a las transmisiones
una serie de bits adicionales, denominados bits de redundancia. La redundancia
es aquella parte del mensaje que sería innecesaria en ausencia
de errores (es decir, no aporta información nueva: sólo
permite detectar errores). Algunos métodos incorporan una redundancia
capaz de corregir errores. Estos son los mecanismos de detección
y corrección de errores.
PARIDAD
Las transmisiones se dividen en palabras de cierto número de
bits (por ejemplo, 8 bits) y se envían secuencialmente. A cada
una de estas palabras se le añade un único bit de redundancia
(bit de paridad) de tal forma que la suma de todos los bits de la palabra
sea siempre un número par (paridad par) o impar (paridad impar).
El emisor envía las palabras añadiendo los correspondientes
bits de paridad. El receptor comprobará a su llegada que la suma
de los bits de la palabra incluyendo la redundancia es un número
par (si la codificación convenida entre emisor-receptor es de
paridad par) o un número impar (paridad impar). Si el receptor
encuentra alguna palabra que no se ajuste a la codificación establecida,
le solicitará al emisor que le reenvíe de nuevo la información.
La paridad únicamente permite detectar errores simples, esto
es, que varíe un único bit en cada palabra. Si varían
2 bits, este mecanismo no es capaz de detectar el error.
Veamos un ejemplo de paridad par:
El receptor
realizará la suma de bits a la llegada del mensaje. Si alguna
palabra no suma un número par, significará que se ha producido
un error durante la transmisión.
CODIGO
DE REDUNDANCIA CICLICA (crc)
Los códigos de paridad tienen el inconveniente de que se requiere
demasiada redundancia para detectar únicamente errores simples.
En el ejemplo que hemos visto, sólo un 8/9 de la información
transmitida contenían datos, el resto era redundancia. Los códigos
de redundancia cíclica (CRC) son muy utilizados en la práctica
para la detección de errores en largas secuencias de datos. Se
basan en representar las cadenas de datos como polinomios. El emisor
realiza ciertas operaciones matemáticas antes de enviar los datos.
El receptor realizará, a la llegada de la transmisión,
una división entre un polinomio convenido (polinomio generador).
Si el resto es cero, la transmisión ha sido correcta. Si el resto
es distinto significará que se han producido errores y solicitará
la retransmisión al emisor.
El tratamiento que tienen los mensajes están explicados mediante
planteamientos matemáticos, mas directamente de manera polinomial,
ya que estos mensajes son tratados como si fueran Polinomios, cuyos
coeficientes son 1 y 0.
Si se analiza un mensaje cuyo tamaño sean k bits como un polinomio
cuyos exponentes estarán en el rango [ 0 , k-1 ].
Un aspecto bien importante es el que tanto el emisor como receptor del
mensaje pongan una regla o dejen bien en claro la
generación del Polinomio Generador G (x).
Se debe definir
el polinomio M(x) que representa al mensaje original :
" Longitud: r bits
" Grado: ( r > k )
" Rango: [ 0 , r - 1 ]
La Suma de
Comprobación
" Añade
r bits de 0 a M(x), el mensaje, produciendo xrM(x).
" Divide xrM(x) por G(x), produciendo un resto.
" Transmite T(x) = xrM(x) - resto. T(x) es divisible por G(x).
Sus últimos r bits son el checksum.
" Si hay errores en la transmisión recibiremos T(x)+E(x)
en vez de T(x). El recibidor divide T(x)+E(x) por G(x). Ya que el resto
debido a T(x) es 0, el resto obtenido es completamente debido a E(x).
Si E(x) tiene G(x) como un factor, el resto será 0 y no detectaremos
el error, de otro modo, sí.
" Si hay un error de un bit, E(x) = xi . Si G(x) tiene más
de un término, no puede dividir E(x). Entonces podemos detectar
todos los errores de un bit.
Podemos detectar
todos los errores en grupo con longitudes menos de o igual a r. Si el
grupo tiene una longitud de k, lo podemos escribir como xi(xk-1+...+1)
(i ubica el grupo en el marco). Si G(x) contiene un término de
x0, xi no puede ser un factor y G(x) no puede ser igual a xk-1+...+1
(el grado k-1 es menos de r).
Si el grupo tiene una longitud de r+1, la probabilidad que el grupo
es G(x) es la probabilidad que los r-1 bits intermedios del grupo son
iguales (por definición el primer y el último bits del
grupo son 1), que es (1/2)r-1
CODIGOS CONVOLUCIONALES
El código CRC acepta
un mensaje de k bits y genera una palabra código de n bits. Es
decir, se debe introducir un bloque completo para generar la secuencia
código. Hay aplicaciones sin embargo, donde los bits mensaje
entran en serie en lugar de en bloques, por lo que sería necesario
el uso de "buffers" de tamaño considerable para almacenar
momentáneamente los bloques a codificar. Para evitar el uso de
estos "buffers", en los casos en los que los bits del mensaje
entran en forma serie es preferible el uso de la codificación
convolucional.
Las operaciones que se llevan a cabo sobre los k bits de entrada se
pueden ver como la convolución discreta en el tiempo de la entrada
con la respuesta impulsiva del codificador.
El codificador de un código convolucional binario de razón
1/n, se puede ver como una máquina de estados finitos que consiste
en un registro de desplazamiento de M etapas con conexiones de sumadores
(módulo 2), y un multiplexor que convierte en serie la salida
de los sumadores. Una secuencia de mensaje de L bits produce una secuencia
de salida codificada de longitud n(L + M) bits. La razón del
codificador ("rate") viene dada por:
r = L /
n (L+M) bits/simbolo
Normalmente, se tiene que L>>M. Por lo tanto, la velocidad se
simplifica como:
r = 1 /
n
La profundidad de un código convolucional, expresado en términos
de los bits de mensaje, se define como el número de desplazamientos
en los que influye un bit de mensaje en la salida codificada. Si un
codificador tiene un registro de desplazamiento de M estados, la memoria
del codificador es M, y se necesitan K = M + 1 desplazamientos para
que un bit de mensaje entre y salga finalmente. Por lo tanto la profundidad
del codificador es K.