Codificación de canal
[gL.edu] Este artículo recoge contribuciones de Mario José Ruiz Asenjo, elaboradas en el contexto de la Clarificación conceptual en torno a los Sistemas de transmisión, bajo la supervisión de J.M. Díaz Nafría.
Observaciones del docente: Este artículo requiere las mejoras indicadas a continuación:
|
Definiciones
La codificación de canal es un proceso esencial en la comunicación de datos, diseñado para compensar los efectos negativos que introduce el canal en la transmisión de la señal, como pueden ser el ruido, las interferencias o el desvanecimiento. El principal objetivo es mitigar el efecto de los errores que introduce el canal en las comunicaciones, permitiendo detectar, incluso corregir dichos errores en la recepción.
En la codificación de canal se trabaja en dos líneas diferenciadas:
- En primer lugar, se trabaja con la transformación del conjunto de señales originales por otras formas de onda con mejores respuestas a los efectos del canal y que disminuyan la probabilidad de error. Ejemplos de códigos de este tipo son los códigos ortogonales y biortogonales.
- Por otro lado, la correcta estructuración de la secuencia de datos a transmitir, en la cual se introduce información redundante que permite en la recepción la detección y corrección de errores introducidos por el canal. Dentro de esta parte de codificación de canal podemos diferenciar diferentes grupos de códigos como son los: Códigos de bloque, codificación convolucional y algunos más modernos como los turbo códigos.
Cada uno de estos códigos tiene diferentes características que los hacen aptos para la detección o corrección de errores con diferentes rendimientos. Hay que tener en cuenta que el uso de códigos de canal tendrá como inconveniente un uso menos eficiente del ancho de banda. [1]
Detección y Corrección de Errores:[editar | editar código]
- Detección de Errores y retransmisión: En esta técnica se añade a la información útil un conjunto de bits redundantes (bits de paridad), que permiten identificar en el receptor si se ha producido algún error, pero el receptor no puede corregirlo, sin embargo, se informa al emisor para la retransmisión de la información. Esta forma de control de errores se denomina corrección de errores hacia atrás o BER( del inglés Backward Error Correction). Uno de los algoritmos más comunes utilizados para detección de errores en el CRC (Control de Redundancia Cíclico), son códigos basados en las propiedades matemáticas de los polinomios, y por eso se llaman códigos polinómicos.
- Corrección de Errores: Los códigos de canal que permiten la corrección de errores en la recepción se denominan FEC (del inglés Forward Error Correction) o corrección de errores hacia adelante. Estos códigos requieren de una mayor cantidad de información redundante y, por tanto, su uso queda restringido a medios en los que hay un alto número de errores o en sistemas donde la retransmisión no es viable, como canales simplex, transmisiones broadcast o multicast o sistemas en tiempo real. Uno de los códigos más utilizados para la corrección de errores es la distancia de haming, que nos indica la diferencia de bits que hay entre dos palabras de entrada. [2]
Categorías Específicas de Códigos de Canal:
Códigos Convolucionales: Estos códigos utilizan registros de desplazamiento y operaciones de combinación para codificar la información. Son eficaces para corregir errores en secuencias de bits.
Códigos Cíclicos: Los códigos cíclicos son una clase especial de códigos lineales que poseen propiedades cíclicas. Son eficientes en términos de implementación y utilizados en diversas aplicaciones de comunicación.
Códigos Polinómicos: Algunos códigos, como los códigos Reed-Solomon, se basan en polinomios para realizar operaciones algebraicas sobre los datos.
Códigos de Bloque y Otros Enfoques:
Códigos de Bloque: Engloba códigos como los códigos Hamming y los códigos Reed-Solomon, que operan en bloques fijos de datos y son utilizados para detectar y corregir errores.
Códigos Concatenados: Combina diferentes tipos de códigos para aprovechar sus fortalezas individuales, logrando una mayor eficiencia en términos de corrección y detección de errores.[3]
Código
El comando que permite en Matlab codificar con Reed Solomon es code = rsenc(msg,n,k)
, donde n es el número de símbolos del bloque de salida, k el de entrada y msg representa el mensaje a codificar, que ha de estar conformado como un array de k columnas conteniendo elementos de un campo de Galois (Galois field array).
La salida code también se obtendrá en formato similar, pero conteniendo n columnas. Para generar los arrays con los mensajes, se utiliza el comando x_gf = gf(x,m)
, donde m es el número de bits por símbolo, x es una matriz conteniendo el mensaje con los símbolos en formato decimal, y la salida x_gf
es un array de elementos de GF(2m).
Así, para codificar en Matlab dicho mensaje con el código RS(7,3):
k =3; % longitud de los bloques de entrada , en símbolos
m =3; % número de bits por símbolo
n =2^m -1; % longitud de los bloques codificados , en símbolos
% El mensaje se definen sobre un GF (2^m)
% La matriz se conforma con k columnas
% Cada elemento puede tomar valores entre 0 y 2^m -1
msg = gf ([5 2 3; 0 1 7; 3 6 1] ,m);
% mensaje codificado:
codedMsg = rsenc (msg ,n,k)
Para representar un código de bloque lineal como una aplicación inyectiva de un espacio de menor dimensión en uno de mayor mediante una operación matricial en MATLAB, podemos utilizar matrices para definir la codificación y decodificación. Para un código de bloque lineal, consideremos una matriz G que describe la transformación de un espacio de información de dimensión k a un espacio de código de dimensión n. La codificación se realiza multiplicando el vector de información m de dimensión k por esta matriz G para obtener el vector de código c de dimensión n.
% Definición de la matriz de codificación G (ejemplo)
G = [1 0 1; 1 1 1];
% Vector de información (ejemplo)
m = [1; 0]; % Vector de información de dimensión k
% Codificación: c = m * G
c = m' * G;
disp('Vector de información:');
disp(m);
disp('Matriz de codificación G:');
disp(G);
disp('Vector de código:');
disp(c);
Para los códigos convolucionales, la implementación generalmente involucra registros de desplazamiento y operaciones de combinación.[4]
% Definición de los polinomios generadores del codificador convolucional (ejemplo)
generatorPolynomials = [5 7; 4 5];
% Secuencia de información de entrada (ejemplo)
inputSequence = [1 0 1 1 0];
% Codificación convolucional
trellis = poly2trellis(3, generatorPolynomials); % Definición de la estructura de trellis
codedSequence = convenc(inputSequence, trellis); % Codificación convolucional
disp('Secuencia de información de entrada:');
disp(inputSequence);
disp('Secuencia codificada (convolucional):');
disp(codedSequence);