Está en la página 1de 21

Capı́tulo 7

Códigos Lineales

Hemos visto en el tema anterior que, cuando el alfabeto A es un grupo


aditivo, puede definirse de manera natural la operación suma + en An de tal
suerte que (An , +) resulta ser un grupo. A sus subgrupos se les denomina
códigos de grupo y resultan tener buenas propiedades en relación con el
cálculo de la distancia mı́nima y con la corrección de errores. Ahora vamos a
ver que estas propiedades mejoran si A es un cuerpo finito, en cuyo caso, An
es un espacio vectorial sobre el cuerpo A y los códigos que consideraremos
serán sus subespacios vectoriales.

7.1. Concepto de código lineal. Matriz Genera-


dora
Sea A un cuerpo finito de q elementos. Si definimos en An las operaciones

(x1 , ..., xn ) + (y1 , ..., yn ) = (x1 + y1 , .., xn + yn )

α(x1 , .., xn ) = (αx1 , .., αxn )


se obtiene un espacio vectorial de dimensión n sobre el cuerpo A. Un código
C ⊂ An se llama lineal si C es un subespacio vectorial de An . Si la dimensión

117
CAPÍTULO 7. CÓDIGOS LINEALES 118

de C es k, se dirá que C es un (n, k)-código lineal o, si se quiere especificar


la distancia mı́nima d, un (n, k, d)-código. El número de elementos de un
(n, k)-código es q k . En efecto, basta recordar que, dada una base {v1 , .., vk }
de C, cada palabra-código x de C puede expresarse en la forma

x = α1 v1 + ... + αk vk

con αi ∈ A. Los escalares α1 , .., αk son las coordenadas de x en la base


escogida. Sabemos que las coordenadas están unı́vocamente determinadas
por x, una vez escogida la base. Por tanto, el número de palabras-código en
0
C viene dado por Vq,k = q k (= variaciones con repetición de q elementos
tomados de k en k), mientras que An tiene q n elementos.
Hemos visto en el tema anterior que los códigos de grupo presentan las
dos ventajas siguientes respecto de los códigos sin estructura : 1) una forma
más simple de determinar la distancia mı́nima y 2) un método de corrección
más eficiente por medio de la búsqueda de la palabra de peso mı́nimo en la
clase lateral del mensaje recibido. Obviamente, los códigos lineales también
disfrutan de las ventajas anteriores. Otra ventaja de los códigos lineales es
la posibilidad de quedar especificados dando k palabras-código linealmente
independientes. Una matriz k × n, formada por k filas que son palabras-
código linealmente independientes, se dirá que es una matriz generadora para
el código C.
Recordamos que el alfabeto binario no es otra cosa que Z2 (clases de
restos módulo 2). Ya hemos usado su estructura de grupo para la suma. Con
el producto dado por la tabla siguiente, Z2 es un cuerpo commutativo.

· 0 1
0 0 0
1 0 1

Ejemplos 7.1.1. (a) (11111) es la matriz generadora del código binario


de repetición de longitud 5.
CAPÍTULO 7. CÓDIGOS LINEALES 119

(b) El código binario


C = {000, 011, 101, 110}
tiene por matriz generadora
à !
0 1 1
G=
1 0 1

En este caso n = 3, k = 2 y Card(C) = 2k = 4.

Más adelante, veremos que para estos códigos existen métodos de correc-
ción más adecuados que el de Slepian.

7.2. Codificación
Sea C un código (k, n)-lineal (sobre el alfabeto A) con matriz generado-
ra G. C contiene q k palabras-código (q es el número de sı́mbolos de A));
por tanto, puede ser usado para codificar q k sı́mbolos fuente diferentes ( los
sı́mbolos en cuestión se identifican con las palabras de Ak ).
Se codifica la cadena u = u1 , , , , uk poniendo
k
X
uG = ui Fi ∈ C.
i=1

Por ejemplo, supongamos que se desea codificar una imagen de k bits


