Está en la página 1de 9

Implementación de códigos de paridad de baja densidad en

lógica programable usando sumas y restas


Arnone L1, Gayoso C1, González C1, Castiñeira J2
1
Facultad de Ingeniería. UNMDP. Argentina. Laboratorio de Componentes Electrónicos
leoarn@fi.mdp.edu.ar
2 Facultad de Ingeniería. UNMDP. Argentina. Laboratorio de Radio Frecuencia
casti@fi.mdp.edu.ar

Resumen. En este trabajo se ilustra una modificación al algoritmo de decodificación de códigos de


paridad de baja densidad descriptos por D.J.C.MacKay y R.M.Neal[1]. Esta modificación permite
implementar estos códigos en forma muy sencilla en lógica programable, debido a que solo se
realizan operaciones de suma y resta en punto fijo, sin necesidad de realizar productos ni cocientes, ni
el uso de aritmética de punto flotante.

1 Introducción

Los códigos de paridad de baja densidad [4] son códigos de bloques lineales. En estos
códigos existe una matriz de generación G que convierte a los vectores de mensaje m en
vectores de código x . Asociada a la matriz G se encuentra la matriz de paridad H , la
cual cumple con la condición H o x = 0 para todo vector del código.
La construcción de estos códigos se basa en el diseño de la matriz H , cuya
característica más importante es que sus elementos son mayoritariamente ceros.
La codificación de las palabras de mensaje m se realiza por medio de la operación
matricial x = G T o m . Si el vector así generado, es transmitido por un canal afectado con
ruido aditivo n , el vector recibido resultará ser y = x + n .

2 Decodificación

La esencia del algoritmo de decodificación es encontrar el vector d , el cual es una


estimación del vector x , que cumpla con la condición:

Hod=0 (1)
La probabilidad de x está dada por:

∏p
xj
j (2)
j
donde:
1
p 1j = 2 ay j
(3)

1+ e σ2

p 0j = 1 − p 1j (4)

se supone el uso de un canal con entrada binaria ± a , ruido aditivo de varianza σ 2 = 1 y


donde y j es la salida del canal en el tiempo j

El algoritmo de decodificación [1][5] estima la probabilidad a posteriori de cada símbolo


en función de la señal recibida y de las características del canal. El algoritmo se describe
sobre la base de un grafo bipartito que se define de acuerdo a la matriz H en cual se grafica
la relación entre dos tipos de nodos, los nodos d ( j ) representativos de los símbolos de
transmisión (los bits de x ), y los nodos f (i ) representativos de las ecuaciones de paridad
que vinculan a los símbolos. Las filas de la matriz H describen a los símbolos que se
encuentran involucrados con una determinada ecuación de paridad.
De esta forma la conexión entre el nodo símbolo d ( j ) y el nodo paridad f (i ) existirá
siempre y cuando el elemento de la matriz H sea uno, es decir H ij = 1 . El estado de un
nodo de paridad depende de los nodos símbolos a los cuales está vinculado.
En este algoritmo cada nodo símbolo d ( j ) envía al nodo de paridad f (i ) la
x
información probabilística q ij basada en la información proporcionada por los otros nodos
de paridad relacionados con ese nodo símbolo, de que el nodo paridad se encuentre en el
estado x . Por otra parte, cada nodo de paridad f (i ) envía la información Rij a cada nodo
x

símbolo d ( j ) informando la probabilidad de que la paridad del nodo i se satisfaga,


suponiendo que el nodo símbolo se encuentra en el estado x , tomando la información
proporcionada por los otros nodos símbolos. Este proceso de intercambio de información
entre nodos es iterativo, se detiene si se cumple la condición dada por la ecuación (1), con
lo cual se procede a una decodificación o bien, si el número de iteraciones establecido es
alcanzado sin que se cumpla la condición anterior, con lo cual se habrá producido un error.

3 Algoritmo

Se basa en el supuesto que si un número z es menor que uno se lo puede poner como:

→ wz = ln( z )
− wz
z=e (5)

Este algoritmo consta de los siguientes pasos:


3.1 Inicialización

x x
Los valores de q ij se ajustan en un principio a la probabilidad a priori de los símbolos p j ,
0
que es la probabilidad de que el j ésimo símbolo sea x . En este caso, las variables q ij y

q 1ij son inicializadas con los valores p 0j y p 1j respectivamente.


x
Como p j es un número menor que uno, es posible poner:

p xj = e
− wp xj
→ wp xj = ln p xj ( ) (6)

q ijx = e
− wqijx
→ wq ijx = ln q ijx ( ) (7)

3.2 Paso horizontal

Se define δq ij como:

δq ij = q ij0 − q 1ij (8)

y como δq ij es menor que uno se tiene:

− wδqij − wq ij0 − wq1ij


e =e −e (9)

reorganizando este último término se tiene que:

δq ij = (− 1) ij e = (− 1) ij e
− wδqij − wq ij0 − wq ij1
−e
s s
(10)

