Código sistemático

From glossaLAB

[gL.edu] Este artículo recoge contribuciones de Daniel Gracia Garallar, elaboradas en el contexto de la Clarificación conceptual en torno a la "teoría de la información", bajo la supervisión de José María Díaz Nafría.

En el contexto de teoría de la información, se denomina código sistemático al código de bloque que mantiene los símbolos de entrada inalterados y, además, añade información de paridad ya sea al principio o al final, con el objeto de detectar y corregir errores.

Propiedades

Suponiendo el código de bloque lineal , definido en el subespacio vectorial de dimensión y matriz generadora [1]

con vectores linealmente independientes, aplicando reducción por filas (método de Gauss-Jordan) y reordenando las columnas, siempre podemos encontrar una matriz (donde es no singular y es una matriz de permutación) tal que:

La matriz , distinguida por la submatriz identidad y la submatriz o de paridad, se denomina matriz sistemática, y el código caracterizado por esta, es un código sistemático. Obsérvese que de acuerdo a esta definición las palabras o bloques de código contiene al principio los mensajes a los que sigue un conjunto de valores de paridad de dimensión .

Las matrices y no definen, necesariamente, la misma función de codificación, pero sí el mismo espacio vectorial. Entonces, modelando la fuente de mensajes como una variable aleatoria independiente e idénticamente distribuida, la distribución de probabilidad del nuevo código será igual a la de la distribución original. Se dice así que las matrices generadoras y son equivalentes ya que los códigos que resultan de su aplicación mantienen idénticas propiedades estadísticas relativas —en cuanto a la frecuencia de aparición de cada código—, aunque sean diferentes en su composición simbólica.

Todo código lineal tiene un código lineal sistemático equivalente[2]. Por ende, cualquier código lineal con matriz generadora puede ser expresado como un código sistemático .

Paridad al principio del bloque

Si bien lo indicado supone que el código contiene al principio los datos (o mensajes) y a éstos les sigue la paridad, es evidente se puede extender al caso en el que la paridad se coloca al principio y los datos al final. En dicho caso:

Aplicación

Los códigos sistemáticos resultan muy convenientes en su aplicación práctica, ya que el mensaje (o datos) queda directamente accesible en la palabra del código –ya sea al principio o al final–, bien diferenciados de la información redundante (ver código anejo).

Cabe mencionarse entre los códigos de boque de uso frecuente las versiones sistemáticas de los códigos Hamming, códigos BCH, y códigos Reed-Solomon.

Código

A continuación, se presenta un ejemplo de código de MATLAB que permite obtener una matriz generadora sistemática a partir de una matriz generadora lineal . Además, calcula la tabla de códigos asociados a ambas matrices en un cuerpo de Galois i. e., código binario—, habida la convención de referir al término neutro como (el código no debe utilizarse para cuerpos finitos de cardinal ).

% Definimos una matriz generadora G arbitraria de vectores linealmente 
% independientes, que puede cambiarse por cualquier otra.
G = [1 0 1 0;
     0 1 1 0;
     1 0 1 1];

% Determinamos las dimensiones de la matriz generadora
[filas, columnas] = size(G);

% Reducimos G por Gauss-Jordan
[R, pivotes] = rref(G);

% Generamos un vector con las posiciones ordinales del subespacio.
% Tomamos las posiciones de columnas pivote en el orden calculado y
% anejamos las columnas que no se hayan pivotado.
vect_cols = linspace(1, columnas, columnas);
cols_ordenadas = [pivotes setdiff(vect_cols, pivotes)];

% Ordenamos la forma reducida según el orden de los pivotes, anejando
% las columnas sin pivote.
G_prima = R(:, cols_ordenadas);

% Podemos codificar los mensajes codificados por las matrices generadoras
% multiplicando ambos. P. ej., podemos tomar el código correspondiente
% al mensaje [0 1 1] como:
u = [0 1 1];
x = u*G_prima;

% Nótese que, para obtener un resultado coherente, debemos considerar
% el espacio GF(2) en el que definimos la operación. En nuestro caso
% concreto, suponiendo lógica binaria, debemos ajustar los resultados 
% obtenidos en función de los posibles desbordamientos por suma.
x = mod(x,2);

% Y mostramos el resultado.
disp(["Mensaje: " num2str(u) "Codificación" num2str(x)]);

% Genera la tabla de símbolos de G y G_prima
msg = dec2bin(linspace(0, 2^filas-1, 2^filas)) - '0';
cod_orig = mod(msg*G, 2);
cod_sist = mod(msg*G_prima, 2);
Mensaje = char(msg + '0');
CodigoOriginal = char(cod_orig + '0');
CodigoSistematico = char(cod_sist + '0');
tabla_cod = table(Mensaje, CodigoOriginal, CodigoSistematico);
disp(tabla_cod);

El código anterior genera la salida:

     "Mensaje: "    "0  1  1"    "Codificación"    "0  1  1  1"
 
     Mensaje    CodigoOriginal    CodigoSistematico
     _______    ______________    _________________
 
       000           0000               0000       
       001           1011               0010       
       010           0110               0101       
       011           1101               0111       
       100           1010               1001       
       101           0001               1011       
       110           1100               1100       
       111           0111               1110

Referencias

  1. Codificación de bloque, glossaLAB
  2. López-García, C.; Fernández-Veiga, M. (2013). Teoría de la información y codificación. Santiago de Compostela: Andavira.