• No se han encontrado resultados

TELEFONÍA MÓVIL CELULAR GSM

II. 2.6 Codificación de canal

La mayor parte de la teoría de detección y corrección de errores se basa en la suposición de que el canal digital es un canal sin memoria, lo cual no es cierto en el caso de comunicaciones móviles, en que aparecen errores por ráfagas, debido a los desvanecimientos del canal. Para conseguir que un canal de este tipo aparezca como un canal sin memoria se introduce entrelazado de símbolos.

La mayor parte de los canales lógicos de GSM utilizan una codificación anidada, con un código bloque externo, que generalmente es sólo detector de errores, y un código convolucional interno, corrector de errores. Además, se aplican diversos tipos de entrelazado para “aleatorizar” los efectos de las ráfagas de errores del canal.

En este apartado vamos a describir el entrelazado, los códigos convolucionales y los códigos bloque, así como su decodificación, para a continuación adentrarnos en la codificación para cada canal lógico de GSM en concreto.

Códigos convolucionales

Un código convolucional (CC) es una secuencia de símbolos codificados que se genera haciendo pasar la secuencia de información a través de un registro de desplazamiento binario, como se muestra en la figura II.2.10. En cada instante de símbolo, se inserta un símbolo de k bits en las etapas de entrada del registro. El registro consta de Kk etapas binarias que constituyen el presente símbolo de k bits y los (K – 1) símbolos (de k bits) de entrada anteriores. El parámetro K se conoce como “longitud obligada” del código (“constraint length”), y determina la memoria del registro de desplazamiento.

Hay n generadores de funciones algebraicas g1, g2, ... gn, definidos por sus

conexiones a varias etapas del registro. Estas funciones algebraicas proporcionan un símbolo codificado de n bits. Los sumadores son módulo-2. El bit más significativo será el correspondiente al n-ésimo generador.

En cada instante de símbolo, un nuevo símbolo de información entra en el registro, los otros símbolos son desplazados hacia la siguiente posición y un símbolo abandona el registro. Se genera un nuevo símbolo codificado. El proceso continúa hasta que se ha codificado toda la secuencia de símbolos de entrada.

El código convolucional se describe básicamente por los parámetros n, k y K y se denota como CC(n,k,K). La tasa de codificación se define como:

80 n

k R=

y representa la cantidad de información por bit codificado.

Si k = 1, el código se denomina binario. Si k > 1, será no binario.

Para generar el código CC(n,k,K) hace falta un conjunto de generadores g1, g2, ...

gn, como ya hemos dicho. Cada generador se describe como un vector de longitud igual

a la del registro completo, esto es: Kk elementos. El i-ésimo elemento del vector especifica si la i-ésima posición de bit del registro de desplazamiento está conectada (o no) al sumador módulo-2. Se asigna un 1 lógico a las posiciones en las que corresponda una conexión. El resto valdrán 0. En la figura II.2.10 vemos que varias posiciones del registro están conectadas a los sumadores.

Figura II.2.10.- Codificador convolucional genérico.

Los generadores pueden describirse como vectores, o de forma equivalente mediante polinomios.

Ilustremos lo que decimos con un ejemplo sencillo. Supongamos un código convolucional binario (k = 1), de tasa mitad (R = k/n = ½ ), con longitud obligada de K=3 etapas. Se denominará entonces CC(2,1,3). Supongamos que los generadores vienen dados por:

[

]

[

1 1 1

]