con un código corrector lineal C(k, n). Los valores posibles de los pixels se
codifican en binario con cadenas, (u1 , .., uk ), de k ceros o unos, mientras que
las cadenas codificadas tienen la forma (x1 , ..., xn ) = (u1 , .., uk ) · G.
La función de codificación está dada por

u ∈ Ak → uG ∈ C ⊂ An .

La regla de codificación es más simple cuando la matriz generadora está en la


forma estándar (Ik |B), donde B = (bij ) es una matriz k × (n − k). El mensaje
u = u1 ...uk se codifica como:

x = uG = x1 x2 ...xk xk+1 ..xn


CAPÍTULO 7. CÓDIGOS LINEALES 120

donde:
xi = ui , si i ≤ k
son los dı́gitos de la cadena fuente y
k
X
xk+i = bji uj 1 ≤ i ≤ n − k
j=1

son los dı́gitos de control (redundantes). Es decir, xk+1 , ..xn es la información


redundante que se añade a la cadena fuente para conseguir que quede pro-
tegida contra los errores. Obviamente, para que la decodificación no sea un
problema, se suele escoger una matriz generadora en forma estándar.
Se corrige por el procedimiento considerado para los códigos de grupo.
Para códigos grandes este método es demasiado lento y costoso en términos
de almacenamiento. Para obtener un método que mejora estos dos aspectos,
necesitamos el concepto de código dual.

7.3. El código dual


Usaremos el producto escalar u·v de dos palabras u = u1 ...un y v = v1 ...vn
de An que se define por

u · v = u1 v1 + u2 v2 + ... + un vn ∈ A
Propiedades obvias son las siguientes:

1. u · v = v · u

2. (λu + µv) · w = λ(u · v) + µ(v · w)

u y v se llaman ortogonales si u · v = 0.
Dado un (n, k)-código lineal C, se define el código dual por

C ⊥ = {v ∈ An : v · u = 0(∀u ∈ C)}.
CAPÍTULO 7. CÓDIGOS LINEALES 121

Si G es una matriz generadora del código C, entonces


v ∈ C ⊥ ⇐⇒ v es ortogonal a cada fila de G.
Es decir:
v ∈ C ⊥ ⇐⇒ vGt = 0.
Basta tener en cuenta que v es ortogonal a un subespacio si y sólo si es
ortogonal a los elementos de una base.

Teorema 7.3.1. C ⊥ es un código lineal (n, n − k).

DEMOSTRACIÓN:
Es muy fácil probar que C ⊥ es un subespacio vectorial. Por tanto, C ⊥ es
un código lineal. Ahora veamos que su dimensión es n − k. Si G = (gij )k×n
es una matriz generadora para C, entonces
n
X

v ∈ C ⇐⇒ vj gij = 0 ∀i = 1, .., k.
j=1

Encontramos v1 , .., vn resolviendo un sistema homogéneo de k ecuaciones con


n incógnitas v1 , .., vn . Es conocido del álgebra que la solución es un subespacio
vectorial de dimensión n − k (el rango de G es k).
Cuando la matriz G está en la forma estándar, es fácil la prueba. Si
G = (Ik |B), siendo A = (bij ) una matriz k × (n − k), el sistema tiene la
forma:
n−k
X
vi + bij vk+j = 0 (i = 1, .., k).
j=1

Por tanto
n−k
X
vi = − bij vk+j .
j=1

Luego vk+1 , .., vn son arbitrarios y v1 , .., vk están determinados unı́vocamente


por los anteriores. ¤
CAPÍTULO 7. CÓDIGOS LINEALES 122

Teorema 7.3.2. Si C es un código lineal, entonces C ⊥⊥ = C.

DEMOSTRACIÓN:
Es obvio que C ⊂ C ⊥⊥ . Pero dim(C) = k y dim(C ⊥ )⊥ = n − (n − k) = k.
Por tanto, C = C ⊥⊥ . ¤

7.4. Matriz de control