donde:

s ij = 0 si wq ij0 ≤ wq 1ij (11)


o
s ij = 1 si wq ij0 > wq ij1 (12)

luego wδq ij se puede aproximar como[2][3]:


( 
wδqij = min wq ij0 , wq ij1 + ln1 − e

) wqij0 − wq1ij 
 (13)
 

esto puede ser escrito de la siguiente forma:

(
wδq ij = min wq ij0 , wq 1ij + f − wq ij0 − wq ij1 ) ( ) (14)

donde f − es una tabla de búsqueda con entradas wq ij0 y wq 1ij

Si N (i ) representa el conjunto de subíndices de todos los nodos símbolos d ( j ) que


participan del nodo de paridad f (i ) , mientras que N (i ) \ j indica la exclusión del nodo j
de ese conjunto, se calcula para cada i, j :

δ rij = ∏δ q
j ′∈ N (i )\ j
ij ′ (15)

y como esta productoria es menor que uno, se tiene:

∏( ) (− 1) = (− 1) ∏( )
− wδ rij − w δ qi j ′ ∑ s ij ′ − wδ q ij ′
δ rij = e =
s ij ′
e e (16)
j ′∈N i \ j j ′∈ N i \ j

entonces es posible obtener:

wδ rij = ∑ wδ q
j ′∈ N (i )\ j
ij ′ (17)

sδ rij = ∑ s ij ′
j ′∈ N (i )\ j
(18)

es decir:

δ rij0 = (− 1)
sδrij − wδ rij
e (19)

con los valores de δ rij se calcula el conjunto:

rij0 = 12 1 + δ rij ( ) (20)


y
(
rij1 = 12 1 − δ rij ) (21)

en forma logarítmica se puede expresar:

( ) 
ln rij0 = − wrij0 = ln1 + (− 1) δ ij e
s r − wδ rij 
 − ln (2 ) (22)
 
si sδ rij es par, se tiene:


wrij0 = ln(2) − ln1 + e

− wδ rij 
 = ln(2 ) − f + wδ rij − 0

( ) (23)

si sδ rij es impar, se tiene:


wrij0 = ln(2) + ln1 − e

− wδ rij 
 = ln(2 ) + f − wδ rij − 0

( ) (24)

(
donde f + wδ rij − 0 ) y ( )
f − wδ rij − 0 son tablas de búsqueda. De forma similar, si
sδ rij es par, se tiene:

wrij1 = ln(2) + ln1 − e

− wδ rij 
 = ln(2) + f − wδ rij − 0

( ) (25)

y si sδ rij es impar:

wrij1 = ln(2) − ln1 + e



− wδ rij 
 = ln(2) − f + wδ rij − 0

( ) (26)

3.3 Paso vertical

Para cada i y j con x = 0,1 se estiman:

q ijx = α ij p xj ∏( )r x
i ′j
i ′∈M j \ i
(27)

donde M ( j ) representa el conjunto de subíndices de todos los nodos paridad f (i ) que


participan del nodo símbolo d ( j ) . La constante α ij es elegida de forma tal que se cumpla
con:
q ij0 + q 1ij = 1 (28)

Para simplificar este cálculo se definen dos nuevas constantes:


const 1ij = p 0j ∏( )r 0
i ′j
i ′∈M j \ i
(29)

y
const 2 ij = p 1j ∏( )r 1
i ′j
i ′∈M j \ i
(30)

entonces aplicando logaritmos se obtiene:

ln (const 1ij ) = ln e


− wconst 1ij   − w p 0j   − wri0′j 

 = ln e
 
+ ∑ ln e
 i′∈M ( j )\ i 


(31)

con:
wconst 1ij = w p 0j + ∑( )wr
i ′∈M j \ i
0
i ′j (32)

de forma similar :

wconst 2 ij = w p 1j + ∑( )wr
i ′∈M j \ i
1
i ′j (33)

entonces:

(
α ij = 1 / const 1ij + const 2 ij ) (34)
por tanto:

const 1ij
q ij0 = (35)
const 1ij + const 2 ij

− wconst 1ij
− wq ij0 e
q ij0 = e = (36)
− wconst 1ij − wconst 2 ij
e +e

de esta ecuación es posible obtener wq ij0 como:

( )
wq ij0 = wconst1ij − min wconst1ij , wconst 2 ij + f + wconst1ij − wconst 2 ij ( ) (37)
(
donde f + wconst1ij − wconst 2 ij ) es una tabla de búsqueda. De forma similar:
const 2 ij
q ij1 = (38)
const 1ij + const 2 ij
se obtiene:

(
wq ij1 = wconst 2 ij − min wconst1ij , wconst 2 ij + f + wconst1 − wconst 2 ) ( ) (39)

0 1
luego se realiza una estimación a posteriori de las probabilidades q j y q j utilizando:

