Sei sulla pagina 1di 12

Cdigo convolucional

Ivn Daro Hastamorir* Juan Diego Melenje* Richard Andersson Rodrguez* Ivn Daro Ladino**
ivanovich04@gmail.com gothicman_504@hotmail.com randersson86@gmail.com ivan.ladino@hotmail.com

**

Ingenieros Electrnicos de la Fundacin Universitaria Los Libertadores. Ingeniero Electrnico de la Pontificia Universidad Javeriana.

AGOSTO20103 ISSN1909-9142

coningenio
Resumen

Ivn Daro Hastamorir Juan Diego Melenje Richard Andersson Rodrguez Ivn Daro Ladino

Cdigo Convolucional

pp. 168-179

En este artculo se explica el proceso de diseo de un codificador y decodificador Convolucional. Se explican los pasos del diseo y su funcionamiento. Con el cdigo implementado en MATLAB se pretende proveer de una herramienta didctica al laboratorio de la Universidad de Los Libertadores, de tal forma que los estudiantes de los cursos de comunicaciones puedan entender el funcionamiento de los esquemas de codificacin de canal. En el proceso de decodificacin Convolucional, se suele utilizar el Algoritmo de Viterbi, el cul de cierta forma es complejo y genera confusin cuando se estudia por primera vez. Por lo tanto, durante el estudio y la realizacin de este proyecto se propone una nueva forma ms sencilla y de igual forma eficaz, para realizar el proceso de la decodificacin.

Palabras Clave: Codificacin de canal, Algoritmo de Viterbi, Diagrama de Trellis, Cdigo detector y corrector de error.

Convolutional Codes
Abstract
This article explains in detail the Convolutional design process encoder and decoder. It explains every step of the design and operation. With the code implemented in MATLAB is to provide an educational tool to the lab at the University of Los Libertadores, so that students in communications courses to understand the operation of channel coding schemes. In Convolutional decoding process is usually used the Viterbi algorithm, which in some ways is complex and confusing when studying for the first time. Therefore, during the study and implementation of this project proposes a new simpler and equally effective to perform the decoding process.

Key Words: Coding Channel, Viterbi algorithm, Trellis diagram, Detector code and corrector code.

169
AGOSTO20103 ISSN 1909-9142

Ivn Daro Hastamorir Juan Diego Melenje Richard Andersson Rodrguez Ivn Daro Ladino

Cdigo Convolucional

pp. 168-179

coningenio

INTRODUCCION
En bsqueda de responder a la necesidad de una herramienta til y de la que no se dispone en la institucin, surgi el proyecto de disear e implementar un prototipo de codificacin decodificacin convolucional, para los estudiantes de ingeniera electrnica. Dicho proyecto hace parte del trabajo de grado para optar por el ttulo de Ingeniero Electrnico. Para el diseo del prototipo, el primer paso consisti en realizar un estudio detallado de probabilidad y teora de la informacin, debido a que ello determina la base matemtica fundamental para abordar el rea de las telecomunicaciones. Una vez realizado este estudio se procedi a disear el codificador, apropiando los siguientes temas: Cdigos con memoria, Diagramas y rboles de Trellis.

Para el diseo del decodificador se abordaron los conceptos correspondientes a: Algoritmo de Viterbi, Diagrama de Trellis y distancia Hamming. El prototipo se dise e implement sobre la suite de Matlab MATLAB y fsicamente en un dispositivo lgico programable FPGA.

MARCO TERICO
Los canales de comunicaciones no son ideales, por el contrario su funcionamiento est determinado por varios factores que ocasionan que los datos generados por el transmisor lleguen con errores al receptor, en otras palabras las tramas recibidas en el receptor pueden diferir en uno o varios bits. Entre los factores que ocasionan los errores, los ms determinantes corresponden a: el ruido, la distorsin y la interferencia; siendo el primero (el ruido) el objeto primordial del trabajo con los codificadores de canal. Los cdigos convolucionales son adecuados para usar sobre canales con mucho ruido (alta probabilidad de error); adems son cdigos lineales, donde la suma de dos palabras de cdigo