Definición 7.4.1. Sea C(n, k) un código lineal. Una matriz generadora H


para C ⊥ se dirá que es una matriz de control (o de verificación de paridad)
para C. Entonces H es una matriz (n − k) × n que satisface

HGt = 0 (⇐⇒ vi Gt = 0, i = 1, ..., n − k).

donde las vi son las filas de H.

El siguiente Teorema muestra que la matriz de control determina com-


pletamente el código C.

Teorema 7.4.2. Si H es una matriz de control para el código lineal C,


entonces:
C = {x ∈ An : Hxt = 0}

DEMOSTRACIÓN:
Como C = (C ⊥ )⊥ , resulta que las palabras-código de C deben ser las
x ∈ An tales que xH t = 0, pues H es la matriz generadora de C ⊥ . Equiva-
lentemente, Hxt = 0. ¤

Ejemplo 7.4.3. Sea H la matriz


CAPÍTULO 7. CÓDIGOS LINEALES 123

à !
1 1 0 0
0 0 1 1
Entonces (x1 , x2 , x3 , x4 ) ∈ C si y sólo si
 
à ! x1
1 1 0 0  x2 
 
  = 0.
0 0 1 1  x3 
x4

La igualdad anterior conduce a las ecuaciones


)
x1 + x2 = 0
x3 + x4 = 0

que se llaman ecuaciones de control o de verificación de paridad.

Teorema 7.4.4. Si G = (Ik |B) es la matriz generadora en forma estándar


de un (n, k)-código lineal, entonces H = (−B t |In−k ) es una matriz de control
para C.

DEMOSTRACIÓN:
Tenemos que probar que cada fila de H es ortogonal a toda fila de G. La
fila i de H por la columna j de Gt da exactamente

0 + (−bij + bij ) + 0 = 0

Además, las filas de H son linealmente independientes por serlo las de G. ¤


Vamos a ver cómo puede determinarse la distancia mı́nima a partir de una
matriz de control.

Teorema 7.4.5 (Matriz de control y distancia mı́nima). La distancia mı́nima


d de un código lineal coincide con el mı́nimo número de columnas linealmente
dependientes que hay en la matriz de control.
CAPÍTULO 7. CÓDIGOS LINEALES 124

DEMOSTRACIÓN:
Si la distancia mı́nima es d, entonces existe x ∈ C de peso mı́nimo igual a
d. Pero x ∈ C ⇒ Hxt = 0. Entonces las columnas de H que se corresponden
con los lugares donde x no tiene un cero (d de ellos) deben ser linealmente
dependientes. Para ver esto, basta escribir la igualdad Hxt = 0 en términos
de las columnas, ci , de H

n
X d
X
xi c i = xij cij = 0
i=1 j=1

con xij 6= 0. Esto prueba que hay d columnas linealmente independientes. No


es difı́cil probar la vuelta. ¤

7.5. Corrección mediante sı́ndromes


Sea H una matriz de control para un (n, k)-código lineal C. Para cada
y ∈ An , se define el sı́ndrome de y por S(y) = yH t . Se trata de una fila
1 × (n − k). Veamos algunas propiedades que necesitaremos:

1. Si las filas de H son h1 , .., hn−k , entonces

S(y) = (y · h1 , ..., y · hn−k ).

2. S(y) = 0 ⇐⇒ y ∈ C ⊥⊥ = C (las filas de H son ortogonales a C).

3. Dos vectores u y v pertenecen a la misma clase adjunta si y sólo si


S(u) = S(v).

Veamos la prueba de (3):

u + C = v + C ⇐⇒ u − v ∈ C ⇐⇒ S(u − v) = 0

La última equivalencia se sigue de (2). Ahora basta recurrir a la definición


para obtener (u − v)H t = 0, es decir, uH t = vH t .
CAPÍTULO 7. CÓDIGOS LINEALES 125

Ahora vamos a explotar el hecho de que haya una correspondencia bi-


