11 Codificación de Canal
11 Codificación de Canal
11 Codificación de Canal
11 CODIFICACIÓN DE CANAL
La codificación de canal puede dividirse en dos áreas. Una trata con el diseño de una
forma de onda adecuada y la otra con el diseño de una estructura de bits adecuada. La
codificación o diseño de forma de onda consiste en generar la mejor forma de onda posible,
para el canal de comunicación considerado, para que el proceso de detección que se lleva a
cabo en el receptor sea lo menos sensible posible al ruido y de esta manera reducir la
probabilidad de error de bit. Esto lo hemos visto cuando estudiamos modulación en banda base
y modulación pasa banda, y analizamos esquemas de modulación tales como PSK, FSK, QAM o
codificaciones en banda base tales como unipolar, bipolar, Manchester, etc. Encararemos en
este capítulo la codificación de canal mediante la manipulación de estructuras de bits.
11 Codificación de canal 1
modelo de canal simétrico binario. Nótese que si la probabilidad de recibir erróneamente un bit
es p, entonces obviamente, la probabilidad de recibirlo correctamente es 1 – p.
Capacidad de canal
Sobre esta idea y varias consideraciones teóricas que están fuera de los alcances de la
materia, Shannon desarrolló los temas referentes a capacidad de canal, a través de un trabajo
publicado el año 1948. Esto es, cuánta información es posible transmitir por un canal simétrico
binario cuando a la entrada del mismo se tiene una fuente con una cierta entropía H(S). La
base de los estudios de Shannon estaba en analizar la entropía de la fuente a partir de la
observación de los elementos a la salida del CSB, es decir, del lado del receptor. La capacidad
de canal da cuenta de la cantidad de información que es posible transmitir a través de un
CSB. Sin entrar en detalles teóricos, simplemente definiremos que la capacidad de un canal se
representa por la letra C y se expresa en bits por uso del canal1.
2. Cuando el canal comienza a hacerse ruidoso la capacidad del mismo para transmitir
información comienza a disminuir. El caso extremo ocurre cuando p = 0,5 y en tal caso la
capacidad del canal se hace 0. Esto suena lógico ya que siendo p = 0,5 la probabilidad de error
es tal que, a la salida del canal da lo mismo arrojar una moneda al aire y optar por “1” si salió
1
Shannon hizo un estudio más generalizado y no se refirió solamente al canal simétrico binario sino que determinó la
capacidad de canal para un canal de J entradas y K salidas al que denominó canal discreto sin memoria.
2 11 Codificación de canal
cara u optar por “0” si salió ceca. Es decir, no importa la fuente de información que se tenga a
la entrada del canal ante una situación así.
Fuente Canal
Codificador Decodificador
discreta sin discreto sin Destino
de canal de canal
memoria memoria
Ruido
11 Codificación de canal 3
manera más fiel posible. La codificación de canal pareciera que echa a perder el trabajo
realizado durante la codificación de fuente en la que el objetivo es eliminar bits redundantes.
Sin embargo, las dos operaciones se complementan. Con la codificación de fuente lo que
se busca es aumentar la eficiencia del sistema, mientras que con la codificación de
canal se busca aumentar la confiabilidad del sistema.
k
R (2)
n
La pregunta que surge es: ¿se puede construir un esquema de codificación tal que la
probabilidad de error de bit de un mensaje sea todo lo pequeña que uno desee? La respuesta a
esta pregunta es sí, siempre que se cumplan ciertas condiciones. Esta respuesta afirmativa la
dio Shannon.
Supóngase que un canal discreto sin memoria tiene una entropía H(S) bits por símbolo
de fuente. Supongamos que la fuente transmite un símbolo binario cada Ts segundos. Por lo
tanto, la tasa de información es H(S)/Ts bits por segundo. El codificador entrega símbolos
codificados (más grandes, de longitud n) también cada Ts segundos. Por otra parte, el canal al
que van ingresando los paquetes codificados tiene una capacidad de C bits por uso del canal.
Como el codificador ha agregado bits al mensaje original pero la duración del símbolo binario
se debe mantener igual, resulta que cada bit que conforma el paquete codificado es ahora más
pequeño, digamos de duración TC. Por lo tanto, al canal ingresa un bit (físico) cada TC
segundos. Teniendo todo esto en mente podemos enunciar el teorema de Shannon de
codificación del canal, para un canal discreto sin memoria:
1. Sea una fuente discreta sin memoria, S, que tiene una entropía H(S) y produce
símbolos cada TS segundos. Sea un canal discreto sin memoria con capacidad C al que ingresa
un bit cada TC segundos. Entonces, si
H(S) C
(3)
TS TC
existe un esquema de codificación tal para el cual cada símbolo de la fuente puede ser
transmitido sobre el canal y puede ser reconstruido con una probabilidad de error
arbitrariamente baja.
2. Inversamente, si
H(S) C
TS TC
4 11 Codificación de canal
Consideremos una fuente discreta sin memoria que emite símbolos binarios igualmente
probables (ceros y unos) una vez cada TS segundos. Ya que la entropía de esta fuente es de 1
bit por símbolo, la tasa de información resulta ser 1/TS bits por segundo. La secuencia de
salida de la fuente ingresa a un codificador de canal con tasa de código R = k/n. El codificador
entrega al canal un bit cada TC segundos. Por lo tanto, la capacidad del canal por unidad de
tiempo es C/TC bits por segundo, donde C queda determinado por la probabilidad de transición
del canal, p. Por lo tanto, de acuerdo a la primera parte del Teorema de Shannon, si se cumple
1 C
(4)
TS TC
TC
R
TS
RC (5)
Con este esquema, un error, es decir, una detección incorrecta, puede ocurrir siempre
que se reciban m+1 o más bits incorrectos. Para n = 3 la detección será incorrecta cuando se
reciban 2 o 3 bits incorrectos de un mismo bloque. La probabilidad Pe de recibir
incorrectamente un símbolo codificado, es
n
n
Pe p i 1 pn i
i
i m 1
(6)
11 Codificación de canal 5
Tasa de código Probabilidad de error
R = 1/n Pe (Para p = 0,01)
1 10-2
1/3 3 x 10-4
1/5 10-6
1/7 4 x 10-7
1/9 10-8
1/11 5 x 10-10
Nótese que a medida que se achica R se hace más pequeña la probabilidad de error de
símbolo. Planteándose, por ejemplo, un objetivo de Pe = 10-8, si bien con R = 1/3 se cumple la
(5), la Pe no queda satisfecha. Esto significa que se deben buscar otros valores de k y n que
den 1/3. Sin embargo, el objetivo sí se cumple para R = 1/9 o más chico.
Antes de entrar en detalle con los códigos redundantes veamos las dos maneras básicas
en la que tal redundancia es usada para el control de errores. Una de estas maneras se llama
detección de error y retransmisión. Como su nombre lo indica, en este caso no hay corrección
de error sino solamente detección. El receptor detecta el error valiéndose de los bits de
redundancia pero no lo corrige, simplemente solicita al transmisor que vuelva a transmitir el
símbolo. Nótese que en este caso se requiere una comunicación de dos vías para que puedan
dialogar el transmisor y el receptor.
El segundo tipo de control de error es el control de error hacia adelante (FEC, forward
error control), o control de error en avance. Requiere comunicación de una sola vía y en este
caso los bits de redundancia se usan para la detección y posterior corrección de errores. Sin
embargo, como veremos más adelante, no es posible corregir todos los patrones de error o
situaciones de error posibles. Si así fuera estaríamos en el caso PB = 0 que nunca se puede
alcanzar en la práctica.
Respecto a la comunicación de una o dos vías que se menciona antes, podemos decir
que la comunicación entre dos terminales se puede clasificar de tres maneras. Supóngase dos
terminales A y B. Se dice que la comunicación entre ambas es simplex cuando sólo puede
realizarse en un sentido (por ejemplo desde A hacia B pero no desde B hacia A). La
comunicación se dice que es half-duplex (o semiduplex) cuando se puede realizar en ambos
sentidos pero no simultáneamente (por ejemplo un par de walkies talkies). Y finalmente la
comunicación es full duplex (o dúplex total) cuando se puede realizar en ambos sentidos y
simultáneamente.
6 11 Codificación de canal
transmisión. Si ocurre un error en el receptor, éste envía una confirmación negativa (NAK,
negative acknowledgment) al transmisor y éste retransmite el bloque de datos afectado antes
de seguir transmitiendo con el bloque que correspondía en la secuencia. En este mecanismo es
suficiente una comunicación half duplex ya que la comunicación es en ambos sentidos pero no
simultáneamente.
El segundo mecanismo de ARQ se llama continuo con pullback (retroceso). En este caso
se requiere una comunicación full duplex. Ambas terminales están transmitiendo
simultáneamente. El transmisor envía datos y el receptor envía mensajes de confirmación.
Véase en la Figura 4(b) que se le ha asignado una secuencia de números a los bloques de
datos. Los mensajes ACK y NAK necesitan usar dichos números como referencia para que el
transmisor sepa a qué bloque de datos corresponde el ACK o el NAK que envió el receptor. En
el ejemplo (b) de la Figura 4 se muestra un retardo fijo de 4 bloques entre el mensaje
transmitido y la confirmación recibida simultáneamente. Por ejemplo, cuando se está
transmitiendo el bloque de mensaje 8, simultáneamente se está recibiendo un NAK que
corresponde al mensaje 4. En este tipo de mecanismo ARQ, cuando el transmisor recibe un
NAK vuelve hacia atrás hasta el bloque de datos erróneo y comienza a transmitir la secuencia
de nuevo desde allí.
Figura 4. Esquemas ARQ. (a) Stop and wait (parada y espera). Es half duplex. (b) ARQ continuo con
pullback (retroceso). Es full duplex. (c) ARQ continuo con repetición selectiva (full duplex).
El último tipo de mecanismo ARQ que se muestra en la Figura 4 se llama ARQ continuo
con repetición selectiva. Al igual que en el segundo caso se utiliza un canal full duplex pero
aquí, cuando el transmisor recibe un NAK retransmite solamente el bloque de datos que ha
sido erróneo y luego continúa con la secuencia normalmente (nótese cómo el bloque 4 fue
intercalado entre los bloques 8 y 9).
11 Codificación de canal 7
La elección de algunos de estos mecanismos ARQ depende de la eficiencia buscada y de
la posibilidad o no de usar un canal full duplex. El canal half duplex del ejemplo (a) es menos
costoso que un canal full duplex, sin embargo, la ineficiencia asociada a este mecanismo se
puede ver en las ranuras de tiempo en blanco que hay entre cada bloque. Como contraparte,
en los ejemplos (b) y (c) se ve una mejor eficiencia en la comunicación (no se desperdician
ranuras de tiempo) pero un canal full duplex es más costoso.
Secuencias estructuradas
Un código con bit de paridad simple es una construcción que se hace agregando un solo
bit de redundancia, o bit de paridad, a un grupo o bloque de k bits de datos. Este bit de
paridad toma el valor 1 o 0, según sea, para forzar a que la suma de todos los bits de la
palabra de código (incluyendo el bit de paridad) sea par o impar (según la regla que se haya
8 11 Codificación de canal
adoptado). La operación de suma se hace en aritmética de módulo 2 (es decir, es una
operación lógica OR exclusiva). Para verlo de otro modo, decimos que se agrega un bit de
paridad de tal manera que la cantidad de “unos” en el bloque siempre sea par o siempre sea
impar, según la convención que se haya establecido de antemano. Para el primer caso el
método se llama codificación con bit de paridad par y en el segundo caso codificación con bit
de paridad impar. Nótese que si la codificación es según bit de paridad par entonces la suma
en módulo 2 de todos los bits de la palabra de código da 0. Para el caso de bit de paridad
impar la suma da 1. En la Figura 5 se muestra un ejemplo de código de paridad par.
Una vez que el bloque llega al receptor se debe realizar la decodificación y determinar si
se ha producido un error o no. Esta verificación se hace sumando en módulo 2 todos los bits
del bloque recibido y comprobando el resultado. Si se usó paridad par y la suma da 0 entonces
se supone que no hay errores. Por el contrario, si estando codificado con paridad par el
resultado da 1 quiere decir que un error ha ocurrido.
Para este esquema de codificación la tasa de código R es k/k+1. La ventaja que tiene
este esquema es su sencilla implementación. Un conjunto de compuertas XOR permite generar
el bit de paridad, como lo muestra la Figura 6.
Hay que tener en cuenta que este esquema de codificación no puede corregir los
errores sino que sólo puede detectarlos. Teniendo en cuenta que sólo se puede detectar un
número impar de errores, tratemos de cuantificar la eficiencia de este código. Asumiendo que
todos los bits del bloque son igualmente probables y que son independientes entre sí, podemos
escribir la probabilidad de que ocurran j errores en un bloque de n bits de la siguiente manera:
n
P( j, n) p j (1 p)n j (7)
j
11 Codificación de canal 9
donde p es la probabilidad de que un bit sea recibido con error, o probabilidad de
transición del canal. El número combinatorio
n n!
j
j! (n j)!
representa las diferentes maneras en que j bits pueden ser erróneos dentro de un
bloque de n bits. Por lo tanto, en un código de detección de error con paridad simple, la
probabilidad Pnd de que un bloque erróneo de n bits no sea detectado es:
n / 2 (para n par)
(n-1)/2 (para n impar)
n 2 j
Pnd
j 1
p (1 p)n2 j
2 j
(8)
Ejemplo 2. Configurar un código de detección de error (4, 3) con bit de paridad par, de
tal manera que el bit de paridad aparezca en el extremo izquierdo del código. ¿Cuáles son los
errores que puede detectar? Calcular la probabilidad de que NO se detecte un mensaje
erróneo, asumiendo que todos los bits son independientes entre sí y que la probabilidad de
error de bit o probabilidad de transición del canal es p = 10-3.
Solución.
4 4
Pnd p 2 (1 p)2 p 4
2 4
6 p 2 (1 p)2 p 4
6 p 2 12p 3 7 p 4
6(10 3 )2 12(10 3 )3 7(10 3 ) 4 6 10 6
Ganancia de código
10 11 Codificación de canal
Concretamente, los códigos de error de este ejemplo comienzan a ser efectivos a partir de
Eb/N0 mayor a esos 6 dB. Para valores menores a este umbral los códigos empeoran el
desempeño (confiabilidad) en lugar de mejorarlo. La explicación de esta característica es la
siguiente: el bloque con redundancia (cualquiera sea ella) se debe transmitir en el mismo
tiempo que el bloque sin redundancia (sin codificar). Al agregar bits de redundancia con la
obligación de no modificar el tiempo de transmisión de símbolos, es necesario que cada bit que
forma la palabra de código de n bits tenga menor duración (menor tiempo de bit Tb), en
comparación con el tiempo de bit original. Pensemos que ahora deben transmitirse n bits en el
mismo tiempo en que antes se transmitían k bits, siendo n > k. Esto produce una menor
energía de bit en cada bit del bloque codificado, ya que la energía de bit es directamente
proporcional a Tb, con lo cual aumenta la probabilidad de transición de canal pues ésta es
dependiente de Eb. Para una tasa de transmisión elevada, o sea Tb pequeño, la relación Eb/N0
tiende a ser pequeña. Si encima se le agregan bits de redundancia entonces Eb tiende a ser
más pequeño aún, con lo cual los bits de redundancia tienen más influencia en la energía de
bit que en la mejora de desempeño que pueden producir por sí mismos como parte de un
código de corrección de errores. Superado un cierto umbral de Eb (una tasa de transmisión
más baja) entonces los bits de redundancia empiezan a tener más contribución por su efecto
de detección o corrección que por su efecto indeseado de disminución de la energía de bit Eb.
Por lo tanto, los códigos de detección o corrección de error comienzan a ser efectivos
por encima de un cierto umbral de la relación Eb/N0. La ganancia de código es la reducción de
la relación Eb/N0, expresada en decibeles, requerida para un cierto valor de probabilidad
11 Codificación de canal 11
de error de bit, que se obtiene usando un código de control de error. Por ejemplo, en la
figura se ve que para una probabilidad de error de bit PB = 10-5, el código (24, 12) tiene una
ganancia de código de aproximadamente 2 dB respecto del mismo esquema sin codificar. El
código (127, 92) tiene una ganancia de aproximadamente 2,5 dB.
Esta ganancia de código puede interpretarse como energía de bit que “sobra” y que
puede aprovecharse de alguna manera. Supongamos que la ganancia de código de un cierto
código de corrección de error es de 3 dB para una PB de 10-5. Entonces se puede:
Solución.
p Q 2E b / N 0
y pc la probabilidad de error de bit (probabilidad de transición de canal) del sistema
codificado:
pc Q 2E c / N 0
Eb/N0 es la energía de bit por densidad espectral de potencia de ruido del sistema sin
codificar y Ec/N0 es la energía de bit por densidad espectral de potencia de ruido del sistema
codificado. Q(x) es la función de error.
Eb S
9,12 (9,6 dB)
N0 RN 0
2E b
p Q
N0
Q 18,24 1,02 10 5
(9)
12 11 Codificación de canal
La probabilidad de que el bloque sin codificar sea recibido con al menos un error es:
PM 1 (1 p)k
1
1
p
11
1,12 10 4
(10)
probabilid ad de que
los 11 bits sin
codificar sean
recibidos correctame nte
Con codificación:
15
Rc 4800 6545 bps
11
Ec S
6,688 (8,25 dB)
N0 Rc N 0
Nótese que la relación Ec/N0 para cada bit del código es menor que para los bits sin
codificar ya que se ha aumentado la tasa de bit (pues los bits son “más angostos” debido a su
menor duración) y la potencia se supone constante. Entonces, con el resultado anterior,
tenemos:
2E c
pc Q
N0
Q 13,38 1,36 10 4
(11)
n 15
15
PMc j
j 2
pc j 1 pc 15 j
(12)
15
PMc pc 1 pc 1,94 10 6
2 13
(13)
2
Ahora se ve, comparando los resultados, que la introducción del código corrector de
error produce una mejora de 58 veces.
Los códigos de bloque lineales son una clase de códigos de verificación de paridad más
general que los códigos con paridad simple y también se caracterizan por la notación (n, k)
descripta anteriormente. Una vez más, el codificador transforma un mensaje de k bits (al que
llamaremos vector de mensaje) en un bloque más grande de n bits (al que llamaremos vector
de código).
11 Codificación de canal 13
Los k bits del mensaje pueden formar 2k mensajes distintos llamados k-uplas. Los n bits
del bloque pueden formar como máximo 2n diferentes secuencias, llamadas n-uplas. El
procedimiento de codificación asigna a cada uno de los 2 k mensajes de la k-upla uno de los 2n
posibles mensajes de la n-upla. Un código de bloque representa una asignación uno a uno,
mediante la cual los 2k mensajes de la k-upla son mapeados de manera unívoca en un nuevo
conjunto de 2k mensajes pertenecientes a la n-upla.
Espacios vectoriales
El conjunto formado por una n-upla Vn, es llamado espacio vectorial sobre el campo
binario de dos elementos, 0 y 1. El campo binario tiene dos operaciones aritméticas, suma y
multiplicación. El resultado de estas operaciones pertenece también al campo binario. En el
campo binario estas reglas aritméticas se definen de la siguiente manera:
Suma Multiplicación
0 0= 0 00=0
0 1= 1 01=0
1 0= 1 10=0
1 1= 0 11=1
Un subconjunto S del espacio vectorial Vn se llama subespacio si cumple con las dos
condiciones siguientes:
Por ejemplo, el espacio vectorial V4 queda completamente definido por las siguientes
24 = 16 4uplas:
14 11 Codificación de canal
comunicación, al receptor puede llegar una versión perturbada del código original. Ese vector
que llega al receptor es uno de los 2n vectores de la n-upla que forma el espacio Vn, y que
puede ser un punto grande o un punto chico de los que se muestran en la Figura 8. Si el
vector recibido es un punto chico, el receptor corrige el error eligiendo el punto grande más
cercano. Si el vector recibido está más cerca del punto grande original que de otro punto
grande, la corrección de error es exitosa. Si el vector recibido está más cerca de otro punto
grande distinto al que salió del transmisor, la corrección será fallida, aunque así es como esto
funciona. También será fallida la corrección si el vector recibido es un punto grande distinto al
transmitido. Si el sistema se diseña para detectar errores pero no para corregirlos, un error
será corregible siempre que se reciba un punto chico. No así cuando se reciba un punto
grande. La idea detrás de la elección de un código se puede establecer así:
2. Buscar que los vectores de código estén lo más apartados posible uno de otro (es
decir, que sean lo menos parecido posible). Esto es para que cuando el código de vector sea
perturbado por el ruido se siga decodificando correctamente.
11 Codificación de canal 15
Vector de mensaje Vector de código
000 000000
100 110100
010 011010
110 101110
001 101001
101 011101
011 110011
111 000111
Matriz generadora
U m1V1 m2 V2 mk Vk (14)
Por convención, los vectores de código se designan por vectores fila. Así, el mensaje m,
una secuencia de k bits de mensaje, es una matriz de 1 fila por k columnas:
m m1 , m2 , , mk
U mG (16)
Para el ejemplo del código (6, 3) visto anteriormente, una matriz generadora posible
sería:
16 11 Codificación de canal
V1 1 1 0 1 0 0
(17)
G V2 0 1 1 0 1 0
V3 1 0 1 0 0 1
donde V1, V2 y V3 son tres vectores linealmente independientes (un subconjunto de los
ocho vectores de código) que pueden generar todos los vectores de código. La independencia
lineal se comprueba viendo que la suma de dos cualesquiera de ellos no da como resultado a
ninguno de los tres vectores generadores. Para generar el vector de código correspondiente a,
por ejemplo, el vector de mensaje 1 1 0, se aplica entonces la siguiente ecuación:
V1
U 1 1 0 V2 1 V1 1 V2 0 V3
V3
G P I k
p11 p12 p1(n k ) 1 0 0
p21 p22 p2(n k ) 0 1 0 (18)
pk1 pk 2 pk (n k ) 0 0 1
donde P se llama matriz de paridad (cada pij vale 0 o 1) e Ik es una matriz identidad de
dimensión k x k (tiene “unos” en su diagonal principal y “ceros” en el resto de las posiciones).
Con esta generación sistemática no es necesario almacenar en memoria la matriz identidad.
Combinando la (16) y la (18) cada vector de código se puede expresar como sigue:
donde
11 Codificación de canal 17
m m1, m2,, mk
U u1 , u2 , , un
U p1 , p2 , , pn k ,m1 , m2 , , mk (19)
bits de paridad bits de mensaje
donde
Aquí estamos poniendo los bits de paridad del lado izquierdo del vector de código y los
bits de mensajes del lado derecho. Sin embargo puede escribirse al revés y esto no tiene
efecto sobre las propiedades del código de detección o corrección de errores.
De acuerdo a lo que acabamos de ver, para el código (6, 3) del ejemplo visto antes, el
vector de código puede escribirse así:
1 1 0 1 0 0
U m1 , m2 , m3 0 1 1 0 1 0 (21)
1 0 1 0 0 1
P I3
Se puede ver que los bits redundantes se forman de diferentes maneras. El primer bit
de paridad es la suma del primer y tercer bit de mensaje; el segundo bit de paridad es la suma
del primero y segundo bit de mensaje y el tercer bit de paridad es la suma del segundo y
tercer bit de mensaje. Una estructura de este tipo, comparada con los esquemas de un solo bit
de paridad, provee mayor capacidad para detectar y corregir errores.
Para poder realizar el proceso inverso en el receptor, es decir, para poder decodificar el
vector de código recibido, definimos una matriz H a la que llamamos matriz de verificación de
paridad. Por cada matriz generadora G de dimensión (k x n) existe una matriz H de dimensión
(n – k) x n de tal manera que las filas de G son ortogonales a las filas de H. Esto significa que
GHT = 0, donde HT es la matriz transpuesta de H, y 0 es una matriz nula de dimensión
k x (n – k). La matriz transpuesta de H es de dimensión n x (n – k), cuyas filas son las
columnas de H y cuyas columnas son las filas de H. Para cumplir con los requerimientos de
ortogonalidad la matriz H se escribe como:
18 11 Codificación de canal
H In k PT (23)
I
HT n k
P
1 0 0
0 1 0
(24)
0 0 1
p p12 p1(n k )
11
p21 p22 p2(n k )
pk1 pk 2 pk (n k )
I
GHT P I k n k
P (25)
PP
UHT (mG) HT
m (GHT )
m0
0
Test de síndrome
r Ue (26)
donde e = e1, e2,...,en es el vector de error o patrón de error introducido por el canal.
Hay un total de 2n-1 potenciales patrones de error (el vector e = 0 no produce error) en el
espacio de 2n n-uplas. Se define síndrome de r:
S rHT (27)
11 Codificación de canal 19
detectables entonces el síndrome tiene algún cierto valor distinto de cero. Si r tiene errores
corregibles entonces el síndrome tiene algún valor distinto de cero que puede ser asociado al
patrón de error que causó el error. El decodificador tomará acciones para detectar y corregir el
error (en el caso de un FEC) o bien solicitará una retransmisión (en el caso de un ARQ).
Combinando la (26) y la (27) se obtiene:
S (U e) HT
(28)
UHT eHT
S eHT (29)
Nótese que el síndrome puede ser calculado tanto con el vector recibido r como con el
patrón de error e. Una propiedad importante de los códigos lineales de bloque, fundamental
para el proceso de decodificación, es que el proceso de mapeo entre los patrones de error
corregibles y el síndrome es uno a uno.
Supóngase que se transmite el vector de código U = 101110 del ejemplo de código (6,
3) visto antes, y se recibe el vector r = 001110, es decir, se produce un error en el bit del
extremo izquierdo. Calcular el valor del síndrome S = rHT y verificar que es igual a eHT.
Solución.
S rHT
1 0 0
0 1 0
0 0 1
0 0 1 1 1 0
1 1 0
0 1 1
1 0 1
1, 1 1, 1 1 1 0 0 (sindrome del vector de código perturbado)
S eHT 1 0 0 0 0 0 HT 1 0 0
2. Dos patrones de error que difieren entre sí por una palabra de código válida tienen
el mismo síndrome.
20 11 Codificación de canal
t
n
2n k i
i 0
(30)
Corrección de error
En virtud de lo visto hasta acá, está claro que no sólo es posible detectar un error sino
que también es posible corregirlo. Esto se debe a que se tiene la capacidad de conocer el
patrón de error a partir del cálculo del síndrome. Escribamos las 2 n n-uplas que representan
todos los posibles vectores recibidos en un arreglo tal que la primera fila contenga todos los
vectores de código válidos, comenzando por el vector nulo, y la primera columna contenga
todos los esquemas o patrones de error corregibles. Cada fila, llamada coset, consiste en un
patrón de error en la primera columna (llamado coset líder) seguido por los vectores de código
válidos perturbados por ese coset líder. Este arreglo (llamado arreglo estándar), para un
código (n, k) se escribe de la siguiente manera:
U1 U2 Ui U2 k
e2 U2 e 2 Ui e2 U2k e 2
e3 U2 e 3 Ui e3 U2k e 3
(31)
ej U2 e j Ui e j U2k e j
e 2n k U2 e 2n k U i e 2n k U2k e 2 n k
El arreglo contiene todas las 2n n-uplas del espacio Vn (cada n-upla aparece sólo una
vez). Cada coset consiste de 2k n-uplas. Por lo tanto hay (2n/2k) = 2n-k cosets. Supóngase que
se transmite el vector Ui sobre un canal con ruido. Si el patrón que causa el error es un coset
líder, el vector recibido será decodificado correctamente. Si el patrón de error que causa la
perturbación no es un coset líder entonces se producirá una decodificación errónea.
Si ej es el coset líder o patrón de error del j-ésimo coset, entonces Ui + ej es una n-upla
que pertenece a este coset o fila del arreglo estándar. El síndrome de esta n-upla es:
S (U i e j ) HT U i HT e j HT
Ya que Ui es un vector de código válido resulta ser que UiHT = 0, y por lo tanto se
puede escribir:
S (U i e j ) HT e j HT (32)
De esta última ecuación se puede ver que todos los miembros de un coset tienen el
mismo síndrome y por eso el síndrome es usado para estimar el patrón de error. El síndrome
para cada coset es diferente.
2. Localizar el patrón de error, ej, que tiene el mismo síndrome que el calculado en 1,
y cuyo valor es igual a rHT.
11 Codificación de canal 21
4. El vector recibido corregido se calcula como U = r + ej. La suma es consecuencia de
las reglas de operación en módulo 2 (sumar o restar es lo mismo).
Usando la (30) se puede verificar que este código corrige todos los errores simples. Los
vectores de código válidos son los ocho vectores de la primera fila, y los patrones de error
corregibles son los ocho vectores líderes de la primera columna (incluyendo el patrón de error
nulo). Todos los patrones de error de 1 bit son corregibles. Nótese que luego de ubicar todos
los patrones de error de 1 bit queda todavía algún patrón más ya que no se ha completado la
64 6-upla. Es decir, queda un coset libre (con un coset líder asociado) que puede ser
completado y por lo tanto hay un patrón de error más que puede ser corregido. Al respecto,
contamos con flexibilidad para elegir este patrón de manera tal de completar la n-upla en el
último del coset, sin que se repitan las 6uplas. En la tabla anterior, este patrón líder se eligió
como 010001. La decodificación será correcta si, y sólo si, el patrón de error causado por el
canal es uno de los patrones líderes.
1 0 0
0 1 0
0 0 1
S ej
1 1 0
0 1 1
1 0 1
22 11 Codificación de canal
Como se dijo ya anteriormente, se recibe un vector r y se calcula su síndrome usando
la ecuación S = rHT. Luego se usa ese síndrome en la tabla anterior para encontrar el
correspondiente patrón de error. Este patrón de error es una estimación del error y se denota
como ê. Finalmente, el decodificador suma ê a r para obtener una estimación del vector
transmitido, al que lo identificará por Û.
ˆ re
U ˆ (U e) e
ˆ U (e e
ˆ) (33)
Solución.
S 0 0 1 1 1 0 HT 1 0 0
ˆ 1 0 0 0 0 0
e
ˆ re
U ˆ
0 0 1 1 1 01 0 0 0 0 0
1 0 1 1 1 0
U = 100101101
V = 011110100
d(U, V) = 6
U + V = 111011001
Por lo tanto, se puede ver que la distancia de Hamming entre dos vectores es el peso
de Hamming de la suma (o resta) de ambos. Esta propiedad es útil para hallar la distancia
11 Codificación de canal 23
mínima entre dos vectores del conjunto de palabras de código válidas. Como la suma de dos
vectores de código da como resultado otro vector de código perteneciente al subespacio, la
distancia mínima viene dada por aquel vector de código del subespacio que tiene la menor
cantidad de “1” (sin considerar el vector nulo). Esto nos libera de calcular la distancia entre
cada uno de los pares posibles de vectores de código. La distancia entre vectores de código
nos da una pauta de qué tan separados están entre sí. En particular, la distancia mínima dmin
nos da el peor caso o “peor separación”. Con esto podemos determinar la capacidad de
corrección o detección de errores que tiene el código.
Una vez que se recibe el vector r, la tarea del decodificador es estimar cuál fue el
vector U transmitido. La estrategia es entonces buscar aquel vector U que presente la menor
distancia respecto del vector r recibido.
24 11 Codificación de canal
Si la tarea del receptor es detectar errores y no corregirlos, se puede ver en la
Figura 9 que cualquier vector recibido afectado por el ruido, representado por un punto negro
y que implica 1, 2, 3 o 4 bits erróneos, puede ser detectado. Sin embargo, si se producen 5
errores en la transmisión y el vector transmitido fue U, el detector recibirá V, con lo cual no
podrá detectar los errores (similarmente ocurre si se transmitió V y se producen 5 errores).
Del análisis hecho anteriormente podemos ver que la capacidad que tiene un
determinado código para detectar y/o corregir errores está relacionada con la distancia mínima
entre dos vectores de código. La tarea del detector, para el caso de corrección de errores, es
determinar en qué región está el vector recibido para tomar una decisión, como se muestra en
la Figura 9(a). Si el vector recibido “cae” en la región 1 el criterio es decidir por U. Si “cae” en
la región 2 el criterio es optar por el vector V. Con tal criterio, y con una distancia dmin = 5
como se muestra en el ejemplo, el detector puede corregir hasta 2 errores. En general el
máximo número garantizado de errores corregibles por palabra de código, t, viene dado por
la expresión:
d 1
t min (34)
2
donde x representa la parte entera de x. Tiene que quedar claro que la (34) nos dice
que el código puede corregir hasta t errores inclusive. Sin embargo, muchas veces un código
que corrige todas las secuencias posibles de hasta t errores puede también corregir ciertas
secuencias de t + 1 errores. Cuando vimos el ejemplo de código (6, 3) comprobamos que
quedaba una fila sin completar en el arreglo estándar, luego de haber puesto todos los
patrones de 1 error. En general, un código lineal de bloque (n, k) que con seguridad puede
corregir hasta t errores, es capaz de corregir un total de 2n-k patrones de error.
Un código de bloque que con seguridad corrige hasta t errores, tiene una probabilidad
de hacer una detección errónea Pe de la palabra de código, que viene dada por la siguiente
desigualdad:
n
n
Pe p j 1 pn j
j
j t 1
(35)
Un código también puede usarse para detectar errores solamente. En la Figura 9 vemos
que cualquier vector recibido caracterizado por un punto negro puede ser identificado como un
error. La capacidad de detectar e errores, viene dada por la distancia mínima de la siguiente
manera:
e dmin 1 (36)
Un código de bloque con distancia mínima dmin garantiza que todos los patrones con
(dmin – 1) errores, o menos, pueden ser detectados, lo cual no significa que no puedan
detectarse algunos patrones de error más. Del arreglo estándar puede verse que un código (n,
k) puede detectar un total de (2n – 2k) patrones de error diferentes.
Designemos con Aj al número de vectores de código con peso j. Los números A0, A1,
A2,...An forman la distribución de pesos del código. Si el código se usa sólo para detección de
errores sobre un CSB, entonces la probabilidad de que el código no detecte un error en un
vector de código viene dada por la expresión:
11 Codificación de canal 25
n
Pnd A p
j 1
j
j
1 pn j (37)
donde, una vez más, p es la probabilidad de transición del canal. Ya que el código tiene
una distancia mínima dmin, resulta que los valores de A1 hasta Admin – 1 son todos cero. Por lo
tanto, la (37) se puede rescribir como:
n
Pnd A p
j d min
j
j
1 pn j (38)
Este resultado surge de considerar que para que un error no sea detectado, el patrón
de error debe ser igual a un vector de código válido, puesto que generará otro vector de
código válido y consecuentemente el detector lo considerará como un vector de código sin
error. Lo que hace la (37) o (38) es considerar de cuántas maneras pueden generarse vectores
de código válidos.
Resumen
El agregado de bits de redundancia obliga a achicar los tiempos de bit, por lo que el
costo para obtener el beneficio de corrección o detección de error es un aumento del ancho de
banda ocupado. Incluso puede ocurrir que el perjuicio causado por la reducción de la energía
de bit al agregar bits de redundancia (es decir, el aumento de la probabilidad de transición de
canal), sea mayor que el beneficio aportado por el corrector o detector de errores, por lo que
en ciertas condiciones de bajo valor de Eb/N0 la PB puede empeorar en vez de mejorar.
26 11 Codificación de canal