Está en la página 1de 12

DEPARTAMENTO DE CIENCIA Y TECNOLOGÍA

UNIVERSIDAD NACIONAL DE QUILMES


Roque Sáenz Peña 352 – (B1876BXD) Bernal – Buenos Aires – Argentina

TEORÍA DE LAS TELECOMUNICACIONES - IACI

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.

Estructura algebraica de los códigos cíclicos

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

o, multiplicando ambos miembros por Xn + 1,

 
X i U( X )  q( X ) X n  1  U

(i )
 (
X
) (3)
resto

donde q(X) es el cociente obtenido en la división.

Ejemplo 1. Desplazamiento cíclico de un vector de código.

Sea U = 1 1 0 1, para n = 4. Expresar este vector de código en forma polinomial, y


usando la ecuación (3) calcular el vector de código con desplazamiento 3.

12 Códigos cíclicos 1
Solución.

U( X )  1  X  X 3 (El polinomio se escribe empezando por la potencia más baja).

X i U( X )  X 3  X 4  X 6 , donde i vale 3 para este ejemplo.

Se divide X3U(X) por X4 + 1 y se calcula el resto usando división polinomial. En este


ejemplo el resto da:

U(3) ( X )  X 3  X 2  1

Escribiendo el resto de manera inversa, resulta que el vector de código U(3) = 1 0 1 1


es consecuencia de un desplazamiento cíclico de tres posiciones del vector U = 1 1 0 1.
Recordar que en la operación con códigos binarios la suma se realiza en módulo 2.

Propiedades de los códigos cíclicos

Podemos generar un código cíclico usando un polinomio generador, de manera similar a


como lo hacíamos con los códigos de bloque, en donde usábamos una matriz generadora. El
generador polinomial g(X) para un código cíclico (n, k) tiene la forma:

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)

Hay un total de 2n-r palabras de código polinomiales y un total de 2 k vectores de código


en un código (n, k). Como debe haber un polinomio por cada vector de código entonces

nr k

o bien

r nk

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.

Un generador polinomial g(X) de un código cíclico (n, k) es un factor de Xn + 1, esto es:

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).

Codificación en forma sistemática

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)

Si imaginamos que el codeword o palabra de código se forma en un registro de n


elementos o etapas, en donde el contenido de cada registro es 1 o 0, para formar un código
sistemático podríamos pensar en ubicar el mensaje m(X) en la parte extrema derecha del
registro, es decir en las k etapas que están más a la derecha del registro. Mientras que los bits
de paridad los podemos poner en las n – k etapas de más a la izquierda del registro. Siendo
así, podemos manipular algebraicamente el mensaje polinomial de manera de provocar un
desplazamiento de n – k lugares hacia la derecha hasta llevarlo al extremo derecho del
registro. Es decir, manipularlo de tal manera que quede un polinomio de grado n – 1 (para que
entre por completo en el registro de n elementos). Esto se puede hacer multiplicando m(X) por
Xn-k, con lo que se obtiene:

X n  k m( X )  m0 X n  k  m1 X n  k  1    mk  1 X n  1 (9)

Si dividimos la (9) por g(X) el resultado puede escribirse como:

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

Sumando r(X) en ambos miembros de la (10), usando aritmética de módulo 2,


obtenemos:

r( X )  X n  k m( X )  Q( X )g( X )  U( X ) (11)

El miembro izquierdo de la (11) es una palabra de código polinomial válida, ya que es


un polinomio de grado n – 1 o menor y cuando es dividido por g(X) el resto es cero. O,
viéndolo de otro modo, la (11) es una palabra de código válida puesto que es un múltiplo de
g(X), según la (6). Esta palabra de código puede ser expandida de la siguiente manera:

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

Observando el polinomio anterior se puede apreciar que la palabra de código


comprende la parte de mensaje y la parte de bits de paridad:

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

Dividiendo este último polinomio por g(X), obtenemos,

 
X3  X5  X6  1  X  X2  X3 1  X  X3  1
    
cociente generador resto
Q( X ) g( X ) r( X )

Usando la ecuación (11) se obtiene

U( X )  r( X )  X 3m( X )  1  X 3  X 5  X 6

U  100
 1011

bits de bits de
paridad mensaje

Formación de códigos cíclicos sistemáticos usando registros de desplazamiento

Los códigos cíclicos sistemáticos pueden generarse mediante un sistema de registros de


desplazamiento, conectados adecuadamente entre sí mediante sumadores en módulo 2, como
se muestra en la Figura 1.