unı́voca entre las clases adjuntas y los sı́ndromes.
La corrección mediante sı́ndromes consiste en los siguientes pasos:
a) Se obtienen los lı́deres ei de cada clase adjunta
b) Se obtienen los sı́ndromes S(ei ).
c) Se mantienen en memoria dos columnas, una de lı́deres y la otra con
los sı́ndromes.
d) Si al enviar la palabra-código x ∈ C, se recibe el vector y, calculamos
su sı́ndrome S(y) = yH t y se localiza el lugar que ocupa en la columna con
los sı́ndromes.
e) Se localiza el lı́der e que ocupa el mismo lugar en la otra columna.
f) Se toma y − e como palabra correcta como.
La ventaja de este método radica en que sólo hay que mantener en memo-
ria dos columnas, en lugar de todo el espacio An .

Ejemplo 7.5.1. Consideremos el código lineal (binario) determinado por la


matriz de control
 
1 0 0 1 0 1 1
 
H= 0 1 0 1 1 1 0 
0 0 1 0 1 1 1
Supongamos que se transmite por el canal la palabra-código c = 1001011 y se
recibe y = 1001111. Para corregir por el procedimiento anterior, procedemos
CAPÍTULO 7. CÓDIGOS LINEALES 126

a calcular la tabla de sı́ndromes y lı́deres

Sı́ndrome Lı́der
000 0000000
100 1000000
010 0100000
001 0010000
110 0001000
011 0000100
111 0000010
101 0000001

Seguidamente, encontramos el sı́ndrome de la palabra recibida: s(y) =


(011). En la tabla vemos que se trata del sı́ndrome del lı́der 0000100. Entonces
adoptamos x = y − 0000100 = 1001011 como la palabra enviada.

7.6. Equivalencia de Códigos Lineales.


La definición usual de equivalencia de códigos lineales es diferente de la
dada para códigos generales. Sólo se permiten permutaciones de sı́mbolos en
una posición determinada que consistan en la multiplicación de los elementos
de dicha posición por un escalar dado.

Definición 7.6.1. Dos códigos lineales se llaman equivalentes si uno puede


obtenerse del otro por una combinación de operaciones del tipo:

(a) Permutación de posiciones,

(b) Multiplicación de todos los elementos que ocupan una posición dada por
un escalar no nulo.

Teorema 7.6.2. Dos matrices k × n generan códigos lineales equivalentes si


CAPÍTULO 7. CÓDIGOS LINEALES 127

una de ellas se obtiene de la otra por una sucesión finita de operaciones de


los tipos siguientes:

(F1) permutación de filas,

(F2) multiplicación de una fila por un escalar no nulo,

(F3) sumar a una fila un múltiplo escalar de otra,

(C1) permutación de columnas,

(C2) multiplicar una columna por un escalar no nulo,

DEMOSTRACIÓN:
Las tres operaciones (F1), (F2) y (F3) preservan la independencia lineal
de las filas de la matriz generadora de partida. Por tanto, sólo implican
reemplazar una base por otra del mismo código. Las operaciones (C1) y (C2)
convierten la matriz generadora en otra que genera un código equivalente. ¤

Teorema 7.6.3. Sea G la matriz generadora de un (n, k)-código lineal. Rea-


lizando operaciones del tipo anterior puede transformarse en una matriz de
la forma (Ik |B), siendo B una matriz k × (n − k).

DEMOSTRACIÓN: Durante las sucesivas transformaciones de la matriz


G, denotamos por gij los elementos de la matriz en consideración en ese
momento. F1 , ..., Fk y C1 , .., Cn son las filas y columnas, respectivamente.
Se desea que aparezca un 1 en el lugar (1,1). Si g11 6= 0, se multiplica la
−1
fila F1 por g11 . Si g11 = 0, se busca en el primer lugar de las otras filas un
gi1 6= 0. Si lo hay, se intercambian las filas F1 y Fi y la nueva fila 1 se multipli-
−1
ca por gi1 . Si no lo hay se busca en la primera fila un elemento g1j 6= 0. Si lo
hay se intercambian las columnas C1 y Cj . Si este es el caso, se multiplica la
−1
nueva fila 1 por g1j . Se procede de este modo hasta conseguir que en el lugar
−1
(1,1) figure un 1. Ahora se suma a cada fila posterior a la primera −F1 × g11 .
CAPÍTULO 7. CÓDIGOS LINEALES 128

