ANÁLISIS DE CÓDIGOS DE DETECCIÓN Y CORRECCIÓN DE ERRORES EN SISTEMAS DE COMUNICACIONES INALÁMBRICOS MICHAEL BALTAXE MILWER UNIVERSIDAD DE LOS ANDES FACULTAD DE INGENIERÍA DEPARTAMENTO DE INGENIERÍA ELÉCTRICA Y ELCTRÓNICA BOGOTÁ D. C. 2006
ANÁLISIS DE CÓDIGOS DE DETECCIÓN Y CORRECCIÓN DE ERRORES EN SISTEMAS DE COMUNICACIONES INALÁMBRICOS
MICHAEL BALTAXE MILWER
UNIVERSIDAD DE LOS ANDES FACULTAD DE INGENIERÍA
DEPARTAMENTO DE INGENIERÍA ELÉCTRICA Y ELCTRÓNICA BOGOTÁ D. C.
2006
2
ANÁLISIS DE CÓDIGOS DE DETECCIÓN Y CORRECCIÓN DE ERRORES EN SISTEMAS DE COMUNICACIONES INALÁMBRICOS
MICHAEL BALTAXE MILWER
Trabajo de grado para optar por el título de Ingeniero Electrónico
AsesorRAFAEL CAMERANO
UNIVERSIDAD DE LOS ANDES FACULTAD DE INGENIERÍA
DEPARTAMENTO DE INGENIERÍA ELÉCTRICA Y ELCTRÓNICA BOGOTÁ D. C.
2006
3
AGRADECIMIENTOS
Agradezco a Rafael Camerano, asesor de este proyecto, por su colaboración y
oportuna guía durante el desarrollo del mismo. Agradezco no solo su guía durante
este trabajo, sino también toda su enseñanza a lo largo de mis estudios de pregrado.
También quisiera aprovechar la oportunidad para agradecer a mis padres, mi
hermano y mis amigos por su continuo apoyo durante esta etapa.
4
TABLA DE CONTENIDOS
INTRODUCCIÓN…………………………………………………………………….5
1. CRC-8 para IEEE 802.16…………………………………………………………..7
1.1 Introducción……………………………………………………………….7
1.2 Codificador………………………………………………………………..8
1.3 Decodificador……………………………………………………………..9
1.4 Simulaciones……………………………………………………………..11
1.5 Ventajas, Desventajas y Aplicaciones…………………………………...14
2. Códigos Reed-Solomon…………………………………………………………...16
2.1 Introducción……………………………………………………………...16
2.2 Codificador……………………………………………………………....16
2.3 Decodificador…………………………………………………………….19
2.4 Criterios de Diseño………………………………………………………21
2.5 Simulaciones……………………………………………………………..21
2.6 Ventajas, Desventajas y Aplicaciones…………………………………...29
3. Turbo Códigos…………………………………………………………………….31
3.1 Introducción……………………………………………………………...31
3.2 Códigos Convolucionales………………………………………………..31
3.3 Codificador………………………………………………………………34
3.4 Decodificador……………………………………………………………35
3.5 Simulaciones……………………………………………………………..38
3.6 Ventajas, Desventajas y Aplicaciones…………………………………...46
CONCLUSIONES…………………………………………………………………...47
BIBLIOGRAFÍA…………………………………………………………………….50
5
INTRODUCCIÓN
La comunicación ha sido un elemento característico del ser humano a lo largo de su
evolución en la historia. Diversos sistemas de comunicación han existido hasta llegar
hoy en día a complejos sistemas digitales que incluyen comunicaciones inalámbricas,
como por ejemplo los sistemas de comunicación celular y los sistemas satelitales.
Para obtener un buen sistema de comunicaciones, es necesario caracterizar su
eficiencia y su eficacia. En este caso, la eficiencia es entendida como la velocidad con
que se transmite un conjunto de datos. La eficacia por su parte, es la veracidad con
que la información es transmitida y recibida, es decir, qué tantos errores se presentan
en el receptor con respecto al transmisor.
Para cuantificar la veracidad del sistema, se utiliza usualmente como unidad de
medición el BER (bit error rate), el cual determina la cantidad de bits errados en el
mensaje recibido, con respecto a aquel que fue transmitido. Esta tasa de error es
función del la relación señal a ruido (SNR) del canal en el cual se transmiten los
datos. El tema central de este trabajo trata del desempeño del BER en diferentes
sistemas y escenarios.
Para disminuir el BER, disminuyendo así la probabilidad de obtener errores en el
mensaje recibido, es necesario aumentar la relación señal a ruido del canal. Con esta
finalidad, son comúnmente utilizados en los sistemas de comunicaciones los códigos
de detección y corrección de errores.
De acuerdo al trabajo de Shannon, si la tasa de trasmisión de un sistema es menor que
la capacidad del canal, se puede diseñar un código corrector de errores en el cual la
probabilidad de error sea tan pequeña como se quiera. Así mismo, se sostiene que es
más económico usar los códigos de corrección de errores que aumentar la potencia de
6
transmisión, pues siempre se tendrá la presencia de ruido que corrompa la
información transmitida.
Existen diversos tipos de código, usados en diferentes situaciones, dependiendo de las
características del canal a utilizar y del sistema de comunicaciones completo. Hasta
ahora, ningún código ha podido alcanzar el límite teórico propuesto por Shannon,
aunque algunos códigos sí han logrado acercarse.
Este trabajo pretende estudiar algunos códigos utilizados frecuentemente en sistemas
de comunicaciones y determinar las fortalezas y desventajas de cada uno de ellos en
diferentes escenarios para así poder tomar decisiones respecto a qué código se debe
utilizar en un sistema complejo, con base en los experimentos realizados.
Lo que resta de este documento se organiza de la siguiente manera: primero se
estudian los códigos CRC, seguidos por los códigos Reed-Solomon, y los Turbo
Códigos. Cada uno de estos capítulos presenta las simulaciones realizadas, así como
las bondades y deficiencias del código a partir de los resultados obtenidos.
Finalmente, se exponen las conclusiones del trabajo.
7
1. CRC-8 PARA IEEE 802.16
1.1 INTRODUCCIÓN
El IEEE 802.16 es un protocolo de comunicación para redes inalámbricas de acceso
metropolitano de banda ancha. Debido a esto, esta tecnología también es llamada de
manera oficial WirelessMAN, y en la industria de las telecomunicaciones WiMAX
(Worldwide Interoperability for Microwave Acces). En la actualidad, este tipo de
redes de comunicaciones tiene un gran auge, debido a que permiten la conexión de
computadores a Internet, de manera inalámbrica, en áreas de amplia cobertura y a alta
velocidad. Esto permite la libre movilidad de personas, por ejemplo en una ciudad,
manteniendo el acceso a la transmisión de datos.
Por su parte, el algoritmo CRC (Cyclic Redundancy Check), es un código de
detección de errores de bloque y lineal. Lineal significa que si dos palabras X e Y
pertenecen al código, entonces la palabra resultante de la suma X + Y también
pertenece al código. Que sea cíclico quiere decir que para cualquier palabra que
pertenezca al código, un corrimiento de todos sus símbolos también pertenece al
código. Es decir, si X = {x1, x2, x3, …, xn} pertenece al código, entonces Y =
{xmodulo(1+i, n), xmodulo(2+i, n), xmodulo(3+i, n), …, xmodulo(n+i, n)} para cualquier i entero,
también pertenece al código.
Así mismo, el CRC es un código sistemático, lo que indica que todos los símbolos del
mensaje también aparecen en el código. En particular, la tecnología IEEE 802.16
utiliza símbolos binarios.
Lo que resta de este capítulo se distribuye de la siguiente manera: inicialmente se
describe el codificador y el decodificador, seguidamente se presentan las
simulaciones realizadas con su respectivo análisis, y finalmente se presentan las
ventajas, desventajas y aplicaciones de los códigos CRC.
8
1.2 CODIFICADOR
El diagrama de bloques del sistema completo de codificación y decodificación es el
siguiente:
Figura 1.1. Diagrama de bloques de un sistema CRC
En general, la forma de codificar una palabra usando CRC es mediante la expresión
matemática:
xdxxg
xdxModuloxc r
r
c(x) es la palabra código obtenida, g(x) es el “polinomio generador” del código, d(x)
es el polinomio mensaje y xdxr representa un corrimiento en este último. La
operación módulo es el residuo de la división. El grado del polinomio generador es
r = n – k.
En particular, para el protocolo IEEE 802.16 usa CRC-8, en donde
128 xxxxg . Por lo tanto, en este caso, r = 8. Esto quiere decir que cada
palabra código tendrá 8 bits más que la palabra mensaje, por lo tanto, siempre se
tendrán códigos del tipo CRC(k+8, k).
CodificadorCRCX
CANAL
Verificación CRC
MUX
Y
Ruido
Modulador
9
Así mismo, de acuerdo a [IEEE 04], un sistema que implemente el protocolo IEEE
802.16 debe soportar obligatoriamente las modulaciones spread BPSK, BPSK,
QPSK, 16-QAM, 64-QAM, y opcionalmente 256-QAM.
A continuación se presenta un ejemplo de codificación de un mensaje usando CRC-8.
En este ejemplo, se toma:
k = 4
r = 8
n = 12
Suponemos que el mensaje es d = [1 1 0 0], por lo que 23 xxxd . Entonces:
251011
2528
1011
1011
1
xxxxxc
xxxxx
xxModulo
xg
xdxModulo
xxxxd
r
r
Por lo tanto, la palabra código transmitida será c = [1 1 0 0 0 0 1 0 0 1 0 0].
1.3 DECODIFIFCADOR
Los códigos CRC son códigos de detección de errores. Esto significa que el código no
corrige los errores, únicamente revisa si la palabra código recibida pertenece al
conjunto de los códigos definidos por el polinomio generador o no.
Debido a que el código es sistemático, la decodificación se limita a verificar que la
palabra recibida pertenece al conjunto de códigos, y en caso tal de que sea así, el
10
mensaje decodificado corresponde a extraer los primeros k bits de la palabra código
recibida. Si se detectó un error en la palabra código recibida, lo mejor que se puede
hacer es descartar todo el paquete de datos y pedir la retransmisión de los mismos.
La verificación de que el código recibido representa una palabra correcta se realiza
mediante la siguiente expresión matemática:
xg
xrModuloSindrome
Donde r(x) es el polinomio recibido y g(x) es el mismo polinomio generador que se
uso en la etapa de codificación.
Si Síndrome es igual a cero, entonces el código es válido y el mensaje son los
primeros k símbolos de r(x). Si por el contrario, el síndrome es diferente de cero,
entonces r(x) no es una palabra código válida.
Otra forma de realizar la verificación es extraer inicialmente los primeros k términos
de r(x) y realizar la codificación sobre este segmento tal como se explicó en la
sección anterior. Si el código obtenido es igual al recibido, entonces la palabra es
correcta, si hay diferencias, entonces hay errores en la palabra recibida.
Siguiendo con el ejemplo de la sección anterior, tenemos lo siguiente:
Asumiendo que el código recibido es r = [1 1 0 0 0 0 1 0 0 1 0 0], es decir que
no hay errores en la transmisión, entonces 251011 xxxxxr .
0
128
251011
Sindrome
xxx
xxxxModuloSindrome
11
Tenemos que Síndrome = 0, por lo tanto, se deduce que la palabra código recibida
es correcta y por lo tanto, el mensaje decodificado es d’ = [1 1 0 0].
Si por el contrario el código recibido es r = [1 1 0 1 0 0 1 0 0 1 0 0], lo cual
implica que hay un error en el cuarto bit, entonces
2581011 xxxxxxr .
01
12
28
2581011
xxSindrome
xxx
xxxxxModuloSindrome
En este caso Síndrome 0, por lo tanto se sabe que hay un error y se debe pedir la
retransmisión del mensaje.
1.4 SIMULACIONES
Las simulaciones se realizaron en un canal de tipo ruido blanco gaussiano aditivo
(AWGN), y usando el código CRC-8, con mensajes de 100 bits, por lo que el código
se describe como CRC(108, 100). El sistema implementado es como el que se
muestra en la figura 1.1. El sistema de modulación utilizado es BPSK. Lo que se
pretende es analizar el número de retransmisiones necesarias para recibir
correctamente un bloque de datos.
Inicialmente la simulación se realizó en un canal con relación señal a ruido (SNR) de
4 dB, en donde se enviaron 500 paquetes de 100 bits generados de manera aleatoria.
El resultado obtenido es el siguiente:
12
13
Se encontró que el número de retransmisiones sigue una función exponencial
decreciente. El promedio de retransmisiones fue 78.1940 y la desviación estándar fue
86.3056. Esto nos indica que en pocas ocasiones fue necesario retransmitir más de
164 veces, que hay un gran número de paquetes que necesitaron un número pequeño
de retransmisiones.
Seguidamente se simuló el número de retransmisiones necesarias mientras que se
variaba el SNR del canal. El SNR se varió desde 0 dB hasta 12 dB en pasos de 1 dB,
y para cada paso se enviaron 200 paquetes de 500 bits generados de manera aleatoria
y se promedió el número de retransmisiones necesarias. El resultado obtenido es el
siguiente:
Se encontró que antes de los 3dB, el SNR del canal el muy bajo y por lo tanto, el
número de retransmisiones necesarias es alto (casi todos los paquetes se deben
retransmitir). Desde los 3dB en adelante, el número de transmisiones necesarias
disminuye de manera continua.
14
Se comprobó entonces que al incrementar la relación señal a ruido del canal, el
número de retransmisiones que se requieren para recibir correctamente un mensaje
disminuye. Sin embargo, existe una cota mínima en la cual la cantidad de errores es
tan grande que se mantiene constate sin importar que se disminuya aún más el SNR.
1.5 VENTAJAS, DESVENTAJAS Y APLICACIONES
Una importante ventaja de los códigos CRC es que estos son fáciles de implementar
en hardware, lo que garantiza una codificación y decodificación veloz en sistemas
reales.
Como principal desventaja, encontramos que el CRC es un algoritmo de detección de
errores y no de corrección de errores. Por lo tanto, si se determina que r(x) tiene
errores, lo mejor que se puede hacer es enviar un mensaje al transmisor pidiendo la
retransmisión del paquete de datos. Esto hace que sea necesario retransmitir una gran
cantidad de información, disminuyendo la tasa de transmisión efectiva.
Otro problema de este tipo de codificación es que el síndrome verifica que la palabra
r(x) pertenezca al espacio de palabras definido por el polinomio generador g(x). Esto
no asegura que el mensaje extraído sea el mismo que el enviado. Sin embargo, debido
a la forma de construcción del código, la probabilidad de que el mensaje decodificado
sea igual a el enviado dado que el síndrome es cero, es mayor que la probabilidad de
recibir un mensaje correcto sin ningún tipo de codificación en un canal de tipo
AWGN (aditive white gaussian noise), tal como el que se presenta en los sistemas
que usan IEEE 802.16. Aún así, se debe tener en cuenta que siempre existe una
probabilidad de obtener errores.
Como se puede ver, el CRC es usado en varios sistemas de comunicaciones. En este
caso particular se estudia la aplicación de CRC a IEEE 802.16, pero también es usado
15
en otros sistemas. Estos códigos son ampliamente usados en la capa de enlace de
redes de computadores, por ejemplo Ethernet utiliza CRC de 32 bits (CRC-32).
También es usado en los protocolos TCP, IP, UDP, ICMP.
16
2. CÓDIGOS REED-SOLOMON
2.1 INTRODUCCIÓN
Los códigos Reed-Solomon (denotados códigos RS) fueron descubiertos en 1960 por
los matemáticos Irving Reed y Gustave Solomon, y fueron presentados por primera
vez en su artículo titulado "Polynomial Codes over Certain Finite Fields". La teoría
matemática expuesta en este artículo representó un gran avance, e incluso, fue
necesario esperar varios años hasta que la tecnología alcanzara el desarrollo suficiente
para poderlos implementar de forma práctica. Estos códigos hacen parte de los
códigos lineales de bloque y cíclicos, así mismo son códigos sistemáticos.
El capitulo se organiza de la siguiente manera: Inicialmente se explica el codificar,
seguido por el decodificador y los criterios de diseño de los códigos. Luego se
presentan las simulaciones realizadas para caracterizar su desempeño y su análisis.
Para finalizar, se mencionan las ventajas, desventajas y aplicaciones que encuentran
los códigos Reed-Solomon.
2.2 CODIFICADOR
Debido a que los códigos RS son códigos lineales de bloque y cíclicos, el codificador
es el mismo que el usado en el resto de estos códigos. La descripción del codificador
y decodificador presentados en este capítulo se basa en la explicación que se
encuentra en [Roldán 02]. El diagrama de bloques del sistema es el siguiente:
17
Figura 2.1. Diagrama de bloques de los códigos Reed-Solomon
La notación usada en esta sección y en el resto del capítulo es la siguiente:
m es el número de bits de cada símbolo.
n = 2m – 1 es el número de símbolos en la palabra código.
k es el número de símbolos en el mensaje.
r = n – k es el número de símbolos de paridad en el mensaje.
t = (n – k)/2 es la capacidad de corrección (el máximo número de símbolos errados
que se puede corregir).
g(x) es el polinomio generador del código.
d(x) es el polinomio mensaje.
c(x) es el polinomio código.
RS(n, k) es un código Reed-Solomon con parámetros n y k.
Recordemos que los códigos RS son códigos sistemáticos, es decir que todos los
símbolos del mensaje están en la palabra código. Es por esto que el número de
símbolos de paridad está dado por el tamaño del código menos el tamaño del
mensaje.
Inicialmente es necesario definir el Campo de Galois en el que se va a trabajar. Esto
se hace a partir del número de bits que tienen los símbolos del mensaje. El Campo de
Galois usado será GF(2m). Una vez se ha construido el Campo de Galois, se calcula el
CodificadorRSX
CANAL
Decodificador RS
MUX
Y
ruido
18
polinomio generador del código utilizando el álgebra del campo de la siguiente
manera:
r
i
ixxg1
La palabra código es obtenida de la siguiente manera:
xdxxg
xdxModuloxc kn
kn
xdx kn representa un corrimiento en el mensaje. La operación módulo es el residuo
de la división.
A continuación se presenta un ejemplo para clarificar la codificación de un mensaje.
Se escoge m = 2, t = 1. Por lo tanto n = 3, k = 1, r = 2 y se usará GF(22). Según
[Roldán 02], el polinomio generador de este Campo de Galois es 12 xxxp ,
por lo que los elementos del campo son:
Elemento Forma Exponencial Forma Polinomial
0 0 0
1 1 1
2
3 2 1
El polinomio generador es entonces
11 222
1
xxxxxxxxgi
i
El mensaje escogido es d = [3], con lo que 03xxd . El código se calcula a
continuación:
19
333
31
3
2
022
02
xxxc
xxxx
xxModuloxc
Con lo cual el mensaje enviado es c = [3 3 3]. Es importante recordar que todas las
operaciones se realizan utilizando álgebra de GF(22).
2.3 DECODIFICADOR
Es necesario calcular el “Síndrome” del código recibido para determinar si este es
correcto o si tiene errores. En general, el síndrome está dado por:
xg
xrModuloSindrome
Donde r(x) es el código recibido.
Si el síndrome es 0, entonces el código fue recibido correctamente, de lo contrario
hay errores que se deben intentar corregir (se podrán corregir siempre y cuando el
número de símbolos errados sea menor que t). Otra forma de calcular el síndrome es
la siguiente:
tjrrsn
i
ij
i
j
j 2...,,2,1,1
0
En este caso, es necesario que todos los sj sean iguales a 0 para que el código haya
sido recibido sin errores.
En caso de haber errores, se debe solucionar el conjunto de ecuaciones no lineales:
tjXYXYXYsj
zz
jj
j 2...,,2,1,...2211
Donde 0 < z < t es el número de errores en el mensaje recibido. Los Xj indican las
posiciones en donde están los errores y su respectivo Yj indica el valor del error.
20
Siguiendo con el ejemplo de la sección de codificación tenemos lo siguiente.
Inicialmente, asumimos que el mensaje fue recibido correctamente, por lo tanto r = [3
3 3], 333 2 xxxr . El síndrome (calculado de la primera forma explicada) es el
siguiente:
01
3332
2
xx
xxModuloSindrome
Por lo tanto se decide que no hay errores y se entrega los k primeros símbolos
correspondientes al mensaje. En este caso d’ = [3] es el mensaje recibido.
Si por el contrario se recibe el código r = [3 3 1], 133 2 xxxr , con un error en
el último símbolo, entonces el síndrome (calculado de la segunda forma explicada)
será:
333
13324
2
21
s
s
Realizando las operaciones en el álgebra de GF(22). Dado que tanto s1 como s2 son
diferentes de 0, hay errores que se deben corregir. Para esto se soluciona (nuevamente
usando álgebra de GF(22)) el conjunto de ecuaciones:
3
12
11
11
XY
XY
2;3 11 YX
Por lo tanto, r(x) tiene un error de valor 2 en la posición 3. Para corregirlo debemos
adicionar 2 de la siguiente manera:
333
233
2
2
22
2
xxxc
xxxxc
xxrxc
Finalmente, el mensaje recibido está comprendido por los k primeros símbolos de
c’(x), por lo que d’ = [3] y el mensaje se ha decodificado correctamente.
21
2.4 CRITERIOS DE DISEÑO
Según [Wicker 94], un código Reed-Solomon puede corregir t errores donde t está
dado por:
2
1knt
Es posible que algunos símbolos se pierdan. Esto puede ocurrir, por ejemplo, al ser
descartados por el demodulador debido a la recepción de niveles muy cercanos al
umbral de decisión, lo cual implicaría una alta probabilidad de error en la
decodificación. Si v es el número de símbolos borrados (perdidos o descartados) y t el
número de errores, de acuerdo a [Wicker 94], un código Reed-Solomon puede
corregir un paquete de datos mientras que se cumpla lo siguiente:
12 knvt
A partir de este par de ecuaciones, es posible escoger los valores de n y k, los cuales a
su vez determinan el valor de m, r y el Campo de Galois a usar.
2.5 SIMULACIONES
Las simulaciones realizadas buscan analizar el desempeño de los códigos Reed-
Solomon bajo dos condiciones específicas. El primer escenario comprende la
introducción de errores aleatorios a partir de un canal con ruido blanco gaussiano
aditivo (AWGN), y el segundo escenario simula la introducción de errores en ráfaga.
En todos los casos, el código usado es de tipo RS(127, 99), es decir, los parámetros
del código son m = 7, n = 127, k = 99, r = 28.
22
Debido a que los códigos Reed-Solomon envían y recuperan símbolos no
necesariamente binarios, se caracteriza tanto el SER (Symbol Error Rate), como el
BER (Bit Error Rate) del código utilizado.
El SER y el BER estimado para un canal de tipo AWGN con relación señal a ruido
dBSNR 4 , se obtuvo enviando 500 paquetes de datos. El SER se calculó revisando
el número de símbolos errados después de la decodificación, mientras que el BER se
obtuvo revisando los errores en cada bit. Los resultados obtenidos son los siguientes:
23
Debido a la naturaleza del canal, vemos que el SER sigue una distribución gaussiana.
Se encontró que la media de esta distribución es 0.3319 y la desviación estándar es
0.0463. Esto quiere decir que el 33.19% de los símbolos enviados en un canal de tipo
AWGN son recibidos incorrectamente.
La simulación obtenida para el BER se presenta a continuación:
24
Nuevamente, la distribución del BER sigue una distribución de tipo gaussiana. En
este caso, la media fue 0.0563, mientras que la desviación estándar fue 0.0084. Esto
quiere decir que el 5.63% de los bits fueron decodificados incorrectamente.
25
Encontramos entonces que mientras que el 5.63% de los bits fueron decodificados de
manera errada, el 33.19% de los símbolos no se recuperaron correctamente. Esto es
debido a que en el código usado, cada símbolo está compuesto de 7 bits, y si uno solo
de ellos falla, todo el símbolo es incorrecto. Debido a esto, al introducir errores
aleatorios de forma gaussiana, el desempeño del SER es muy malo, haciendo que este
tipo de códigos no sea efectivo en canales de tipo AWGN. Sin embargo, se concluye
que el tipo de código usado tiene una fuerte repercusión en los resultados obtenidos.
Si se usa un código con símbolos de menor longitud, el desempeño será mejor.
En la siguiente simulación se utilizó el mismo código RS(127, 99), y se varió la
relación señal a ruido (SNR) desde 0 dB hasta 12 dB. En este caso se enviaron 200
paquetes de datos para cada SNR y se promedió el resultado:
26
Vemos que las gráficas son consistentes con los datos obtenidos anteriormente,
cuando nos encontrábamos situados sobre dBSNR 4 . Encontramos que a medida
que se aumenta el SNR, tanto el BER como el SER disminuyen, sin embargo la
pendiente en la gráfica del SER es más pronunciada que en la obtenida en el BER.
Esto es debido nuevamente a que muchos bits componen un solo símbolo.
Finalmente se simuló un escenario en donde los errores son introducidos en forma de
ráfaga, es decir una gran cantidad de bits seguidos con error. Para esto, se
introdujeron desde 0 hasta 200 bits errados seguidos en el código recibido. El
resultado obtenido es el siguiente:
27
Recordemos que la capacidad de corrección de este código es 142/99127t .
Lo cual quiere decir que se pueden corregir 14 símbolos, los cuales están compuestos
de 14*7 = 98 bits. Vemos en la gráfica que hasta 98 bits errados en recepción tienen
un BER y un SER de 0, pues todos los errores son corregidos. Desde 99 errores en
adelante el BER está dado por una recta pues todos los bits recibidos con error son
decodificados incorrectamente, mientras que el SER tiene forma escalonada pues
entre l*7 y (l+1)*7, para l entero mayor que 14 el número de símbolos decodificados
de forma incorrecta es el mismo.
Para verificar la validez de los resultados, se comparó el comportamiento del sistema
simulado con los resultados de la bibliografía. En [Odenwalder 76], se presenta la
siguiente gráfica que caracteriza el comportamiento de un codificador RS. La
codificación se realiza con n = 31 y para varios valores de t. Además se utiliza
modulación MFSK 32-aria.
28
Se implementó el mismo sistema simulado anteriormente, pero en este caso se usó
RS(31, 29), para tener el caso t = 1. También se implementó un bloque modulador
después de la codificación, usando FSK 32-aria. El resultado es el siguiente:
29
Se puede apreciar que entre para No
Eb entre 3.5 dB y 5 dB, que es donde coinciden la
gráfica de la bibliografía y la teórica, los valores encontrados son bastante parecidos,
concluyendo así que el modelo implementado es válido.
2.6 VENTAJAS, DESVENTAJAS Y APLICACIONES
Una importante ventaja de los códigos Reed-Solomon es que su codificación y
decodificación es rápida. Esto permite usar este tipo de códigos en aplicaciones en
donde se necesita recibir información en tiempo real.
Inicialmente la desventaja se encontraba en que fue difícil encontrar un algoritmo de
decodificación útil. Los algoritmos propuestos inicialmente solo podían decodificar
códigos con pocos errores debido a que al incrementar la complejidad del código, el
tiempo de decodificación crecía de forma que el problema se volvía
computacionalmente intratable. Sin embargo, este problema se solucionó con
posteriores implementaciones en los decodificadores.
Como se pudo apreciar en las simulaciones, hoy en día la principal desventaja se
encuentra en que es necesario usar además un código convolucional para obtener una
baja tasa de error de bit, es por esto que en algunas aplicaciones los códigos Reed-
Solomon han sido reemplazados por los Turbo Códigos.
Las aplicaciones más usadas se encuentran en codificación de errores en CD’s y
DVD’s. Los errores generados en estos tipos de dispositivos de almacenamiento de
datos se deben principalmente a imprecisiones en los movimientos del láser que
escribe la información en el medio. Este tipo de codificación es adecuado en estas
30
aplicaciones ya que los errores se presentan usualmente en ráfagas, los cuales son
corregidos de manera apropiada tal como se comprobó en las simulaciones.
Hasta ahora, los códigos Reed-Solomon han sido usados en misiones de espacio
profundo de la NASA. De acuerdo a [JPL 06], las sondas Voyager, Galileo y Cassini
usaron una combinación de códigos Reed-Solomon y códigos Convolucionales para
transmitir datos a la Tierra.
31
3. TURBO CÓDIGOS
3.1 INTRODUCCIÓN
Los Turbo Códigos fueron desarrollados en 1993 por los investigadores Berrou,
Glavieux y Thitimajshima [Berrou 93]. Estos se basan en los códigos convolucionales
y explotan la idea de la transmisión de un par de códigos de manera paralela. Es
importante anotar que los Turbo Códigos representan uno de los mayores avances en
el estudio e implementación de los códigos de corrección de errores, no solo en los
últimos años sino desde que se inició su estudio, pues se acercan al Límite de
Shannon, el cual el determina el límite teórico de la tasa máxima de transmisión de
información sobre un canal con ruido.
Este capítulo se desarrolla de la siguiente manera: a continuación se presenta una
introducción a los códigos de corrección de errores de tipo convolucional,
seguidamente, se presenta el codificador y el decodificador de los códigos
convolucionales. La siguiente sección está dedicada a presentar las simulaciones
realizadas para caracterizar su desempeño junto con su análisis, y finalmente se
mencionan las ventajas, desventajas y aplicaciones de este tipo de código de
detección de errores.
3.2 CÓDIGOS CONVOLUCIONALES
Los códigos convolucionales, como los demás códigos de detección y corrección de
errores, introducen información redundante en los datos a transmitir. La información
redundante es introducida mediante el uso de un codificador compuesto por un
conjunto de registros de corrimiento, cuyas salidas están conectadas entre sí, y un
conjunto de sumadores, que realizan adición modulo 2. En la figura 3.1 se presenta el
esquema de un codificador convolucional típico.
32
Figura 3.1. Codificador convolucional ejemplo
La entrada al codificador es la secuencia de bits X, y las salidas (paralelas) son C1 y
C2. Para realizar la suma modulo 2, se realiza la operación XOR.
Inicialmente los registros de corrimiento (S) se encentran en el estado “00”, es decir
que cada uno almacena un ‘0’. Cada vez que llega un bit a codificador, el dato
almacenado en cada registro es pasado al siguiente, de forma que el estado cambia y
se tiene en cuenta el nuevo bit.
De acuerdo a las convenciones explicadas en [Huang 97], el decodificador
convolucional se puede representar de varias formas. Los parámetros que definen el
codificador son los siguientes:
- Longitud (k), la cual representa el número de bits que intervienen en la salida,
por lo tanto, está dada por el número de registro de corrimiento más 1 (los bits
que hay en los registro más el bit de la entrada). En el ejemplo de la figura
3.1, k = 3.
X
C1
C2
S S
33
- Tasa (r), la cual indica la tasa a la que se están codificando los símbolos. Para
un codificador con m bits de entrada por cada símbolo y n salidas, la tasa es
r = m/n. En el ejemplo de la figura 3.1, r = 1/3.
- Polinomio característico (g), el cual es una representación común para
identificar las conexiones en el codificador. g es una matriz de kn , en
donde si el elemento (i, j) es ‘1’, quiere decir que hay conexión entre la salida
del registro j y el sumador de la salida i. De lo contrario será ‘0’. En el
ejemplo de la figura 3.1, 101
111g .
A partir de estos datos, se puede definir una máquina de estados de los registros de
corrimiento, y un “Trellis”, el cual muestra el estado futuro y la salida para cada
estado presente y cada posible entrada. La figura 3.2 muestra el Trellis del
codificador de la figura 3.1. Los números de la izquierda representan el estado inicial,
los de la derecha el estado final, y los de las flechas muestran el bit que entra al
codificador y la salida.
Figura 3.2. Diagrama Trellis de la figura 3.1.
00
01
10
11
00
01
10
11
0 / 00
1 / 10
1 / 11
0 / 11
1 / 00
0 / 10
1 / 01 0 / 01
34
Existen varios algoritmos para decodificar el código convolucional. En particular, el
algoritmo Viterbi es usado en diversas aplicaciones y será el que utilicemos en la
decodificación de Turbo Códigos.
3.3 CODIFICADOR
El codificador para Turbo Códigos está compuesto de dos codificadores
convolucionales y un bloque para realizar una permutación. Los codificadores suelen
ser del tipo RSC (Recursive Systematic Convolutional) [Huang 97]. La figura 3.3
muestra el diagrama de bloques del codificador para Turbo Códigos.
Figura 3.3. Codificador para Turbo Códigos
La entrada al codificador está representada por la secuencia de bits X. Los
codificadores RCS1 y RCS2 son iguales. Dado que se usan codificadores sistemáticos,
una de las salidas (en este caso C1) es igual a los datos que se introducen. Es decir, el
transmisor envía los datos originales y los códigos generados.
El codificador presentado en la sección anterior es convolucional, pero no es
recursivo. Un codificador recursivo es aquel que tiene realimentación de al menos
una de las salidas de los registros de corrimiento. La figura 3.4 presenta un
codificador convolucional RSC. Este codificador es el que usará en la sección de
simulaciones.
RSC1
RSC2Permutador
X
C1
C2
C3
35
Figura 3.4. Codificador RSC
El bloque Permutador, genera una permutación conocida del mensaje de entrada. Esta
permutación es codificada y su resultado es transmitido. La idea del permutador es
introducir aleatoriedad al mensaje transmitido, y de esta forma, alcanzar un mejor
desempeño en el momento de realizar la decodificación.
Es importante notar que debido a que los codificadores RSC1 y RSC2 son iguales, el
bloque RSC2 también generará una salida sistemática (igual a los datos de entrada),
sin embargo, esta salida no es transmitida y en el momento de realizar la
decodificación se debe tener cuidado de realizar las permutaciones y permutaciones
inversas necesarias.
3.4 DECODIFICADOR
Debido a que los datos transmitidos están compuestos de la salida de dos
codificadores separados, el decodificador también está compuesto de dos
decodificadores de códigos convolucionales separados. Uno de ellos se encarga de
X
C1
C2
S S
36
decodificar la los datos codificados por RSC1 y el otro decodifica la salida de RSC2.
Claramente, la salida de ambos debe ser la misma, sin embargo, debido a la
aleatoriedad del ruido introducido en el canal, los resultados no serán iguales.
Para solucionar este problema, y darle mayor robustez a la decodificación, no se
utiliza un algoritmo como el Viterbi. Por el contrario, cada uno de los dos
decodificadores utiliza información a-priori generada por el otro. El esquema
completo de un sistema de codificación y decodificación de Turbo Código se presenta
en la figura 3.5.
Figura 3.5. Sistema de codificación y decodificación de Turbo Código
Cada decodificador calcula la probabilidad de que el bit sea ‘1’ o ‘0’, y le pasa esta
información al otro decodificador, después de un número determinado de iteraciones,
el proceso termina y se escoge el valor del bit. El algoritmo general de decodificación
es el siguiente:
1. Inicializar la información extrínseca del Decodificador 2 (Le2) con un vector
de ceros.
RSC1
RSC2Permutador
XCANAL
Ruido
Decodificador 1
Decodificador 2
Le2 Le1
37
2. Decodificador 1 recibe la salida sistemática (Y1), el código generado por
RSC1 (Y2) y la información a-priori, La1 = perm-1(Le2). Genera un vector de
probabilidades de los bits recibidos (Lout1).
3. Decodificador 1 genera su información extrínseca (Le1) mediante la ecuación
1111 YLaLoutLe
4. Decodificador 2 recibe como entrada la permutación de la salida sistemática,
perm(Y1), el código generado por RSC2 (Y3) y la permutación de Le1 que es la
información a priori, La2 = perm(Le1). Genera un vector de probabilidades de
los bits recibidos (Lout2).
5. Decodificador 2 genera su información extrínseca (Le2) mediante la ecuación
1222 YpermLaLoutLe
6. Se genera un vector de bits estimados mediante la ecuación:
2/1ˆ2LoutsignpermY
7. Volver al paso 2.
Donde perm() es la función que realiza la permutación de un vector de datos, perm-1()
realiza la permutación inversa y sign() es la función de signo definida como sigue:
0,1
0,0
0,1
x
x
x
xsign
Para generar Lout, existen varios algoritmos de decodificación usando información a-
priori. Entre los más comunes están MAP (Maximum Aposteriori Probability) y
SOVA (Soft Output Viterbi Algorithm). Además, existen algunas optimizaciones del
algoritmo MAP como log-MAP y max-log-MAP que utilizan propiedades de los
logaritmos para simplificar el algoritmo.
Estos algoritmos calculan la siguiente probabilidad:
38
yxP
yxPLout
0
1log
Por lo tanto, si Lout < 0, sabemos que ymP i 0 > ymP i 1 , lo cual quiere decir
que es mas probable que el bit sea ‘0’. Igualmente, se puede deducir que es más
probable que el bit sea ‘1’ si Lout > 0. De esta forma, se deduce que es adecuado usar
la función sign(Lout) para estimar el valor del bit transmitido.
3.5 SIMULACIONES
En las simulaciones realizadas se supone un canal con ruido blanco gaussiano aditivo
(AWGN). Lo que se pretende es estimar la tasa de error de bit (BER) de los Turbo
Códigos y comparar su desempeño con los otros códigos estudiados.
El sistema implementado es como el mostrado en la figura 3.5, los codificadores
convolucionales son como el mostrado en la figura 3.4. El algoritmo de
decodificación a-priori usado es el SOVA. La permutación se implementó invirtiendo
la cadena de datos. El número de iteraciones entre los dos decodificadores SOVA fue
5.
El BER estimado se presenta a continuación. Se obtuvo transmitiendo 1000 paquetes
de 200 bits y revisando el número de errores obtenidos en un canal con relación de
señal a ruido dBSNR 4 :
39
40
Vemos que el BER sigue una distribución gaussiana. Se calculó que la media de esta
gaussiana es 0.0064 y su desviación estándar es 0.0086. Esto quiere decir que el
0.64% de los bits enviados fue decodificado incorrectamente, o lo que es lo mismo, el
99.36% de los bits de decodificó de forma correcta.
La misma simulación se realizó para un sistema convolucional simple con codificador
como el mostrado en la figura 3.4 (el mismo usado para la simulación de Turbo
Códigos). Igualmente, se transmitieron 1000 paquetes de 200 bits a través de un canal
con AWGN cuya relación señal a ruido es dBSNR 4 . Los resultados obtenidos se
presentan a continuación:
41
Nuevamente, vemos que el BER sigue una distribución gaussiana. En este caso, se
calculó que la media es 0.0852 y la desviación estándar es 0.0312. Esto quiere decir
que el 8% de los bits transmitidos fueron mal decodificados.
En la siguiente simulación, se transmitió y decodificó usando Turbo Códigos. En este
caso se enviaron 200 paquetes de 1000 bits, variando la relación señal a ruido (SNR)
desde 0dB, hasta 12dB:
42
Es claro, que al aumentar la relación señal a ruido, la señal transmitida es recibida con
una mejor calidad, por lo tanto, la tasa de error de bits disminuye a medida que SNR
crece. Vemos también que en los Turbo Códigos, el BER se acerca al límite
propuesto por Shannon.
La misma simulación se realizó para el codificador convolucional simple, usando el
algoritmo Viterbi para la decodificación. El resultado obtenido se presenta a
continuación:
43
Gracias a los resultados obtenidos, podemos concluir que la tasa de error de bit de los
Turbo Códigos es muy superior a la que se obtiene usando un codificador
convolucional simple. Sin embargo, se debe mencionar que el tiempo de codificación
y decodificación del Turbo Código es mucho mayor. La simulación se llevó a cabo en
un computador Pentium 4 de 3.0GHz y 1GB de RAM y se encontró que mientras que
la simulación del Turbo Código tomó 5 minutos, la del código convolucional simple
tomó 6 segundos. Es importante tener en cuenta estas diferencias en los desempeños
en el momento de escoger un código para implementar un sistema real.
Para aseguraos de la validez de las simulaciones, se realizaron comparaciones con la
bibliografía revisada. El comportamiento de los Turbo Códigos presentado en [Berrou
93] se muestra a continuación. En este caso, el codificador tiene r = ½ y un
permutador de 256 x 256:
44
Vemos que los resultados concuerdan con la simulación presentada anteriormente.
Así mismo, se realizó una comparación del codificador convolucional simple con
decodificador Viterbi. En [Heller and Jacobs 71] se utiliza un codificador con r = ½ y
modulación BPSK. El resultado obtenido se presenta a continuación:
45
Se realizó entonces nuevamente la simulación del codificador convolucional (con el
mismo codificador), pero se adición un bloque de modulación BPSK y k = 7. El
resultado obtenido es el siguiente:
46
Vemos que la simulación es bastante parecida a los datos de la bibliografía.
3.6 VENTAJAS, DESVENTAJAS Y APLICACIONES
La principal ventaja de los Turbo Códigos, es que se acerca al Límite de Shannon, el
cual es el límite teórico de la tasa máxima de transmisión de información sobre un
canal con ruido. Por lo tanto, es posible aumentar la tasa de transmisión manteniendo
constante la potencia de transmisión.
Por otra parte, las desventajas de este tipo de códigos es que la decodificación tiene
una alta complejidad. Como se mencionó, es necesaria la implementación de un
algoritmo de decodificación con información a-priori. Además, se necesita no uno
sino dos decodificadores que realicen un número de iteraciones. Por esta razón el
tiempo de decodificación es alto, imprimiendo una demora en la transmisión de datos.
Debido a las ventajas y desventajas expuestas, los Turbo Códigos encuentran
aplicación en las comunicaciones satelitales, en donde la alta latencia de
decodificación no es problema debido a que las grandes distancias introducen una
demora aún mayor, la cual domina el tiempo de retraso en la transmisión de la
información.
Finalmente, se acuerdo a [JPL 06], la NASA busca migrar sus futuras misiones
espaciales a esta tecnología. Esto se debe al buen desempeño de los Turbo Códigos en
su BER, y a que en las misiones espaciales de espacio profundo las distancias que
recorre la información son muy grandes, haciendo que el tiempo que domina la
latencia sea la de propagación y no la de decodificación. Sin embargo, es importante
anota que la NASA ha desarrollando hardware especializado para la decodificación
de Turbo Códigos.
47
CONCLUSIONES
Inicialmente es importante notar que el CRC es un código de detección de errores y
no de corrección de errores. Es decir que si se presenta un error, lo mejor que puede
hacer es encontrarlo y pedir la retransmisión del paquete. Por el contrario, los códigos
Reed-Solomon, Viterbi y Turbo Códigos son códigos de corrección de errores, por lo
que si encuentran un error en la palabra código recibida, intentarán corregirlo.
La siguiente tabla muestra una comparación de las principales características de cada
código.
BER Velocidad Implementación
CRC-8
No tiene BER puesto
que no corrige errores,
sí existe una probabili-
dad de error asociada.
La codificación y
decodificación es
rápida.
Fácil de implementar
pues solo es necesario
realizar división de
polinomios.
Reed-
Solomon
Tiene un alto BER para
un SNR menor a 8dB.
Para SNR mayores, el
BER mejora
significativamente.
En general es lento,
pero depende del
polinomio genera-
dor que defina el
espacio.
En general no es
demasiado difícil de im-
plementar, pero se debe
considerar que se debe
usar el álgebra del
campo de Galoise.
Viterbi
Tiene un buen BER
para SNR menor a 8dB.
Para SNR mayores, el
BER no es tan
representativo.
La codificación y
decodificación se
realiza bastante
rápido.
Fácil de implementar, la
dificultad más grande
está en la implementa-
ción del trellis.
Turbo Tiene el mejor BER de Depende en gran El codificador es fácil de
48
Códigos todos los códigos
estudiados. Presenta
gran ventaja sobre los
demás y se acerca al
límite teórico de
Shannon.
medida del número
de iteraciones usa-
das para decodifi-
car. En general es
considerado lento y
se debe implemen-
tar en hardware.
implementar (similar a
Viterbi). El decodifica-
dor tiene mayor comple-
jidad pues debe calcular
probabilidades para cada
bit usando un algoritmo
como el SOVA o log-
MAP.
La comparación del BER en todos los códigos se presenta a continuación:
En general, se encontró que si el nivel de ruido al que se encontrará sometida la
transmisión es muy alto y la velocidad de decodificación no es importante, la mejor
opción es usar Turbo Códigos, pues estos tienen un muy alto BER en condiciones de
SNR bajas.
49
Si por el contrario se debe realizar una decodificación rápida, los códigos que
representan la mejor opción son Reed-Solomon y Viterbi. La selección de uno de
estos dos se encuentra a la relación señal a ruido que se presentará en el sistema de
comunicaciones a usar. Si el SNR es menor que 8dB, se debe usar un codificador
Viterbi, si por el contrario el SNR es mayor que 8dB, es más apropiado un
codificador de tipo Reed-Solomon.
El CRC-8 se debe usar en situaciones en donde se desee mantener un sistema simple
que no realice corrección de errores. Sin embargo, este codificador debe ser usado
solo en situaciones en donde el tiempo de transmisión no sea una variable crítica,
pues es probable que sea necesaria la retransmisión de muchos paquetes.
En general, en sistemas grandes y complejos, la facilidad de implementación no
debería ser una métrica definitiva para la escogencia de un codificador sobre otro.
Esto es debido a que la implementación se realiza una sola vez en el sistema, y la
finalidad última del mismo debe ser la transmisión de datos de forma confiable
transparente para el usuario.
50
BIBLIOGRAFÍA
[Berrou 93] Berrou, C., Glavieux, A., Thitimajshima, P., “Near Shannon Limit error-correcting coding and decoding: Turbo-codes”, Proceedings of IEEE International Communications Conference, 1993.
[Heller and Jacobs 71] Heller, J. A., Jacobs, I. M., “Viterbi Decoding for Satellite and Space Communication”, IEEE Trans. Commun. Technol., vol. COM 19, no.5, October 1971.
[Huang 97] Huang, F., “Evaluation of Soft Output Decoding for Turbo Codes”, Tésis de Maestría en Ingeniería Eléctrica, Virginia Polytechnic Institute and State University, 1997.
[IEEE 04] “IEEE Standard for Local and Metropolitan Area Networks, Part 16: Air Interface for Fixed Broadband Wireless Access Systems”, IEEE, 2004.
[Odenwalder 76] Odenwalder, J. P., “Error Control Coding Handbook”, M/A-COM LINKABIT, Inc. San Diego, Calif., 1976.
[JPL 06] “Communications Systems and Research Section, JPL”, recuperado el 30 de Agosto de 2006 de http://www331.jpl.nasa.gov/public/JPLtcodes.html.
[Roldán 02] Roldán, J. M., “Estudio Sobre las Aplicaciones en Telecomunicaciones de los Códigos Correctores de Error Reed-Solomon”, Proyecto de Grado en Ingeniería Eléctrica, Universidad de los Andes, 2002.
[Wicker 94] Wicker, S. B., Bhargava, V. K., “Reed-Solomon Codes and Their Applications”, IEEE Press, 1994.