1 0 1 2 1 = = g g o equivalentemente: 2 2 2 1 1 ) ( 1 ) ( z z z g z z g + + = + = k ... 2 1 k ... 2 1 ... k ... 2 1 k ... 2 1 + ... + + n 2 1 n ... 2 1 n ... 2 1 ... ... Registro de desplazamiento de Kk etapas Secuencia de símbolos codificados de n bits Secuencia símbolos de información de k bits

81 Podemos ver estos generadores en la figura II.2.11.

Figura II.2.11.- Codificador convolucional para código CC(2,1,3)

El registro tiene tres etapas binarias, la primera es para el bit actual y las otras dos para los dos anteriores. El “estatus” del codificador viene definido por el valor lógico de los bits, mientras que el “estado” del código viene representado por los dos bits anteriores.

Inicialmente, el registro está en el estado “todo-cero” y se le aplica un bit de entrada de valor lógico 1. Los generadores proporcionarán como símbolo de salida 11. En el instante siguiente, los datos se moverán un lugar hacia la derecha. La nueva entrada es un 0 lógico, y el estado del código pasa de ser 00 a 10. El nuevo símbolo codificado es 10. Y así sucesivamente, teniendo siempre en cuenta que el bit más significativo de cada símbolo de salida corresponde con el generador de subíndice más alto.

Los códigos convolucionales pueden verse como la convolución de la respuesta impulsiva del codificador con la secuencia de información. Si en el ejemplo anterior introducimos como secuencia de entrada un 1 seguido únicamente por ceros, la salida que obtenemos será la respuesta impulsiva del registro: 11, 10, 11, 00, 00, ...

Para una secuencia de entrada arbitraria, la salida del codificador será la suma módulo-2 de las respuestas impulsivas que aparecen debido a cada 1 lógico en la entrada, donde cada respuesta impulsiva será colocada de acuerdo con la posición de los unos en la secuencia de entrada. Podríamos obtener la salida O en función de la entrada I multiplicando ésta por una matriz generadora G. Pero, como los códigos convolucionales no tienen una longitud definida, la matriz G es semi-infinita. Por lo que hay que buscar otros modos de representación del código.

El estado del codificador, como hemos dicho, se obtiene observando los (K –1)k bits (en el ejemplo es (K –1)k = 2 bits) situados en las posiciones más alejadas de la entrada. El estado va cambiando con cada símbolo que entra. La salida dependerá de la entrada y del estado actual del codificador.

Dado que el estado viene dado por (K –1)k bits, existirán 2(K –1)k estados posibles. En nuestro ejemplo son 4 los posibles estados: 00, 10, 01 y 11, que denominaremos a, b, c y d, respectivamente. En la figura II.2.12 podemos observar el diagrama de transición

0 0 1 11 10 00 10 0 1 0 + + 1 2 Secuencia de información Secuencia codificada ... ...

82

de estados para este codificador. La rama que sale del estado actual hacia el siguiente

indica una transición de estados. Las ramas con línea discontinua indican que esa transición fue iniciada por un 1 lógico a la entrada, mientras que las de línea continua indican que se trata de un 0 lógico. El símbolo que se asocia a cada rama es el símbolo codificado de salida de n = 2 bits. El número de ramas que salen de cada estado es 2k (2 en nuestro ejemplo), que corresponde al número de posibles patrones de entrada.

Figura II.2.12.- Diagrama de transición de estados.

A partir del diagrama de transición de estados, podemos construir el diagrama

de estados, que se muestra en la figura II.2.13. Cada nodo es un estado posible, y tiene

dos ramas de salida y dos de entrada. La transición de un estado a otro en respuesta a una entrada 0 se representa por una línea continua, mientras que una transición debida a una entrada 1 se representa con línea discontinua. La etiqueta junto a cada rama representa la salida del codificador al moverse de un estado a otro. Como vemos, la relación entrada- salida de un codificador convolucional queda completamente descrita por su diagrama de estados.

83 La secuencia de símbolos de entrada hará que cambie el estado del codificador en cada instante de símbolo. La secuencia de estados que sigue el codificador es única para cada secuencia de entrada.

Esto nos da la idea de realizar una representación gráfica de las transiciones del estado del codificador respecto al tiempo. Este tipo de representación se conoce como

diagrama de trellis (“enrejado”). El diagrama de trellis se obtiene concatenando los

distintos instantes del diagrama de transición de estados de la figura II.2.12, empezando desde el estado todo-cero. En la figura II.2.14 se muestra el diagrama de trellis del código de nuestro ejemplo. Se ilustran todos los posibles caminos que puede tomar el estado del codificador. Como antes, una rama con código producido por una entrada 0 se ha dibujado con línea continua, mientras que una rama con código producido por una entrada 1 se ha trazado con línea discontinua. Una secuencia de entrada determinada hará que se siga un determinado camino. Así, la secuencia (10011) producirá la salida codificada (11, 10, 11, 11, 01).

Podemos ver que, tras el transitorio inicial, el trellis contiene cuatro nodos en cada instante de símbolo. El trellis se puede extender anexando el diagrama de transición de estados de la figura II.2.12.

Figura II.2.14.- Diagrama de trellis para el código CC(2,1,3)

Hemos visto que un código convolucional no tiene, en principio, una longitud determinada. En la práctica, los códigos convolucionales son truncados a una longitud fija y concatenados, como si se tratase de una secuencia de paquetes. El código debe terminarse anexando (K –1)k ceros al final de la secuencia de información, con el propósito de resetear el registro de desplazamiento, esto es, dejarlo en el estado todo- cero. Dado que esos ceros de cola no contienen información, la tasa del código (R) disminuye. Para mantener la tasa de código próxima a k/n, el periodo de truncamiento debe ser suficientemente largo.

Decodificación de códigos convolucionales

Tras la codificación, los bits son entrelazados y la señal es modulada para adaptarla a las características del canal de transmisión. Las características del canal introducirán distorsión en la señal. En el receptor, tras la demodulación y el desentrelazado, habrá que decodificar la señal. El decodificador convolucional opera buscando la secuencia de

84 entrada que provoca con más probabilidad la transición de estados del trellis que le ha llegado. Una vez identificada, esa secuencia es considerada la secuencia decodificada. Si el decodificador emplea el algoritmo de Viterbi, se tomarán en consideración todas los posibles caminos del trellis, y se evaluarán sus “distancias” respecto a la señal de entrada al decodificador. Se seleccionará el camino con menor distancia (o mayor similitud), y se regenerará la secuencia de información. Este método es conocido como decodificación de máxima verosimilitud (“maximum likelihood decoding”), en el sentido de que el más similar de todos los caminos del trellis es seleccionado. Ello resulta en una tasa de error mínima.

“Hard decision” VS “soft decision”

Se dice que el demodulador proporciona “decisiones duras” (“hard decisions”) al regenerar la secuencia de información si proporciona a su salida valores binarios (0 ó 1). En este caso, la métrica que debe emplearse en el algoritmo de Viterbi para comparar los caminos del trellis con el correspondiente a la señal recibida debe ser la distancia Hamming entre ambas secuencias. Se elegirá el camino que minimice la distancia Hamming.

Si, por el contrario, se emplean “decisiones suaves” (“soft decisions”), las variaciones de la señal de salida del ecualizador son muestreadas y cuantizadas. En este caso, el algoritmo de Viterbi deberá elegir el camino que maximice la “verosimilitud”.

Por ejemplo, para un canal AWGN una cuantización “dura” resulta en una pérdida de unos 2 dB en la relación Eb/No si la comparamos con una cuantización

infinitamente fina, mientras que con una cuantización de 8 bits la pérdida respecto a una cuantización infinitamente fina sería de 0.25 dB (Ref. [1]). De esta manera, pueden corregirse todavía más errores que con “decisiones duras”.

Los niveles de cuantización a la salida del modulador son una medida de la “confianza” de que esa muestra corresponda a un 1 o a un 0 lógico. Si suponemos un modulador que proporciona a su salida 8 niveles de cuantización con umbrales de decisión separados por 0.5 y con un nivel de señal transmitida igual a la unidad, tal como hemos representado en la figura II.2.15, un nivel ±4 indica una alta fiabilidad de que el bit sea un 1 lógico (+1), en el caso de +4, o un 0 lógico (-1), en el caso de –4, mientras que un nivel ±2 nos da menos confianza respecto a la polaridad del bit.

Figura II.2.15.- Cuantización de la señal recibida, con 8 niveles

Algoritmo de Viterbi

El algoritmo de Viterbi aprovecha el hecho de que el diagrama de trellis tiene siempre el mismo número de nodos en cada instante de tiempo (una vez pasado el transitorio inicial). Si la decodificación se hiciera basándose en la correlación de la señal recibida con todas las señales posibles, la carga computacional crecería

0 0.5 -0.5 1 1.5 -1 -1.5 -4 -3 -2 -1 1 2 3 4 Niveles de cuantización Umbrales de decisión

85 exponencialmente con la longitud de la secuencia recibida, mientras que utilizando el algoritmo de Viterbi, lo hará linealmente.

La complejidad del diagrama de trellis afectará a la carga computacional y a la memoria requerida por el algoritmo de Viterbi. En general, para un código CC(n,k,K) hay 2(K-1)k estados posibles en el codificador. En el decodificador Viterbi, todos los estados se representan en una columna de nodos en el trellis en cada instante de tiempo. A cada nodo del trellis llegan (desde los nodos del instante anterior) 2k caminos. De ellos, se seleccionará el de menor distancia Hamming (en el caso de “hard decision”) o mayor verosimilitud (para el caso de “soft decision”). Como consecuencia, hay 2k comparaciones de caminos en cada nodo, y se repiten para todos los 2(K-1)k nodos en cada instante de símbolo. En cada instante de símbolo hay un total de 2K transiciones posibles (2K ramas en el trellis). Esto hace que la carga computacional aumente exponencialmente con K y k, por lo que estos parámetros deben restringirse a valores relativamente pequeños.

El decodificador Viterbi selecciona y actualiza 2(K-1)k secuencias supervivientes, y las almacena en una memoria en cada instante. Al final de la secuencia codificada o paquete, el decodificador seleccionará el superviviente de mínima distancia, esto es, el de mínima distancia Hamming, si se emplea “hard decision decoding”, o el de medida de fiabilidad máxima, con “soft decision decoding”.

En la práctica, a veces los paquetes codificados son muy largos, y no es práctico almacenar las secuencias supervivientes completas antes de realizar una decisión, debido al retardo de decodificación tan grande que esto implicaría. En lugar de esto, sólo se almacenarán los L bits de información más recientes, para cada una de las secuencias supervivientes. Una vez que el superviviente con mínima distancia ha sido identificado, el símbolo asociado con ese camino L periodos antes es enviado a la salida como símbolo decodificado. Al describir los códigos convolucionales, se ha dicho que un símbolo codificado dependerá de los (K – 1) símbolos anteriores. Por tanto, la probabilidad conjunta entre símbolos tiende a ser inversamente proporcional a la separación temporal entre ellos. Entonces, se hará L suficientemente grande (normalmente L > 5K) para que la decodificación del símbolo actual tenga el menor impacto posible sobre la decodificación de los L símbolos anteriores.

Conociendo la estructura del diagrama de trellis para un código convolucional, el decodificador Viterbi del receptor comparará el símbolo recibido en cada instante con cada posible símbolo en el trellis. Como sabemos, todos los posibles símbolos codificados están asociados a ramas del trellis. Se asociará entonces una medida o peso a cada rama del trellis, en función de su distancia o similitud al símbolo recibido. Después, para cada nodo final de esas ramas, se calculará la longitud de todos los caminos que llegan a él y se elegirá como superviviente el de menor distancia, o mayor verosimilitud, descartándose el resto. Este cálculo se repite para cada instante de símbolo (nivel de “profundidad” en el trellis). Al final del algoritmo se elige el superviviente de menor distancia o mayor verosimilitud, a no ser que se almacenen solamente los L últimos símbolos, en cuyo caso, como hemos dicho en el párrafo anterior, se irán realizando decisiones desde mucho antes de llegar al final de la secuencia recibida.

Este método es óptimo en el sentido de que minimiza la probabilidad de que la secuencia entera sea errónea.

86 El diagrama de flujo del algoritmo, para el caso en que la decisión acerca de la secuencia decodificada se realiza al final, puede observarse en la figura II.2.16.

El máximo número de errores que el algoritmo de Viterbi puede corregir viene determinado por la distancia del código. Para una discusión acerca de las propiedades de distancia de los códigos convolucionales, remítanse a la Ref. [1] o a la Ref. [3].

Figura II.2.16.- Diagrama de flujo del algoritmo de Viterbi

Calcular la métrica para cada uno de los caminos entrante en los distintos estados del codificador.

Almacenar el camino superviviente y su métrica para cada uno de los estados.

Incrementar j en 1.

Calcular la métrica de cada camino entrante en cada uno de los estados añadiendo a la métrica del camino superviviente del estado origen la métrica de la rama entrante.

Identificar para cada estado el camino con menor distancia Hamming (o mayor verosimilitud) como el superviviente. j < longitud secuencia + (K-1) Fin NO SÍ

87 Ilustremos el funcionamiento del algoritmo con un ejemplo de “hard decision”. Supongamos que en el codificador CC(2,1,3) que usamos como ejemplo al describir la codificación convolucional, introducimos la secuencia mensaje

m=(10011)

Se obtendrá la palabra codificada

x=(11 10 11 11 01)

Suponiendo un canal binario simétrico introduciremos un error en el tercer bit. y=(11 11 11 11 01)

En la figura II.2.17 mostramos el resultado al llegar al segundo instante de símbolo. Quedan cuatro caminos supervivientes, uno para cada estado. Se incluye también la métrica de cada camino.

Figura II.2.17

En la parte izquierda de la figura II.2.18 se muestran los dos caminos que entran en cada nodo, con sus métricas respectivas. A la derecha pueden verse los caminos supervivientes.

Figura II.2.18

88

Figura II.2.19

En la figura II.2.20 ya se ha realizado la última iteración. Sobre ella decidiremos el camino de máxima semejanza, que nos da la secuencia de mensaje correcta.

Figura II.2.20

Además, aunque en este caso no afecta, podemos observar que en el tercer estado confluyen dos caminos con la misma métrica. ¿Cómo se decidiría el camino superviviente? La única manera de escoger uno de ellos es elegirlo al azar.

La figura II.2.21 nos muestra por fin el camino por el que se decantaría el algoritmo de Viterbi, que en este caso nos da la secuencia correcta:

89 Hemos conseguido corregir sin problemas un error en una secuencia. Distinto hubiese sido si hubiéramos tenido tres errores. El número máximo de errores corregibles viene determinado por la distancia mínima entre las palabras del código. En nuestro ejemplo esta distancia es dos.

Códigos convolucionales “pinchados” (PCC)

La técnica conocida como “puncturing” (“pinchazo”) consiste en eliminar periódicamente algunos de los bits de la salida de un codificador convolucional. La idea es obtener un código de alta tasa a partir de un código de tasa baja. Además, simplifica la decodificación de códigos con k > 1 por parte del algoritmo de Viterbi.

Consideremos, por ejemplo, un código de tasa alta R = 2/3. Para conseguir esa tasa podemos utilizar un código CC(3,2,2) o bien un código convolucional “pinchado” (PCC, “Punctured Convolutional Code”) PCC(2,1,3). En ambos casos, el número de estados posibles es 2(K-1)k = 4.

Sean los polinomios generadores del CC(3,2,2)

3 3 2 2 3 2 1 1 ) ( ) ( 1 ) ( z z z g z z z g z z z z g + + = + = + + + =

En este código, en cada instante de símbolo, entra en el codificador un símbolo de 2 bits, y se produce un símbolo de salida de 3 bits. La tasa de codificación R es por tanto 2/3. El número de posibles estados del código es 4, como hemos dicho. Cada transición de estados es activada por un símbolo de información de k = 2 bits. Los desplazamientos del registro son entonces de 2 bits en cada instante, lo que produce que existan 4 posibles transiciones desde cada nodo del trellis. Igualmente, son cuatro las ramas que llegan a cada nodo y por tanto son necesarias 3 comparaciones en cada nodo para hallar los supervivientes. Entonces, por cada n = 3 bits recibidos hay que realizar un total de 3· 4 = 12 comparaciones para decodificarlos.

En la figura II.2.22 hemos se ha representado la estructura del codificador, mientras que en la figura II.2.23 podemos ver una etapa del diagrama de trellis. En esa figura se ha representado el número de comparaciones a realizar en cada nodo.

Figura II.2.22.- Codificador CC(3,2,2)

+ + 1 2 k = 2 K = 2 + 3

90

Figura II.2.23.- Una etapa del diagrama de trellis del código CC(3,2,2)

La misma tasa de codificación puede conseguirse borrando bits periódicamente a