De esta forma se consigue que la columna C1 sea como la primera columna


de la matriz unidad Ik . ¤

Nota 7.6.4. Cuando G0 puede obtenerse de G realizando sólo transforma-


ciones de filas, entonces G0 genera el mismo código. Sus filas son otra base
del mismo código lineal.

7.7. Construcción de nuevos códigos a partir


de otros
Hay muy diversas formas de obtener buenos códigos a partir de códigos
previamente construidos. En esta sección veremos algunas de estas formas.
1) Extensión de un código. Dado un código C(n, m, d), añadiendo un
sı́mbolo extra, cn+1 , a cada palabra-código, c1 c2 · · · cn , de modo que c1 + c2 +
· · · cn + cn+1 = 0, se obtiene un código de longitud n + 1. cn+1 recibe el
nombre de dı́gito de verificación de paridad y el nuevo código se dirá que es
una extensión de C. Se trata de un código lineal y sus ecuaciones de control
son las del inicial más la ecuación x1 + x2 + · · · + xn + xn+1 = 0.
2) Código reducido. Consideremos un código C(n, k) con una matriz gene-
radora en forma estándar: G = (Ik B). Sea t un número natural tal que t ≤ k
y denotemos por C ∗ el subconjunto de C formado por todas las palabras-
código que tienen sus primeras t componentes nulas. C ∗ es un código lineal
de dimensión k − t. Si eliminamos las t primeras componentes de las palabras
de C ∗ , resulta un código C 0 (n − t, k − t). Diremos que C 0 es una reducción
de C.
CAPÍTULO 7. CÓDIGOS LINEALES 129

Ejemplo 7.7.1. Sea C el código determinado por la matriz generadora


 
1 0 0 1 1 1
 
G = 0 1 0 1 1 0 .
0 0 1 0 1 1
Como la dimensión es tres, C consta de ocho palabras que pueden determi-
narse fácilmente

C = {000000, 010110, 001011, 100111, 111010, 110001, 011101, 101100}.

Si escogemos t = 1, resulta C ∗ = {000000, 010110, 001011, 01110} y el código


reducido serı́a C 0 = {00000, 10110, 01011, 1110}.

7.8. Intercalado
Se denomina de esta forma a una importante técnica que se usa para
aumentar la capacidad de un código para corregir errores a ráfagas (inter-
leaving, en lengua inglesa). Para facilitar la comprensión, vamos a desarrollar
las ideas considerando un ejemplo. Sea C(7, 4) el código lineal binario deter-
minado por la matriz generadora
 
1 0 0 0 1 1 1
0 1 0 0 1 1 0 
 
G= . (7.1)
0 0 1 0 0 1 1 
0 0 0 1 1 0 1

Según hemos visto, como G tiene la forma (I4 B), una matriz de control viene
dada por H = (B t I3 ); es decir, H es la matriz
 
1 1 0 1 1 0 0
 
1 1 1 0 0 1 0  .
1 0 1 1 0 0 1
Ahora, a la vista de H, es fácil comprobar que C es 1-corrector. En
efecto, basta notar que el número mı́nimo de columnas de H linealmente
CAPÍTULO 7. CÓDIGOS LINEALES 130

dependientes es tres. Sin embargo, nuestro código no podrı́a corregir un error


