Documentos de Académico
Documentos de Profesional
Documentos de Cultura
12 Códigos Cíclicos
12 Códigos Cíclicos
12 CÓDIGOS CÍCLICOS
Los códigos cíclicos binarios forman parte de una subclase importante de códigos de
bloque lineal. Estos códigos se pueden implementar fácilmente utilizando registros de
desplazamiento y el cálculo del síndrome también puede hacerse fácilmente usando registros
de desplazamiento. La estructura algebraica de los códigos cíclicos es apropiada para llevar a
cabo métodos de decodificación eficientes. Un código lineal (n, k) se llama código cíclico si
puede ser descripto cumpliendo con la siguiente propiedad. Si la n-upla U = (u0, u1, u2,..., un-1)
es un vector de código perteneciente al subespacio S, entonces U(1) = (un-1, u0, u1,..., un-2)
obtenido por un desplazamiento circular o desplazamiento cíclico es también un vector de
código perteneciente a S. En general, U(i) = (un-i, un-i+1,..., un-1, u0, u1, ..., un-i-1), obtenido
como consecuencia de i desplazamientos cíclicos del vector U, también es un vector
perteneciente a S.
Los elementos del vector U = (u0, u1, u2,..., un-1) pueden ser tratados como los
coeficientes de un polinomio U(X) de la siguiente manera:
U( X ) u0 u1 X u2 X 2 u n 1 X n 1 (1)
Es decir que un vector U de una n-upla puede ser representado por un polinomio de
grado n-1 o menor. La presencia o ausencia de cada término en el polinomio indica la
presencia de un 1 o un 0, respectivamente, en el correspondiente lugar de la n-upla. Si el
coeficiente un-1 es 1 entonces el polinomio es de grado n-1.
Al expresar los vectores de código de manera polinomial, la naturaleza cíclica del código
se manifiesta de la siguiente manera. Si U(X) es un polinomio de grado n-1 que representa a
una palabra de código o codeword, entonces U(i)(X), resto de la división entre XiU(X) y Xn + 1,
es también una palabra de código:
X i U(X ) U(i ) (X )
q(X ) (2)
Xn 1 Xn 1
X i U( X ) q( X ) X n 1 U
(i )
(
X
) (3)
resto
12 Códigos cíclicos 1
Solución.
U(3) ( X ) X 3 X 2 1
g( X ) g0 g1 X g2 X g r X r (4)
donde g0 y gr tienen que ser igual a 1. Cada palabra de código polinomial o vector de
código se forma haciendo U(X) = m(X)g(X), donde U(X) es un polinomio de grado n-1 o
menor. Por lo tanto, el polinomio de mensaje, m(X), se escribe:
m( X ) m0 m1 X m2 X 2 mn r 1 X n r 1 (5)
nr k
o bien
r nk
Por lo tanto, g(X), como se muestra en la ecuación (4), debe ser de grado n – k. Es
decir, el grado de g(X) es igual al número de bits de redundancia que tiene el código. Cada
palabra de código polinomial en el código cíclico (n, k) puede ser expresado como
U( X ) m0 m1 X m2 X mk 1 X k 1 g( X ) (6)
U es un vector de código válido del subespacio S, si y sólo si, g(X) divide a U(X) sin
resto.
X n 1 g( X )h( X ) (7)
Por ejemplo:
X7 1 1 X X3 1 X X2 X4
2 12 Códigos cíclicos
Usando g(X) = 1 + X + X3 como generador polinomial de grado n – k = 3, podemos
generar un código cíclico (n, k) = (7, 4). O, por ejemplo, usando g(X) = 1 + X + X2 + X4,
donde n – k = 4 podemos generar un código cíclico (7, 3). Resumiendo, si g(X) es un
polinomio de grado n – k y es un factor de Xn + 1, entonces g(X) únicamente genera un código
cíclico (n, k).
Recordemos que los códigos sistemáticos son aquellos en los que la parte del mensaje
aparece explícitamente dentro de la palabra de código o vector de código. Veamos cómo se
podría formar un código sistemático utilizando un polinomio generador. Con un formato
polinomial, el vector de mensaje puede expresarse como:
m( X ) m0 m1 X m2 X 2 mk 1 X k 1 (8)
X n k m( X ) m0 X n k m1 X n k 1 mk 1 X n 1 (9)
X n k m( X ) Q( X )g( X ) r( X ) (10)
siendo
r( X ) r0 r1 X r2 X 2 rn k 1 X n k 1
r( X ) X n k m( X ) Q( X )g( X ) U( X ) (11)
r( X ) X n k m( X ) r0 r1 X rn k 1 X n k 1 m0 X n k m1 X n k 1 mk 1 X n 1
U r0 , r1 , , rn k 1 , m0 , m1 , , mk 1 (12)
(n k ) bits de k bits de
paridad mensaje
12 Códigos cíclicos 3
Ejemplo 2. Usando el generador polinomial g(X) = 1+X+X3 generar una palabra de
código sistemática perteneciente a un código (7, 4), para el mensaje m = 1 0 1 1.
Solución.
m( X ) 1 X 2 X 3
n = 7; k = 4; n – k = 3
X n k m( X ) X 3 1 X 2 X 3 X 3 X 5 X 6
X3 X5 X6 1 X X2 X3 1 X X3 1
cociente generador resto
Q( X ) g( X ) r( X )
U( X ) r( X ) X 3m( X ) 1 X 3 X 5 X 6
U 100
1011
bits de bits de
paridad mensaje
4 12 Códigos cíclicos
mismo por el coeficiente asociado a él. Si el coeficiente es gi = 1 entonces el multiplicador es
simplemente una conexión directa, mientras que si gi = 0 entonces el multiplicador es un
circuito abierto. Estos multiplicadores representan a los coeficientes del polinomio
generador. También se incorporan dos llaves (switch 1 y switch 2). El vector de código (en
este caso indicado por V(X)) se va formando a la salida del circuito. La operación del
codificador se puede resumir así:
2. Los k bits de mensaje van ingresando, de a uno, ante cada ciclo de reloj, a los
registros de desplazamiento. Simultáneamente, van apareciendo en forma directa a la salida.
Esto último pone de manifiesto la naturaleza sistemática del código.
5. Los bits de paridad que quedaron almacenados en los registros comienzan a salir,
terminando después de (n – k) desplazamientos o ciclos de reloj externo.
Solución.
12 Códigos cíclicos 5
Entrada de Número de Contenido de Salida
mensaje desplazamientos los registros
1011 0 000 -
101 1 110 1
10 2 101 1
1 3 100 0
- 4 100 1
- 5 010 0
- 6 001 0
- 7 000 1
donde e(X) es el patrón de error polinomial y tiene el mismo significado que el patrón
de error visto en los códigos con representación matricial. Si Z(X) es un código válido entonces
es divisible por g(X). Por lo tanto, lo que hace el decodificador es efectuar esta división y
verificar que el resto sea cero. Si no es cero, entonces Z(X) no es un código válido. Una vez
más, como en el caso matricial, lo que hace el detector es calcular lo que llamamos síndrome.
Es decir, llamamos síndrome S(X) al resto obtenido de la división de Z(X) por g(X), esto es,
Si se compara la (16) con la (15) se ve que ambas tienen el mismo resto S(X) (con
diferentes cocientes). Es decir que para obtener el síndrome se puede hacer Z(X) dividido g(X)
o e(X) dividido g(X) ya que se obtiene el mismo resto en ambos casos. Una vez obtenido el
síndrome se trabaja de manera similar al caso matricial. Es decir, como cada patrón de error
está asociado a un síndrome diferente, una vez calculado éste se puede determinar e(X).
Luego, se resta e(X) de Z(X) (es decir, se suma en módulo 2) para calcular (estimar) el valor
de U(X).
6 12 Códigos cíclicos
U(X ) Q(X )g(X ) (17)
Una vez más, para saber si hubo un error o no, el receptor divide Z(X) de la (18) por
g(X) y obtiene un cociente que indicaremos como c(X) y un resto que seguiremos llamando
S(X), con lo cual podemos escribir:
Por lo tanto, si e(X) = 0 resulta S(X) = 0 ya que no hubo error y el vector recibido es
igual al vector transmitido, por eso no hay resto (síndrome) en la división entre Z(X) y g(X).
Siendo así, en la (20) se ve que c(X) + Q(X) = 0, lo que significa c(X) = Q(X). Como el
síndrome obtenido por la (19) y la (20) es el mismo, otra vez se puede hacer una asociación
entre este síndrome y el patrón de error e(X) que generó el error, por lo que para obtener el
U(X) estimado basta con hacer Z(X) + e(X).
12 Códigos cíclicos 7
Figura 3. Ejemplo de cálculo de síndrome con (n - k) registros de
desplazamiento.
Códigos de Hamming
Los códigos de Hamming son códigos de bloque sencillos caracterizados por la siguiente
estructura (n, k):
(n, k ) 2 m 1, 2 m 1 m (21)
(n, k ) 2 m 1, n m (22)
donde m es un entero mayor o igual que 2. Estos códigos se caracterizan por tener
distancia mínima 3 y consecuentemente pueden corregir patrones de error simples o bien
detectar todas las combinaciones de 2 o menos errores. Otra característica distintiva de estos
códigos es que son perfectos (es decir, corrigen todos los patrones de un error y ni uno más).
g( X ) 1 X X 3 (23)
g( X ) 1 X 2 X 3 (24)
Ambos polinomios son factores del término (X7 + 1), en conformidad con lo que
establece la (7).
1 0 1 0 1 0 1
H 0 1 1 0 0 1 1 (25)
0 0 0 1 1 1 1
Como se ve, las columnas de H en la (25) son números binarios que van desde 1 hasta
7. Luego, la matriz G puede obtenerse a partir de esta matriz, de modo tal que se cumpla
GHT = 0. El orden de las columnas en H no es relevante, por lo tanto existen muchas matrices
H y consecuentemente muchas matrices G generadoras de un cierto código de Hamming (n,
k). En particular, en la (25) se ve que la matriz identidad I de orden n – k no aparece dentro
de H, por lo que el código de Hamming en este caso no será sistemático. Reordenando las
8 12 Códigos cíclicos
columnas de otra manera se puede obtener una matriz H correspondiente a un código
sistemático, por ejemplo:
1 0 0 1 1 0 1
H 0 1 0 1 0 1 1 (26)
0 0 1 0 1 1 1
1 1 0 1 0 0 0
1 0 1 0 1 0 0
G (27)
0 1 1 0 0 1 0
1 1 1 0 0 0 1
Dado que existen dos polinomios generadores g(X) para este código de Hamming (7, 4)
pero existen muchas matrices generadoras G, esto significa que no todas las matrices G
generarán un código cíclico, sino solamente dos de ellas. Cualquiera que sea la matriz
generadora G dentro de todos los casos posibles, el código de Hamming siempre tendrá
dmin = 3 y será perfecto, pero no en todos los casos será cíclico. Una de las matrices G que
genera un código cíclico es:
1 1 0 1 0 0 0
0 1 1 0 1 0 0
G (28)
1 1 1 0 0 1 0
1 0 1 0 0 0 1
En la Figura 4 se ven varias curvas que muestran cómo varía la probabilidad de error de
bit PB según diferentes códigos de corrección de errores, en función de la probabilidad de
transición de canal p. La probabilidad de transición de canal p es la probabilidad de error de bit
que tiene el sistema sin el uso del código de corrección de error. Depende el ruido presente en
el canal y de la energía de bit Eb de la señal eléctrica que representa al símbolo 1 o al símbolo
0 transmitido. A mayor ruido, mayor p. A mayor energía de bit, menor p.
12 Códigos cíclicos 9
resultado es lógico si, como dijimos antes, a medida que se hace más complejo el código el
valor de t sigue siendo siempre 1.
Para encontrar dónde está la mejora introducida en los códigos de Hamming tenemos
que afinar el análisis. Y el punto está en el hecho de que en la práctica, al introducir un código
corrector de errores, la probabilidad de error de transición de canal p varía (aumenta). Por
ejemplo, pensemos en un código (7, 4). Agregar los 3 bits de paridad que requiere este código
significa que ahora se deben transmitir 7 bits en el mismo tiempo que antes —sin el código—
se transmitían 4 bits. Esto significa que el tiempo de bit de las señales eléctricas que se
transmiten por el canal se reduce en un factor de 1,75, reduciéndose entonces la energía de
bit Eb en igual factor y aumentando p.
Es decir que estamos teniendo dos efectos. Un efecto favorable, dado por el código
corrector de errores en sí, y otro efecto desfavorable acontecido por el hecho de que nos
vemos obligados a reducir el tiempo de bit y en consecuencia reducir la energía de bit, lo que
provoca un aumento de p. Sin embargo, tiene más preponderancia el efecto favorable del
código corrector que el efecto desfavorable de la disminución de Eb, por lo que el resultado
final es una mejora en la probabilidad de error de bit PB en comparación con el sistema original
sin código corrector.
Si pensamos ahora en el código (15, 11), vemos que al agregar los 4 bits de
redundancia estamos reduciendo el tiempo de bit en un factor de 1,36. Comparándolo con el
(7, 4) vemos que si bien no es tan efectivo (no olvidar la Figura 4), no produce tanta
disminución en la energía de bit como lo hace el (7, 4) y por lo tanto reduce en menor medida
a p. El resultado final de estos dos efectos es que el código (15, 11) termina siendo más
10 12 Códigos cíclicos
efectivo que el (7, 4), según se puede ver en la Figura 5. En esta figura se grafica PB en
función de Eb/N0, siendo N0 la densidad espectral de potencia de ruido (una medida del ruido
presente en el canal).
Los códigos de Hamming son unos de los primeros que se han diseñado, en 1950, y
llevan el nombre de su inventor. Si bien son códigos sencillos no son muy potentes.
Observando la Figura 5 se puede ver que para PB = 10-6 la ganancia de código que produce (7,
4) es del orden de 0,5 dB, y aproximadamente 1 dB para el caso de (15, 11).
Código Golay
El código Golay (23, 12), es un código cíclico que es capaz de corregir combinaciones
de tres o menos errores dentro de un bloque de 23 bits. Este código tiene una distancia
mínima de 7 y además es un código perfecto, ya que satisface la condición límite de Hamming
12 Códigos cíclicos 11
con el signo de igualdad. De hecho, el código Golay es el único código cíclico perfecto capaz
de corregir tres errores. Este código puede representarse por el siguiente polinomio
generador:
g( X ) 1 X 2 X 4 X 5 X 6 X 10 X 11 (29)
g( X ) 1 X X 5 X 6 X 7 X 9 X 11 (30)
Una variante de este código es el Código Golay Extendido (24, 12) el cual se obtiene
agregando un bit de paridad al Golay (23, 12). La distancia mínima es 8 y por lo tanto el
código puede corregir algunos casos de 4 errores aunque no todos. El desempeño de este
código se puede ver en la Figura 5, donde se observa que tiene una ganancia de código
bastante mayor que un código de Hamming.
Esta es otra clase de código cíclico, con una gran variedad de longitudes de bloque,
tasas de código y capacidad de corrección de errores. Los códigos BCH más comunes tienen
una longitud de bloque n = 2m – 1, donde m es un entero igual o mayor que 3. Los polinomios
generadores de los códigos BCH suelen venir tabulados según los valores de n, k, y t. Tales
polinomios se expresan en formato octal y al ser convertidos a binario el dígito de más a la
derecha representa el coeficiente de grado cero del polinomio. Por ejemplo, para n = 7, k = 4
y t = 1 el polinomio g(X) se representa como 13 en octal. Pasado a binario es 1011, por lo
tanto el polinomio generador es g(X) = 1+X+X3. Nótese que este polinomio es igual a uno de
los polinomios generadores del código de Hamming (7, 4). Esto es así porque los códigos de
Hamming son códigos BCH.
Una vez más, el desempeño de estos códigos puede verse en la Figura 5, para dos
casos: (127, 36) y (127, 64). El primero corrige 15 errores y el segundo 10. Para PB = 10-6 el
primero tiene una ganancia de código de aproximadamente 2,5 dB, mientras que el segundo
unos 3,5 dB aproximadamente. Mucho más potentes que los códigos de Hamming.
12 12 Códigos cíclicos