q xj = α j p xj ∏( r)
i ∈M j
x
ij (40)

donde α j se la elige de forma tal que se cumpla con:


q 0j + q 1j = 1 (41)
Igual que en el paso anterior, para facilitar el proceso se introducen dos constantes
auxiliares, observando que:

q xj = α j p xj ∏( r)
i∈M j
x
ij = α j p xj ∏( )r
i ′∈M j \ i
x
i ′j ⋅ rijx (42)

const 3 j = p 0j ∏( r)
i∈M j
0
ij = p 0j ∏( )r
i ′∈M j \ i
0
i ′j ⋅ rij0 = const 1ij ⋅ rij0 (43)

ln (const 3 j ) = ln e  − wconst 1ij  + ln e − wrij 


− wconst 3 j 
0

= ln e    (44)
     
por tanto:
wconst 3 j = wconst 1ij + wrij0 (45)
de forma similar:
wconst 4 j = wconst 2 ij + wrij1 (46)
entonces:
const 3 j
q 0j = (47)
const 3 j + const 4 j

− wconst 3 j
− wq 0j e
e = (48)
− wconst 3 j − wconst 4 j
e +e

y aplicando logaritmos se llega a:

( )
wq 0j = wconst 3 j − min wconst 3 j , wconst 4 j + f + wconst 3 j − wconst 4 j ( ) (49)

de idéntica manera se tiene:


const 4
q 1j = (50)
const 3 + const 4
entonces:

( ) (
wq 1j = wconst 4 j − min wconst 3 j , wconst 4 j + f + wconst 3 j − wconst 4 j ) (51)

por último se puede realizar una estimación para cada valor de símbolo d j usando:

)
( )
d j = max q xj (51)
es decir:
) )
d j = 0 si q 0j > q 1j sino d j = 1 (52)
y como:
− wq 0j − wq 1j
q 0j = e y q 1j = e (53)
esto es similar a poner:
d j = 0 si wq 0j < wq 1j , sino d j = 1 (54)

Implementación de las tablas de búsqueda:

La exactitud del algoritmo de decodificación está determinado por la aproximación que se


tiene en tablas de búsqueda f + y f − . Suponiendo que número máximo N que se desea
implementar en la tabla sea de b bits, es decir N = 2b y el incremento del la tabla sea
cada I valores, donde I = 2 a es una potencia de dos; la exactitud de la tabla queda
determinada entonces por el valor b − a utilizado.

Resultados:

Se implementó un decodificador que utiliza una matriz H de 64 filas por 32 columnas, la


cual permite trabajar con mensajes de 32 bits. En las tablas de búsqueda estudiadas se usó
un N de 16 bits, es decir b = 16 , por tanto N = 2b = 65536 .
Se generaron aleatoriamente 100 matrices H y de todas las obtenidas se eligió la que
presentó menor probabilidad de error binario, utilizando el algoritmo descripto por [1].
Luego con la matriz H seleccionada, se obtuvo la probabilidad de error en el
decodificador, utilizando la modificación propuesta para este algoritmo, con diferentes
valores de I en las tablas de búsqueda.
Como se ve en la figura 1 no se aprecian diferencias notables al utilizar tablas de
búsqueda con incrementos de I ≤ 26 = 64 . Es decir, es posible implementar un
decodificador bastante exacto, utilizando una tabla de búsqueda con I = 64 , la cual posee
2b −a = 216 − 6 = 1024 entradas.
Fig. 1. BER usando el algoritmo normal y el logaritmico

5 Conclusiones

En este trabajo se propone una modificación al algoritmo de decodificación de códigos de


paridad de baja densidad descripto por D.J.C.MacKay y R.M.Neal[1]. Esto permite
utilizando solo dos tablas de búsqueda y operaciones de suma y restas construir
decodificadores en lógica programable de muy baja complejidad, ya que no es necesario
utilizar aritmética de punto flotante, ni realizar producto ni cocientes.

Referencias
1. D.J.C.MacKay, R.M.Neal. Near Shannon limit performance of low density parity check
codes. Electronics Letters. 13th March 1997, Vol.33, N°6.
2. J.P. Woodard, L. Hanzo. Comparative Study of Turbo Decoding Techniques. IEEE
Transaction on Vehicular Technology. Nov 2000, Vol 49, N°6
3. T. Bhatt, K. Narayanan, N. Kehtarnavaz. Fixed Point DSP Implementation of Low-
Density Parity Check Codes. Proc IEEE DSP2000, Hunt, Tx, USA, Oct 15-18, 2000.
4. R. G. Gallager. Low Density Density Parity Check Codes. IRE Trans. Information
Theory, Vol. IT-8, N°1, pp 21-28, January 1962.
5. D.J.C.MacKay, R.M.Neal. Good Error-Correcting Codes based on Very Sparse Matrices.
Available from http://www.inference.phy.cam.ac.uk/mackay/CodesGallager.html

También podría gustarte