que consistiera en una ráfaga de longitud tres. Antes de ver cómo con un
intercalado de profundidad tres podemos conseguir que los mensajes queden
protegidos contra este tipo de errores, precisaremos el concepto de error a
ráfagas.
Puede ocurrir que un determinado canal de transmisión produzca errores
localizados en un corto intervalo de cada cadena de longitud n. Por ejemplo,
los errores producidos por irregularidades fı́sicas o estructurales en los medios
de grabación suelen estar concentrados espacialmente. De igual forma, las
interferencias que se producen en un corto periodo de tiempo en las señales
de radio causan errores que aparecen a ráfagas. Existen códigos especiales
para corregir este tipo de errores; por ejemplo, los códigos cı́clicos que serán
estudiados en el capı́tulo siguiente.

Definición 7.8.1. Una ráfaga cı́clica de longitud t en An es una cadena con


las siguientes propiedades:
1) contiene un trozo de longitud t cuyos primer y último elementos son
no nulos
2) todos los elementos que no pertenecen a dicho trozo son nulos.

Ejemplos 7.8.2. 1) (01010110000) es una ráfaga de longitud 6.


2) (010000100) es una ráfaga cı́clica de longitud 5.
Al transmitir una palabra-código c, si se recibe y = c + e, siendo e una
ráfaga cı́clica de longitud t, diremos que se ha producido un error a ráfagas.
Supongamos que deseamos transmitir las palabras-código c1 = 0011110, c2 =
0110101 y c3 = 1000111. En lugar de transmitir las tres cadenas una detrás
de otra, vamos a transformar la cadena de 21 dı́gitos de la forma siguiente.
En primer lugar, formamos con las tres cadenas una matriz de la forma
0 0 1 1 1 1 0
0 1 1 0 1 0 1.
1 0 0 0 1 1 1
CAPÍTULO 7. CÓDIGOS LINEALES 131

Seguidamente, se concatenan las columnas de esta matriz

0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1.

En definitiva, se han colocado en primer lugar las primera componentes de


c1 , c2 y c3 (en este orden), a continuación las segundas componentes y ası́
sucesivamente. Si hacemos esto con todas las ternas que pueden formarse
con cadenas de C, resulta un código C ∗ cuya longitud es 21. Diremos que
C ∗ se ha obtenido a partir de C con un intercalado de profundidad tres. No
resulta difı́cil probar que su dimensión es 12. Para obtener una base de C ∗ ,
podemos tomar una base de C y, por cada cadena c de dicha base, formar
tres palabras de longitud 21 que contienen los dı́gitos de c en los lugares: a)
1, 4, 7, 10, 13, 16, 19, b) 2, 5, 8, 11, 14, 17, 20 y c) 3, 6, 9, 12, 15, 18, 21. De este
modo obtenemos 12 vectores que forman una base de C ∗ . Ası́, si consideramos
la base formada por las filas de G, de su primera fila obtendrı́amos las tres
cadenas de longitud 21 siguientes (se ha dibujado un trazo debajo de las
componentes que se corresponden con las de la primera fila de G):

100000000000100100100

010000000000010010010
0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1.
Haciendo lo mismo con cada fila de G, obtendrı́amos 12 cadenas que
formarı́an una base de C ∗ . Recapitulando, hemos obtenido, intercalando de
tres en tres las palabras-código de C(7, 4), un código C ∗ (21, 12). Este código
tiene la propiedad de que corrige errores a ráfagas de longitud tres. En efecto,
un tal error en una palabra-código de C ∗ que transmitamos se traduce en
errores de peso uno en palabras-código de C y éstos pueden ser corregidos.
En general, dados un código C(n, k) y una profundidad p, intercalando
cada conjunto de p palabras de C, se obtiene un código C ∗ (n · p, k · p), capaz
de corregir errores a ráfagas de longitud p · c, donde c denota la capacidad
correctora de C.
CAPÍTULO 7. CÓDIGOS LINEALES 132

Intercalado cruzado. Se trata de una variación del intercalado que usa más
de un código. Esta técnica se emplea, entre otros, en el sistema desarrollado
conjuntamente por Sony y Philips en el compact disc.
De nuevo, vamos a desarrollar las ideas sobre un ejemplo. Ahora dispon-
dremos de dos códigos lineales (binarios). C1 es el código del ejemplo anterior
y denotamos la matriz generadora (7.1) por G1 . Consideramos un segundo
código C2 con matriz generadora
 
