CSI IX: Codificación de datos
Una vez introdujimos qué era la codificación, en este post veremos algunas técnicas para codificar datos y señales digitales. Recordemos que una señal digital es una secuencia de niveles de tensión discretos: cada uno de ellos es un elemento de la señal. Las técnicas de codificación convierten cada bit de datos 0 o 1 en elementos de señal, buscando ciertas ventajas o características de la misma.
¿Qué es lo que buscamos cuando queremos transmitir?. Pues, de normal, que la velocidad de transmisión sea elevada y que el número de errores pequeño. Pero también que el medio que utilicemos sea barato. Por desgracia, todo a la vez es imposible: canales con mayor ancho de banda aumentarán la velocidad de transmisión y, si están bien apantallados podrán transmitir a grandes distancias sin apenas ruido... ¡pero eso es muy caro!. ¿De qué manera puede ayudar la forma de la señal?(Un poco más de vocabulario). Una señal es unipolar si todos sus elementos tienen el mismo signo (tensión sólo positiva o solo negativa). Polar cuando no. A veces transmitimos los datos sobre dos lineas, de forma que el elemento se transmite como diferencia en la tensión de ambas. Así, un pico de tensión afectará al valor de las dos lineas, pero no a su resta: eso se llama transmisión diferencial. ¡Pero pasemos ya a ver de qué maneras codificamos!
No retorno cero - NRZ. Es la forma más sencilla de codificar: usamos un nivel de tensión para representar el 0 y otro distinto para el 1. Lo más normal es que se codifique de forma polar: un nivel negativo para el 1 y uno positivo para el 0 (NRZ-Level). Se llama no retorno cero porque la señal se mantiene constante al transmitir dos datos seguidos idénticos. Es decir: no retorna al cero.
Una variación de NRZ es NRZInvertida, que es una codificación diferencial: la señal se codifica atendiendo los elementos de señal adyacentes. NRZI, concretamente, codifica los 1s como cambios en el nivel de tensión de la señal. Los ceros se transmiten manteniendo la señal invariable. Una ventaja de NRZI respecto a NRZ es que, con NRZ, el receptor debe comparar la tensión recibida con un umbral para determinar cuáles son los 0s y 1s. Con NRZI, sólo debe monitorizar las transiciones, algo, en principio, más sencillo1.
AMI-bipolar. AMI-bipolar es una técnica de codificación multinivel: utiliza más de dos niveles de tensión. Tres. AMIb codifica los 0 como ausencia de tensión y los 1 como niveles positivos y negativos, alternando en cada aparición de éste. Por eso AMI significa Alternate Mark Inversion. Esta codificación tiene una ventaja importante sobre las dos primeras y es que elimina la componente continua dc de la señal: la suma de los niveles de tensión da cero. Similar a AMI es MLT-3, que transmite los 1s como ciclos de -1, 0, +1, 0, transmitiendo los 0s manteniendo el nivel.
Por otro lado tiene un problema: la inserción de más niveles de tensión incrementan la necesidad de ancho de banda. El receptor tiene que distinguir entre tres niveles, y no dos, por tanto la señal tiene que tener "más espacio" si no queremos aumentar el número de confusiones. Es como si pongo un lápiz encima de una libreta y te pregunto si está a la derecha o a la izquierda. Es fácil responder sin equivocarte. Pero si te pregunto si está a la derecha, izquierda o en el medio, te lo estoy poniendo más difícil: cuanto más grande sea la libreta, más sencillo te resultará responder sin confundirte.
Todas las técnicas anteriores tienen otro problema muy importante que ya apunté. Es imposible tener el mismo reloj para decidir cuánto dura cada elemento de señal. A la larga, uno de los dos se atrasará lo suficiente como para que emisor y receptor no estén de acuerdo en el número de bits enviados, sobretodo si el nivel no cambia. La solución consiste en codificar un flanco como medida de sincronización. Y eso es lo que hacen...
Manchester. Lo que hace es, a mitad de un intervalo de bit, insertar una transición: un cambio de alto a bajo es un 0 y un 1 se codifica como flanco de subida2. Manchester diferencial también hace siempre una transición a mitad del intervalo, pero no representa el dato: un 0 se transmite como una transición al inicio del bit y el 1 como ausencia de transición.
Lo bueno de estas codificaciones es que proporcionan sincronización: el transmisor está diciendo en la propia señal cuando cree él que toca la transición de mitad del intervalo. El receptor puede que piense que el primero está equivocado, pero si quiere entenderle, más le vale hacer caso de lo que dice el emisor y muestrear el valor del bit cuando toque. Además no tienen componente continua y proporciona cierta detección de errores si no se recibe la transición esperada. Por otro lado estamos gastando hasta 2 transiciones para enviar cada bit: es decir incrementamos la velocidad de modulación (numero de transiciones por segundo). La señal, por tanto, requiere un ancho de banda mayor... o transmitirse a menor velocidad.
Y eso es un problema si queremos redes de alta velocidad que sean baratas. Por eso se emplean más trucos ingeniosos. La tecnología es cara y los ingenieros baratos. Decíamos que AMI y NRZ daban problemas de sincronización con secuencias largas invariables. Pues lo que se hace es 'pasar' de los datos y transmitir lo que nos de la gana. Más o menos. B8ZS y HDB3 están basados en AMI y funcionan con tablas: cada secuencia de 8 y 4 bits (respectivamente) se reemplaza (consultando una tabla y teniendo en cuenta la última secuencia) por otra secuencia que contiene violaciones de código: códigos no permitidos por la codificación AMI, como dos niveles de tensión positiva seguidos. De esta manera introducimos transiciones que ayudan en la sincronización. Hay otros esquemas basados en tablas de sustitución, como 4B5B o 8B10B.
Hay maneras más sencillas de violar código. En NRZI podemos acordar que no permitiremos más de cinco ceros seguidos, por ejemplo. Y si encontramos una cadena con 5 ceros, cogemos y le endosamos un 1. El receptor, siempre que encuentre 5 ceros seguidos, sabe que el 1 siguiente lo he puesto yo, y entonces lo quita. Son lo que se llama bits de relleno.
Y con esto ya he puesto bastantes ejemplos. Si piensas que esto no vale para nada y tiene puesto un cable Ethernet en tu red local, te equivocas. Porque Ethernet a 100MB-TX utiliza un esquema 4B5B: sustituye secuencias de 4 bits por secuencias de 5, impidiendo cadenas de 1s o o 0s demasiado largas y luego lo codifica con MLT-3. Y si gastas USB, has de saber que utiliza transmisión diferencial a 1'5V y codifica utilizando NRZI con bits de relleno.
Bueno no, no has de saberlo. ¡Para eso están otros!.
2 En realidad, hay discusión acerca si debería ser al revés, tal y como sostiene Tanenbaum. Yo he seguido el criterio de Stallings, adoptado en Ethernet.
Wiquipedia (inglés): NRZ, AMI, MLT-3, Manchester, 4B5B.
USB in a Nutshell. Hardware
Posts relacionados
0 cosillas:
Publicar un comentario