Figura 1. Codificación cíclica sistemática mediante el uso de (n - k)


registros de desplazamiento.

En la Figura 1 se muestra un sistema formado por (n – k) registros de desplazamiento.


Estos registros se pueden implementar mediante flip-flops. Mediante un reloj externo, que no
se muestra en la Figura, se controlan todos los flip-flops. Inicialmente todos los registros están
con el estado “0”. Durante, por ejemplo, cada flanco de subida del reloj, el contenido de los
registros se desplaza hacia la derecha, en la dirección de las flechas que se muestran en la
Figura 1. Además de registros, el codificador que estamos viendo incluye sumadores que
realizan la suma en módulo 2 de las dos entradas que tiene cada uno de ellos. Finalmente, el
tercer elemento que tiene este circuito son los multiplicadores, que multiplican la entrada del

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í:

1. Inicialmente, la llave 1 está cerrada y la llave 2 se encuentra en la posición baja.

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.

3. Luego de k ciclos de reloj los registros de desplazamiento contienen a los bits de


paridad, formados en virtud de las multiplicaciones y las sumas correspondientes.

4. Se abre la llave 1 y la llave 2 pasa a la posición de arriba.

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.

Ejemplo 3. Repetir el Ejemplo 2 utilizando un codificador con registros de


desplazamiento.

Solución.

En la Figura 2 se muestra el circuito correspondiente al polinomio generador


g(X) = 1+X+X3. Recordemos que el mensaje es m(X) = 1+X2+X3.

Figura 2. Codificador sistemático para el Ejemplo 3.

Como el código es (7, 4), es decir (n – k) = 3, hay 3 registros de desplazamiento.


Además, el coeficiente g1 que corresponde a X1 vale 1, por lo tanto queda representado por
una conexión directa. Como g2 vale cero entonces no existe conexión para ese coeficiente o
multiplicador. Finalmente, como el polinomio generador es de grado 3, el máximo coeficiente
multiplicador posible en el circuito es n – k – 1 = 2. Como éste vale cero entonces no se pone
y finalmente queda un solo multiplicador. Las etapas de progreso del circuito se pueden
resumir en la tabla siguiente:

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

Hasta el cuarto desplazamiento la salida es directamente los k bits de mensaje.


Después del cuarto desplazamiento la llave 1 se abre y la llave 2 pasa a la posición de arriba,
lo que hace que los bits de paridad que se han formado durante el transcurso de los primeros
cuatro desplazamientos comiencen a salir y se agreguen a continuación de los bits de datos.
Se verifica entonces que la salida es U = 1001011, coincidiendo con el resultado del
Ejemplo 2.

Detección o corrección del error con registros de desplazamiento

Si el vector de código transmitido es afectado por el ruido entonces el vector recibido es


una versión alterada de tal vector transmitido. Llamemos U(X) al polinomio que representa al
vector de código transmitido y Z(X) al polinomio que representa al vector recibido. Ya que
U(X) es un código válido, tiene que ser múltiplo del polinomio generador g(X):

U(X )  m(X )g(X ) (13)

Z(X) puede escribirse como:

Z(X )  U(X )  e(X ) (14)

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,

Z(X )  q(X )g(X )  S(X ) (15)

donde q(X) es el cociente de la división y S(X) es un polinomio de grado n – k – 1 o


menor. Combinando las ecuaciones (13), (14) y (15) obtenemos:

e(X )  m(X )  q(X )g(X )  S(X ) (16)

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).

El desarrollo que acabamos de hacer es válido para el caso de código no sistemático. Si


U(X) es un código sistemático entonces, como dice la (11), es generado como producto entre
un cierto polinomio Q(X) y el polinomio generador g(X):

6 12 Códigos cíclicos
U(X )  Q(X )g(X ) (17)

Teniendo en cuenta esto último, el vector recibido va a ser:

Z(X )  Q(X )g(X )  e(X ) (18)

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:

Z(X )  c(X )g(X )  S(X ) (19)

Si Z(X) no tiene errores entonces S(X) es cero.

Igualando la (18) con la (19) y despejando e(X) obtenemos la siguiente expresión:

e(X )  c(X )  Q(X )g(X )  S(X ) (20)

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).

El cálculo del síndrome también puede implementarse mediante un sistema con


registros de desplazamiento, similar al usado en la generación de la palabra de código. En la
Figura 3 de la página siguiente se muestra tal circuito, utilizado para calcular el síndrome de la
palabra de código generada en el Ejemplo 3.