1 0 0 1 1 1
 
G2 = (I3 B) = 0 1 0 1 1 0 .
0 0 1 0 1 1

Una matriz de control para C2 tiene la forma H2 = (B t I3 ), por lo que


es fácil concluir que también es 1-corrector. Para intercalar C1 a la pro-
fundidad tres, escogemos una terna de palabras-código de C1 ; por ejemplo,
c1 = 1111111, c2 = 0111000 y c3 = 0100110. Las disponemos, como antes, en
forma de una matriz 3 × 7

1 1 1 1 1 1 1
0 1 1 1 0 0 0.
0 1 0 0 1 1 0

Pero ahora, en lugar de concatenar sus columnas, éstas se codifican con el


código C2 y las disponemos formando la matriz

1 0 0 1 1 1
1 1 1 0 1 0
1 1 0 0 0 1
1 1 0 0 0 1
1 0 1 1 0 0
1 0 1 1 0 0
1 0 0 1 1 1

Ahora se concatenan las columnas de esta matriz, escogiendo previamente


la profundidad. Por ejemplo, si escogemos profundidad 2, concatenarı́amos
CAPÍTULO 7. CÓDIGOS LINEALES 133

las columnas de cada par de filas consecutivas. Como hay 7 filas, la última
se intercaları́a con la primera de las producidas al considerar el siguiente
bloque de tres palabras-código de C1 . El resultado de la concatenación de las
6 primeras filas, de dos en dos, es la siguiente cadena

1 1 0 1 0 1 1 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 0 0.

En el sistema ideado por Sony y Philips para el compact disc se usa un


intercalado cruzado con dos códigos de Reed-Solomon: C1 = RS(28, 24) y
C2 = RS(32, 28).

7.9. Códigos lineales con Matlab


Para codificar y decodificar con un código lineal, Matlab posee las fun-
ciones encode y decode. Supongamos que deseamos codificar un mensaje
(msg = [1 1 1 0 1 0 1 1 0 1 1 0]) con un código lineal C(7, 4). Si la matriz

G = [1101000; 0110100; 1110010; 1010001]

es una matriz generadora para el código C, el programa


>> n=7;k=4;
genmat=G;
msg=[1 1 1 0 1 0 1 1 0 1 1 0]; % el mensaje consta de tres palabras
codmsg=encode(msg,n,k,’linear’,genmat)
produce como resultado una columna de 21 dı́gitos que es el mensaje
codificado:
codmsg=[0 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 0 0 1 1 0]’.
Supongamos que, al transmitir por cierto canal el mensaje codificado, se
producen algunos errores y se recibe recmsg=[0 1 1 1 1 1 0 1 0 0 1 0 0 1
1 0 0 0 1 1 1]. Es decir, se han producido tres errores de forma que son
incorrectos el tercero en el primer grupo de siete dı́gitos, el penúltimo en el
segundo grupo y el dı́gito final. El código que estamos considerando es un
código de Hamming que estudiaremos en el tema siguiente y se sabe que su
CAPÍTULO 7. CÓDIGOS LINEALES 134

capacidad correctora es igual a uno. Por tanto, pueden corregirse los errores
producidos. Si se quiere ahora decodificar el mensaje recmsg, se recurre a la
función decode cuya sintaxis es la siguiente
>> decomsg=decode(recmsg,n,k,’linear’,genmat)
y obtenemos el mensaje original msg.
Si se dispone de una matriz de control que llamaremos parmat, Matlab
también proporciona una matriz con los lı́deres (palabras de peso mı́nimo)
de las clases adjuntas:
>>trt=syndtable(parmat)
Las filas de la matriz trt son los lı́deres de las clases adjuntas, por tanto,
son los vectores que debemos sumar a la cadena recibida para corregirla.
Podemos obtener una matriz cuyas filas sean los sı́ndromes poniendo
>> sindrome=rem(trt*parmat’,2)