170
AGOSTO20103 ISSN1909-9142

coningenio

Ivn Daro Hastamorir Juan Diego Melenje Richard Andersson Rodrguez Ivn Daro Ladino

Cdigo Convolucional

pp. 168-179

cualesquiera tambin es una palabra de cdigo. Y al contrario que con los cdigos lineales, se prefieren los cdigos no sistemticos, es decir en los que el dato no aparece de forma explcita en la codificacin. El sistema tiene memoria: la codificacin actual depende de los datos que se enven en el presente y los que se enviaron en el pasado. Un cdigo convolucional se especifica por medio de tres parmetros (n,k,m): n es el nmero de bits de la palabra codificada k es el nmero de bits de la palabra de datos. m es la memoria del cdigo o longitud restringida.

cional aade una estructura a la secuencia de bits. Incluso aunque la entrada sea totalmente aleatoria, se fuerza a que la salida siga unas determinadas secuencias. Esta restriccin es la que da la capacidad correctora a los cdigos convolucionales.

La codificacin se puede entender a travs de un ejemplo como el mostrado en la figura (1), en la cual tenemos un codificador (2,1,3). El proceso de codificacin consiste bsicamente en una serie de operaciones XOR entre el dato presente y los datos previamente recibidos, como el codificador

Figura 1. Tomado de http://www.isa.cie.uva.es/proyectos/ codec/marco4.html. Figura 2. rbol de Trellis.

Un codificador convolucional puede ser visto tpicamente como un conjunto de filtros digitales (sistemas lineales e invariantes en el tiempo). El proceso de decodificacin consiste en buscar un camino en el diagrama de Trellis (o en el rbol del cdigo) que d la secuencia de bits ms probable (si no hay errores se obtiene la secuencia exacta). El codificador convoluFigura 3. Diagrama de Trellis.

171
AGOSTO20103 ISSN 1909-9142

Ivn Daro Hastamorir Juan Diego Melenje Richard Andersson Rodrguez Ivn Daro Ladino

Cdigo Convolucional

pp. 168-179

coningenio

El procedimiento de decodificacin es equivalente a comparar la secuencia recibida con todas las posibles secuencias que pueden obtenerse con el correspondiente codificador y seleccionando la secuencia que est ms prxima a la secuencia recibida.

Desplazamiento de los datos e ir haciendo la funcin XOR entre las funciones de transferencia y el dato desplazado.

Generar la tabla o rbol de Trellis, dependiendo de la longitud de m.

Se han desarrollado complejos algoritmos para la decodificacin convolucional, uno de los ms usados es el algoritmo de Viterbi El fundamento de este algoritmo est en que no se almacenan todas las secuencias a las que da lugar el codificador. Se basa en el principio de optimalidad: el mejor camino (menor distancia de Hamming) a travs del diagrama de Trellis que pasa por un determinado nodo, necesariamente incluye el mejor camino desde el principio del diagrama de Trellis hasta este nodo.

Se van guardando los datos codificados generados (c1,c2) en una matriz. Se van combinando los valores de c1 y c2, de tal manera que queden parejas de c1 y c2 respectivamente en un vector, y ese vector va a ser el dato codificado.

Dato_codificado=[ c10c20 c11c21 c12c22 c13c23 .. c1nc2n]

Ejemplo
Se va a realizar un ejemplo para la codificacin convolucional de 3 bits con la caracterstica (2,1,3); dnde el 2 indica la cantidad de salidas, 1 es el nmero de bits que ingresan a las memorias para llevar a cabo la codificacin y 3 son la cantidad de registros o memorias. El dato que se desea codificar es 101. Recuerde que inicialmente las memorias estn en ceros. Se invierte el dato. Se definen las funciones de transferencia que son dos para este caso: FT1=[101], FT2=[110].

DESARROLLO DEL PROYECTO


Diseo del codificador convolucional
En el proceso de diseo del codificador convolucional, se utilizaron las siguientes etapas: Entrada del dato a codificar (Es el ingreso del dato que se desea transmitir). Entrada de las funciones de transferencia (Es un vector o polinomio que define la codificacin del dato). Entrada de los valores de m (donde m es el nmero de memorias). Generar el apuntador (es el conjunto de nmeros con el cual se genera la tabla o rbol de Trellis).