Los multiplicadores se conectan igual que en el codificador, lo mismo que los


sumadores. La única diferencia está en agregar un sumador a la entrada del primer registro,
que suma el vector recibido con la salida del último registro. Inicialmente la llave 1 está
cerrada y la llave 2 está abierta. Esto permite el ingreso de la palabra de código a los registros
de desplazamiento, luego de las operaciones matemáticas correspondientes. Después de n
ciclos de reloj, es decir, después de haber pasado toda la palabra de código, en los registros
queda almacenado el síndrome. Entonces ahora se abre la llave 1 y se cierra la llave 2,
permitiendo la salida del síndrome. En la tabla siguiente se resumen los pasos de operación del
circuito de la Figura 3:

Entrada del Número de Contenido de


codeword desplazamientos los registros
1001011 0 000
100101 1 100
10010 2 110
1001 3 011
100 4 011
10 5 111
1 6 101
- 7 000

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)

o también puede escribirse como:


(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).

Por ejemplo, si m = 3 obtenemos el código de Hamming (7, 4) en donde cada palabra


de mensaje tiene 4 bits y la palabra de código 7 bits. Para este código (7, 4) existen dos
polinomios generadores g(X) posibles:

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).

Los códigos de Hamming también pueden representarse en forma matricial mediante su


matriz generadora G de dimensión k x n. La particularidad que presentan los códigos de
Hamming es que la matriz H puede obtenerse ubicando en sus columnas todos los números,
en formato binario, desde 1 hasta n. Una vez obtenida H se puede obtener G. Por ejemplo,
para un código de Hamming (7, 4) una posible matriz H es:

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

En la (26) las tres primeras columnas corresponden a la matriz identidad de orden 3 y


las cuatro columnas restantes corresponden a la matriz PT. La matriz G que se obtiene es:

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

Capacidad de corrección de los códigos de Hamming

A medida que aumenta el valor de m, vamos obteniendo diferentes códigos de


Hamming, por ejemplo (7, 4), (15, 11), (31, 26), (63, 58), etc. Uno podría pensar que a
medida que aumenta la complejidad del código, éste corrige más errores. Sin embargo, el
código siempre tiene distancia mínima 3, independientemente del valor de m, por lo que
siempre corrige sólo 1 error. Para un código (7, 4) estará corrigiendo 1 error dentro de un
bloque de 7, mientras que para un (15, 11) estará corrigiendo 1 error dentro de un bloque de
15. Digamos que para el primer caso el código puede corregir en promedio dos bits de cada 14
transmitidos, mientras que en el segundo caso puede corregir 1 de cada 15 transmitidos. O
sea que, a igual probabilidad de transición del canal p, el código (7, 4) es mejor que el (15,
11). Y a medida que m aumenta el código parece ser menos eficiente.

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.

La energía de bit es proporcional al nivel de tensión eléctrica de la señal y al tiempo de


duración del bit, por lo que las señales que están más atenuadas y las que tienen menor
tiempo de bit tienden a producir un aumento de p.

Observando la Figura 4 vemos que, para una probabilidad de transición de canal p


constante, la probabilidad de error de bit PB de un código de Hamming (7, 4) es menor que
para uno (15, 11) o uno (31, 26). Es decir, según las curvas de la Figura 4, cuanto mayor es m
en el código de Hamming menor es la mejora de PB, para un valor de p constante. Este

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.

Figura 4. Probabilidad de error de bit en función de la


probabilidad de transición de canal para varios códigos
de corrección de errores.

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).

Figura 5. PB en función de Eb/N0 para una señalización bipolar


sobre un canal con ruido blanco Gaussiano, para varios
códigos correctores de errores.

La curva de más a la derecha en la Figura 5 corresponde a la probabilidad de error de


bit de un sistema con señalización bipolar sin usar código corrector de error. Las demás curvas
corresponden a este mismo sistema pero usando diferentes códigos correctores de error.
Nótese que ahora sí se ve el resultado deseado en los códigos de Hamming: un (31, 26) es
mejor que un (15, 11) y éste último es mejor que un (7, 4). Significa que para trabajar con
una cierta PB requerida, se necesita menos energía de bit en (15, 11) que en (7, 4), por
ejemplo.

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)

o alternativamente por este otro:

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.

Códigos BCH (Bose – Chadhuri – Hocquenghem)

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

También podría gustarte