7.10. Ejercicios
1. Determinar el menor valor de n con la propiedad de que exista un código
lineal binario 1-corrector de longitud n y de forma que cada palabra-código
contenga 62 bits de información.

2. Se asignan cadenas de ceros y unos de longitud 4 como sigue

espacio → 0000 M → 1001


A → 0001 N → 1010
B → 0010 O → 0101
C → 0100 R → 0111
D → 1000 S → 1110
E → 0011 T → 1011
F → 0110 U → 1101
G → 1100 Y → 1111
CAPÍTULO 7. CÓDIGOS LINEALES 135

Las cadenas de longitud 4 se codifican usando la matriz generadora (alfa-


beto binario)
 
1 1 1 0 0 0 0
 1 0 0 1 1 0 0 
 
G= 
 0 1 0 1 0 1 0 
1 1 0 1 0 0 1
Suponiendo que se produce a lo más 1 error en la transmisión de una
cadena de longitud 7, decodificar el siguiente mensaje recibido:
1110001 1100011 1001100 0100111 0110000.

3. (a) Probar que las palabras de peso par en un código lineal binario forman
un subgrupo aditivo.
b) Probar que en un código lineal binario todas las palabras-código tienen
paso par o exactamente la mitad tienen peso par y la otra mitad peso
impar.

4. Probar que en un código lineal binario todas las palabras-código comienzan


por 0 o exactamente la mitad empieza con 0.

5. Consideremos la matriz de control de un código lineal binario C


 
1 0 0 0 1 0 1 1 1 1
 1 1 0 0 0 0 1 0 0 1 
 
 
 0 1 1 0 1 1 1 0 0 1 
1 1 0 1 0 1 1 0 1 0
a) Determinar los valores de n, k y d.
b) Encontrar una matriz generadora G para C.
c) Decodificar los siguientes mensajes: (i) 1110110000 y (ii) 0100110010.

6. Sea C el código anterior. Denotamos por C 0 el código formado por las


palabras-código que se obtienen añadiendo a la derecha de cada palabra-
código c ∈ C un dı́gito del modo siguiente: si el peso de c es impar el
dı́gito añadido es 1 y 0 si el peso es par.
CAPÍTULO 7. CÓDIGOS LINEALES 136

a) Determinar la distancia en el nuevo código.


b) Determinar una matriz de control para C 0 añadiendo a H una columna
y una fila apropiadas.

7. Sea C un código que tiene por matriz generadora


 
1 0 1 0 1 1
 1 1 0 1 0 1 
 
G= 
 1 1 1 1 0 1 
1 0 0 0 1 1

Encontrar una matriz de control para C y explicar si el código es realmente


útil.

8. Supongamos que la matriz de control de un código lineal binario C es


H = [I5 B], siendo B la matriz
 
1 0 0 0 0 1
 
 1 0 1 1 1 1 
 
B=  1 1 1 0 1 1 

 
 0 1 0 1 1 1 
0 1 1 1 0 1

a) Probar que todas las palabras-codigo de C tienen peso par.


b) Determinar la distancia d.
c) Si se recibe y = 01110001111, ¿qué puede concluirse?
d) Si suponemos que se produce a lo más un error en la transmisión de cada
cadena de 11 dı́gitos, decodificar la palabra recibida y = 11100101000.

7.11. Prácticas de Programación


1. Elaborar un programa para determinar el código a partir de una matriz
de control.
CAPÍTULO 7. CÓDIGOS LINEALES 137

2. Crear un archivo de función para determinar, dada una matriz de con-


trol, la distancia mı́nima de un código lineal binario.

3. Elaborar un programa para decodificar un código lineal por el método


de los sı́ndromes.

4. Elaborar un programa para codificar y decodificar con intercalado de


un código dado.

También podría gustarte