El orden de las memorias es el siguiente:

172
AGOSTO20103 ISSN1909-9142

coningenio

Ivn Daro Hastamorir Juan Diego Melenje Richard Andersson Rodrguez Ivn Daro Ladino

Cdigo Convolucional

pp. 168-179

Se introduce el primer bit del dato a las memorias. Convol1.m codiconvol.m decoconvol.m

A la salida nos da 11 debido a que se realiza una operacin XOR entre el dato que hay en las memorias y las funciones de transferencia.

Programa principal del cdigo de canal convolucional:


%Programa para la deteccin y correcin de errores por medio del cdigo de canal Convolucional clear all; close all; clc; x=input(Digite el dato de entrada: \n); y=input(Digite m (nmero de registros): \n); f1=input(Digite la funcin de transferencia #1: \n); f2=input(Digite la funcin de transferencia #2: \n); disp(-----------------------------Codificador-----------------------------------------------);

Ahora se ingresa el segundo bit.

Nuevamente se realiza la XOR con los datos de las memorias y las funciones de transferencia, lo cual nos da 01 y la salida anterior (11) es desplazada.

Se introduce el ltimo bit a la memoria:

Se realiza el mismo procedimiento anteriormente explicado. Una vez finalizado este procedimiento, se obtiene el dato codificado [11 01 01].

A continuacin se encuentra el cdigo del codificador convolucional, que realizamos para ser implementado en MATLAB, si se desea se puede comprobar el resultado anterior corriendo este programa. Es de anotar, para que funcione el cdigo de canal en MATLAB, es necesario tener los siguientes programas copiados en la carpeta de MATLAB:

173
AGOSTO20103 ISSN 1909-9142

Ivn Daro Hastamorir Juan Diego Melenje Richard Andersson Rodrguez Ivn Daro Ladino

Cdigo Convolucional

pp. 168-179

coningenio

[Tabla_codificador,Dato_codificado]=codiconvol(x,y,f1,f2) pause disp(----------------------------Decodificad or----------------------------------------------); dc=input(Digite el dato codificado: \n); [Tabla_decodificador,Dato]=decoconvol(dc,y,f1,f2) %///////////////Cantidad de errores detectados//////////////// %----------------Nmero de errores detectados-----------------------------disp(-----------------Nmero de errores detectados------------------------); errodet=xor(Dato_codificado,dc); Errores_detectados=sum(errodet) %--------------Mensaje sobre la deteccin y correccin de error------------disp(--------------Mensaje sobre la deteccin y correccin de error-------------); if x==Dato disp(El cdigo fue capaz de detectar y corregir los errores provocados en la transmisin); else disp(El cdigo fue capaz de detectar lo errores, pero no fue capaz de corregirlos); end

Cdigo del codificador convolucional function [Tabla_codificador,Dato_codificado]=codiconvol(d,m,ft1,ft2); %Programa para un codificador convolucional (2,1,m) de n bits de %entrada %d es el dato de entrada %m es el nmero de memorias %ft1 es la funcin de transferencia #1 %ft2 es la funcin de transferencia #2 global Dato_codificado; mm=2^m; dd=zeros(1,m); cont=-1; ld=length(d); ft11=ft1(end:-1:1); ft22=ft2(end:-1:1); for i=1:mm

174
AGOSTO20103 ISSN1909-9142

coningenio

Ivn Daro Hastamorir Juan Diego Melenje Richard Andersson Rodrguez Ivn Daro Ladino

Cdigo Convolucional

pp. 168-179

tablar_1(k,2*j)=kk(:,1) | tt(k,2*j); cont=cont+1; yy(i,:)=dec2binvec(cont,m); yy1(i,:)=fliplr(yy(i,:)); end end Apuntador=yy1; [m1,n1]=size(Apuntador); ed=zeros(m1,n1); Tabla_codificador=or(tabla_1,tabla_2); Apuntad=[ed Apuntador]; %--Reutilizacin de la tabla---[m2,n2]=size(Apuntad); datot=[dd d]; tt=zeros(m2,n2); d1=zeros(m2,1); for l=1:ld %//////////Codificador////////// tyu=datot(1+l:m+l); %-------Genera la tabla--------c1_1=and(tyu,ft11); for j=1:m for k=1:mm fda(:,:)=Apuntad(:,1+j:m+j); c11(k,:)=and(fda(k,:),ft11); c22(k,:)=and(fda(k,:),ft22); y11=c1_10/2; c110(k,:)=sum(c11(k,:)); c220(k,:)=sum(c22(k,:)); r11=floor(y11); r22=floor(y22); y1(k,:)=c110(k,:)/2; y2(k,:)=c220(k,:)/2; r1(k,:)=floor(y1(k,:)); r2(k,:)=floor(y2(k,:)); ct1(:,:)=c110(k,:)-(2*r1(k,:)); ct2(:,:)=c220(k,:)-(2*r2(k,:)); kk=[ct1 ct2]; end %--Codificacin--kk1=[ct11;ct22]; kk1w=kk1(:); Dato_codificado=kk1w; ct11(l)=c1_10-(2*r11); ct22(l)=c2_20-(2*r22); y22=c2_20/2; c1_10=sum(c1_1); c2_20=sum(c2_2); c2_2=and(tyu,ft22); end tabla_11(:,1:n2-1)=tablar_1(:,2:n2); tabla_1=[tabla_11 d1]; tabla_2(k,2*j)=kk(1,2) | tt(k,2*j);

175
AGOSTO20103 ISSN 1909-9142

Ivn Daro Hastamorir Juan Diego Melenje Richard Andersson Rodrguez Ivn Daro Ladino

Cdigo Convolucional

pp. 168-179

coningenio

Diseo de decodificador convolucional


En el proceso de diseo del decodificador convolucional, se utilizaron las siguientes etapas:

Guardar aquella posicin donde se encuentre la menor distancia Hamming, porque la posicin va a ser el dato decodificado.

Salida del dato decodificado (dato original).

Ejemplo:
Entrada del dato codificado. Entrada de las funciones de transferencia (Es un vector o polinomio que me define la codificacin y decodificacin del dato). Entradas de los valores de m (donde m es el nmero de memorias). Generar el apuntador (Es el conjunto de nmeros con el cual se genera la tabla o rbol de Trellis). Desplazamiento de los datos e ir haciendo la funcin Xor entre las funciones de transferencia y el dato desplazado. Generar la tabla o rbol de Trellis, dependiendo de la longitud del dato codificado. Realizar la distancia Hamming entre el dato codificado y cada una de las posiciones de la tabla. Generar una columna con todas las distancia Hamming. Escoger el menor valor de la distancia Hamming en la columna y mirar en qu posicin se encuentra. Teniendo las mismas caractersticas del codificador. Para la decodificacin es necesaria la tabla o rbol de Trellis, para este tipo de decodificador la tabla es la siguiente: Dato codificado [11 01 01] Dato a decodificar [10 01 01] Se va a realizar el proceso de decodificacin del dato codificado en el ejemplo anterior, claro est que se va a cambiar un bit en el dato codificado, para simular que se produjo un error en la transmisin.

000000 000011 001101 001110 110110 110101 111011 111000


Ahora se toma el dato a decodificar, y hallamos la distancia Hamming con cada una de las posiciones de la tabla, y escogemos la menor distancia.

176
AGOSTO20103 ISSN1909-9142

coningenio

Ivn Daro Hastamorir Juan Diego Melenje Richard Andersson Rodrguez Ivn Daro Ladino

Cdigo Convolucional

pp. 168-179

Dichas distancias Hamming dan lo siguiente:

for i=1:mm cont=cont+1; yy(i,:)=dec2binvec(cont,ld1); yy1(i,:)=fliplr(yy(i,:)); end Apuntador=yy1; [m1,n1]=size(Apuntador); ed=zeros(m1,n1); Apuntad=[ed Apuntador]; [m2,n2]=size(Apuntad);

3 3 2 4 3 1 4 4
Se tiene en cuenta es la menor distancia Hamming, y se determina la posicin que es el dato decodificado. Menor distancia Hamming: 1 Posicin: 5. Dato decodificado: 101

tt=zeros(m2,n2); d1=zeros(m2,1); %/////////Decodificador///////// %-------Genera la tabla---------

Cdigo del decodificador convolucional


function [Tabla_decodificador,Dato]=decoconvol(dc,m,ft1,ft2)

for j=1:ld1 %Programa para un decodificador convolucional de n bits. %dc es el dato codificado %m es el nmero de memorias %ft1 es la funcin de transferencia #1 %ft2 es la Funcin de transferencia #2 c110(k,:)=sum(c11(k,:)); global Dato; ld=length(dc); ld1=ld/2; ld2=ld1-m; dd=zeros(1,ld2); ft111=[ft1 dd]; ft222=[ft2 dd]; ct1(:,:)=c110(k,:)-(2*r1(k,:)); ft11=ft111(end:-1:1); ft22=ft222(end:-1:1); mm=2^ld1; cont=-1; tablar_1(k,2*j)=kk(:,1) | tt(k,2*j); ct2(:,:)=c220(k,:)-(2*r2(k,:)); kk=[ct1 ct2]; r1(k,:)=floor(y1(k,:)); r2(k,:)=floor(y2(k,:)); c220(k,:)=sum(c22(k,:)); y1(k,:)=c110(k,:)/2; y2(k,:)=c220(k,:)/2; for k=1:mm fda(:,:)=Apuntad(:,1+j:ld1+j); c11(k,:)=and(fda(k,:),ft11); c22(k,:)=and(fda(k,:),ft22);

177
AGOSTO20103 ISSN 1909-9142

Ivn Daro Hastamorir Juan Diego Melenje Richard Andersson Rodrguez Ivn Daro Ladino

Cdigo Convolucional

pp. 168-179

coningenio

tabla_2(k,2*j)=kk(1,2) | tt(k,2*j);

pp(ii,:)=sum(gg(ii,:)); end

end end tabla_11(:,1:n2-1)=tablar_1(:,2:n2); Tabla_decodificador=or(tabla_1,tabla_2) %----Bsqueda en la tabla con distancia Hamming------------for ii=1:m2 gg(ii,:)=xor(dc(1,:),Tabla_ decodificador(ii,:)); [yu,sd]=min(pp); Dato=de2bi(sd-1,ld1,left-msb)

178
AGOSTO20103 ISSN1909-9142

coningenio
CONCLUSIONES
Este cdigo convolucional solo detecta errores cuando ellos estn en posiciones no inmediatas. La cantidad de errores que llega a detectar y corregir este cdigo depende inmediatamente de la cantidad de memorias menos 1 (m-1), as un cdigo que tenga 4 memorias llega a detectar y corregir hasta 3 errores. En este cdigo no fue necesario utilizar el algoritmo de Viterbi, debido a que nosotros diseamos una forma ms sencilla para que se facilite el entendimiento por parte de los estudiantes. Hay varias opciones para la codificacin de datos, pero la que recomendamos para un mejor entendimiento por parte de los estudiantes es el rbol de Trellis. La dificultad ms relevante que se tuvo en la realizacin de este cdigo, es que si llegan a suceder un nmero igual o mayor al nmero de memorias, detecta los errores mas no los puede corregir.

REFERENCIAS
1. TODD K. Moon. Error correction coding Mathematical Methods and Algorithms. Wiley, 2005. 2. LATHI B.P. Modern Digital and Analog communications systems (3 Ed). Oxford University Press, 1998. 3. PROAKIS, John G. Digital Communications (4 Ed). McGraw-Hill. 2000. 4. MACKAY, David J.C. Information Theory, inference and learning algorithms. Cambridge University Press. 2003. 5. www.isa.cie.uva.es/proyectos/codec/marco4.html 6. www.mathworks.com 7. www.xilinx.com 8. www.altera.com

179
AGOSTO20103 ISSN 1909-9142

Potrebbero piacerti anche