Saltar al contenido
El bit perdido
Newsletter

Lección 11 de 11

Corregir errores en Reed-Solomon

Localiza y corrige errores en Reed-Solomon con el sistema lineal de Berlekamp-Welch, mezcla errores y borrones y usa el entrelazado contra las ráfagas.

Borrador: pendiente de que lo revise el autor. Esta página no aparece en Google.

Al terminar sabrás:

  • Explicar la decodificación de errores como buscar el polinomio que más coincide
  • Plantear y comprobar el sistema de Berlekamp-Welch para un error
  • Aplicar la regla 2e + b ≤ n − k a errores y borrones mezclados
  • Saber qué hace el entrelazado con las ráfagas

Si sabes multiplicar matrices, resolver un sistema de ecuaciones lineales y operar con polinomios (sumar, multiplicar, dividir), puedes seguirlo. Lo demás (aritmética módulo 2, subespacios, cuerpos finitos) se explica sobre la marcha.

En la lección anterior recuperamos borrones: sabíamos qué símbolos faltaban y bastaba interpolar con los que quedaban. Con los errores es más difícil, porque nadie avisa de dónde están. Un lector de QR no sabe qué módulos ha manchado el café: lee una palabra, algunos símbolos son falsos y tiene que descubrir cuáles. Veremos cómo se hace con un sistema lineal, y cerraremos el curso.

La idea

Si la palabra recibida rr tiene como mucho tt errores, el polinomio correcto coincide con rr en al menos n−tn-t posiciones. Y es el único que lo hace cuando 2t≤n−k2t \le n-k. Dos polinomios distintos de grado menor que kk coinciden en como mucho k−1k-1 posiciones. Si los dos coincidieran con rr en n−tn-t posiciones, coincidirían entre ellos en al menos n−2t≥kn-2t \ge k de ellas: imposible.

Seguimos con el ejemplo hilo: el código [7,3,5][7,3,5] sobre F8\mathbb{F}_8, el mensaje f(x)=1+αx+x2f(x) = 1+\alpha x+x^2 y su palabra c=(α,1,α2,α,α2,α5,α5)c = (\alpha, 1, \alpha^2, \alpha, \alpha^2, \alpha^5, \alpha^5). El canal cambia la posición 2 (punto α\alpha): llega α5\alpha^5 en vez de 11. Recibimos

r=(α, α5, α2, α, α2, α5, α5).r = (\alpha,\ \alpha^5,\ \alpha^2,\ \alpha,\ \alpha^2,\ \alpha^5,\ \alpha^5).

Buscamos un polinomio de grado menor que 3 que coincida con rr en al menos 6 posiciones. Una forma ingenua es probar ternas de posiciones e interpolar. Con las posiciones 1, 2 y 3 sale α5x2+x+α2\alpha^5x^2+x+\alpha^2, que solo coincide con rr en esas 3: descartado. Con 1, 3 y 4 sale ff, que coincide en 6: es el bueno. En un código [255,223][255,223] habría que probar un número astronómico de combinaciones: hace falta algo mejor.

Berlekamp-Welch: el error como incógnita

El truco es convertir la posición del error en una incógnita más. Si el error está en el punto aea_e (que no conocemos), llamamos localizador de errores a

E(x)=x−ae,E(x) = x - a_e,

que se anula justo ahí. Y definimos Q(x)=E(x) f(x)Q(x) = E(x)\,f(x), de grado como mucho 3. Entonces, en cada posición ii, con punto aia_i,

Q(ai)=ri E(ai).Q(a_i) = r_i\,E(a_i).

¿Por qué? Si la posición es correcta, ri=f(ai)r_i = f(a_i) y es la definición de QQ. Si es la del error, los dos lados valen 0, porque E(ae)=0E(a_e) = 0. El localizador «tapa» el error.

Lo bueno es que esas ecuaciones son lineales. Las incógnitas son los coeficientes de Q(x)=q0+q1x+q2x2+q3x3Q(x) = q_0+q_1x+q_2x^2+q_3x^3 y el de E(x)=x+e0E(x) = x + e_0 (en F8\mathbb{F}_8, −ae=ae-a_e = a_e). La ecuación de la posición ii queda

q0+q1ai+q2ai2+q3ai3+ri e0=ri ai.q_0 + q_1a_i + q_2a_i^2 + q_3a_i^3 + r_i\,e_0 = r_i\,a_i.

Son 7 ecuaciones con 5 incógnitas. Con tt errores, EE tiene grado tt y QQ grado menor que k+tk+t: salen k+2tk+2t incógnitas, que no pasan de nn porque 2t≤n−k2t \le n-k.

Ejemplo resuelto: un error con Berlekamp-Welch

Con los siete puntos 1,α,…,α61, \alpha, \dots, \alpha^6 y los valores de rr (usando α7=1\alpha^7 = 1), la matriz ampliada del sistema, con columnas q0,q1,q2,q3,e0q_0, q_1, q_2, q_3, e_0 y el término independiente, es:

(1111αα1αα2α3α5α61α2α4α6α2α41α3α6α2αα41α4αα5α2α61α5α3αα5α31α6α5α4α5α4)\left(\begin{array}{ccccc|c} 1 & 1 & 1 & 1 & \alpha & \alpha\\ 1 & \alpha & \alpha^2 & \alpha^3 & \alpha^5 & \alpha^6\\ 1 & \alpha^2 & \alpha^4 & \alpha^6 & \alpha^2 & \alpha^4\\ 1 & \alpha^3 & \alpha^6 & \alpha^2 & \alpha & \alpha^4\\ 1 & \alpha^4 & \alpha & \alpha^5 & \alpha^2 & \alpha^6\\ 1 & \alpha^5 & \alpha^3 & \alpha & \alpha^5 & \alpha^3\\ 1 & \alpha^6 & \alpha^5 & \alpha^4 & \alpha^5 & \alpha^4 \end{array}\right)

Por ejemplo, la fila 4 es el punto α3\alpha^3: (α3)2=α6(\alpha^3)^2 = \alpha^6, (α3)3=α9=α2(\alpha^3)^3 = \alpha^9 = \alpha^2, r4=αr_4 = \alpha y r4a4=α4r_4a_4 = \alpha^4.

Resolver. Gauss, como con cualquier sistema, da una única solución:

q0=α,q1=α6,q2=0,q3=1,e0=α.q_0 = \alpha,\quad q_1 = \alpha^6,\quad q_2 = 0,\quad q_3 = 1,\quad e_0 = \alpha.

Es decir, Q(x)=x3+α6x+αQ(x) = x^3 + \alpha^6x + \alpha y E(x)=x+αE(x) = x + \alpha. Puedes comprobar que cumple las siete ecuaciones Q(ai)=riE(ai)Q(a_i) = r_iE(a_i):

posiciónaia_irir_iE(ai)E(a_i)riE(ai)r_iE(a_i)Q(ai)Q(a_i)
111α\alphaα3\alpha^3α4\alpha^4α4\alpha^4
2α\alphaα5\alpha^5000000
3α2\alpha^2α2\alpha^2α4\alpha^4α6\alpha^6α6\alpha^6
4α3\alpha^3α\alpha11α\alphaα\alpha
5α4\alpha^4α2\alpha^2α2\alpha^2α4\alpha^4α4\alpha^4
6α5\alpha^5α5\alpha^5α6\alpha^6α4\alpha^4α4\alpha^4
7α6\alpha^6α5\alpha^5α5\alpha^5α3\alpha^3α3\alpha^3

Dónde está el error. E(x)=x+αE(x) = x+\alpha se anula en α\alpha, el punto de la posición 2.

El mensaje. Dividimos QQ entre EE:

  1. x2⋅(x+α)=x3+αx2x^2\cdot(x+\alpha) = x^3+\alpha x^2. Queda αx2+α6x+α\alpha x^2 + \alpha^6x + \alpha.
  2. αx⋅(x+α)=αx2+α2x\alpha x\cdot(x+\alpha) = \alpha x^2 + \alpha^2x. Queda (α6+α2)x+α=x+α(\alpha^6+\alpha^2)x + \alpha = x + \alpha.
  3. 1⋅(x+α)=x+α1\cdot(x+\alpha) = x+\alpha. Resto 0.

El cociente es f(x)=x2+αx+1f(x) = x^2 + \alpha x + 1: el mensaje (1,α,1)(1, \alpha, 1). El símbolo correcto de la posición 2 es f(α)=1f(\alpha) = 1, y el error valía α5−1=α4\alpha^5 - 1 = \alpha^4.

Un detalle: si hay menos errores de los previstos, EE puede salir con raíces de más (posiciones correctas), pero el cociente Q/EQ/E siempre es el polinomio del mensaje.

En la práctica: Berlekamp-Massey y Euclides

En un código [255,223][255,223] con t=16t = 16, Berlekamp-Welch plantea un sistema de 255 incógnitas, y Gauss es caro. Los decodificadores reales usan Berlekamp-Massey o el algoritmo de Euclides: parten del síndrome (el de las lecciones 6 y 8) y calculan el localizador con un número de operaciones que crece como t2t^2. Después buscan sus raíces y los valores de los errores. La demo de abajo usa Berlekamp-Massey.

Errores y borrones a la vez

Como vimos en la lección anterior, un borrón gasta un símbolo de redundancia y un error, dos: se corrigen ee errores y bb borrones si 2e+b≤n−k2e + b \le n-k. Las posiciones borradas simplemente se quitan; las que quedan forman un código de Reed-Solomon más corto.

Ejemplo. En el [7,3,5][7,3,5] caben e=1e=1 y b=2b=2. El canal borra las posiciones 1 y 7 de cc y cambia la 4: llega α4\alpha^4 en vez de α\alpha. Quedan las posiciones 2 a 6, con valores (1,α2,α4,α2,α5)(1, \alpha^2, \alpha^4, \alpha^2, \alpha^5): es un código de longitud 5 con k=3k=3 y d=3d = 3, que corrige 1 error. Buscamos un polinomio de grado menor que 3 que coincida en al menos 4 de esas 5 posiciones. De las 10 ternas posibles, las 4 que no usan la posición 4 dan ff, que coincide en las posiciones 2, 3, 5 y 6. Las 6 que la usan dan polinomios que solo coinciden en sus 3 puntos. El error está en la posición 4. (Berlekamp-Welch también vale aquí: basta quitar las ecuaciones de las posiciones borradas.)

Ráfagas y entrelazado

Un arañazo estropea símbolos seguidos, y un código que corrige tt errores falla si caen más de tt en una misma palabra. El entrelazado reparte la ráfaga:

  1. Escribe ss palabras código una debajo de otra, como filas de una tabla.
  2. Transmite la tabla por columnas.
  3. El receptor la reordena y decodifica cada fila.

Símbolos seguidos en la transmisión van a filas distintas. Una ráfaga de hasta s⋅ts\cdot t símbolos deja a cada fila con tt errores como mucho.

Pruébalo

En la demo, raya la imagen y pulsa corregir: las rayas cuentan como errores. Sube el daño hasta que falle. Luego repite con la casilla «Sé dónde he dañado» activada: las rayas pasan a ser borrones y el decodificador aguanta aproximadamente el doble. El ruido cuenta siempre como errores.

1. Elige el código
2. Ajusta la redundancia
3. Daña la imagen

Raya con el ratón (o el dedo) sobre la imagen recibida, o sube el ruido. Luego pulsa Corregir.

  1. Raya con el ratón (o el dedo) la imagen del centro, la recibida.
  2. Pulsa Corregir: el ordenador intenta reconstruirla con el código elegido.
  3. Busca el límite: raya cada vez más y vuelve a corregir. Si rayas demasiado, el código ya no puede arreglarlo todo y verás en rojo lo que se ha perdido.

Reed-Solomon RS(255, 191)

Tasa 74,9 % · corrige 32 bytes erróneos por palabra · 1030 palabras

Original
Recibida, sin corregir ← raya aquí
Corregida
Ver el código

Raya la imagen y pulsa «Corregir» para ver aquí una palabra antes y después del daño.

Polinomio generador de RS(255, 191)

g(x) = (x − α⁰)(x − α¹)···(x − α^63) sobre GF(256), con α = 2 y el polinomio x⁸ + x⁴ + x³ + x² + 1. Coeficientes como potencias de α, del término de mayor grado al independiente:

1 · α^45 · α^51 · α^175 · α^9 · α^7 · α^158 · α^159 · α^49 · α^68 · α^119 · α^92 · α^123 · α^177 · α^204 · α^187 · α^254 · α^200 · α^78 · α^141 · α^149 · α^119 · α^26 · α^127 · α^53 · α^160 · α^93 · α^199 · α^212 · α^29 · α^24 · α^145 · α^156 · α^208 · α^150 · α^218 · α^209 · α^4 · α^216 · α^91 · α^47 · α^184 · α^146 · α^47 · α^140 · α^195 · α^195 · α^125 · α^242 · α^238 · α^63 · α^99 · α^108 · α^140 · α^230 · α^242 · α^31 · α^204 · α^11 · α^178 · α^243 · α^217 · α^156 · α^213 · α^231

Abrir la herramienta a pantalla completa

Ejercicios

Ejercicio 1

Un código [255,223][255,223] sobre F256\mathbb{F}_{256} corrige t=16t = 16 errores por palabra. Se entrelazan s=5s = 5 palabras (escritas en filas y transmitidas por columnas). ¿Cuántos bytes seguidos puede destruir una ráfaga sin que falle la decodificación?

Ver la solución

En la transmisión por columnas, los bytes van pasando por las filas 1, 2, 3, 4, 5, 1, 2… Una ráfaga de LL bytes seguidos toca cada fila como mucho ⌈L/5⌉\lceil L/5 \rceil veces (L/5L/5 redondeado hacia arriba). Para que ninguna fila pase de 16 errores hace falta ⌈L/5⌉≤16\lceil L/5 \rceil \le 16, es decir, L≤80L \le 80.

Sin entrelazar, solo aguantaría 16: se multiplica por 5 sin añadir redundancia.

Ejercicio 2

Con el mismo mensaje f(x)=1+αx+x2f(x) = 1+\alpha x+x^2, ahora llega r=(α, 1, α2, α, α4, α5, α5)r = (\alpha,\ 1,\ \alpha^2,\ \alpha,\ \alpha^4,\ \alpha^5,\ \alpha^5). El sistema de Berlekamp-Welch da E(x)=x+α4E(x) = x + \alpha^4 y Q(x)=x3+α2x2+α4x+α4Q(x) = x^3 + \alpha^2x^2 + \alpha^4x + \alpha^4. ¿En qué posición está el error? Divide QQ entre EE y di cuánto valía el error.

Ver la solución

EE se anula en α4\alpha^4, el punto de la posición 5. Ahí está el error.

División de QQ entre E=x+α4E = x+\alpha^4:

  1. x2⋅(x+α4)=x3+α4x2x^2\cdot(x+\alpha^4) = x^3 + \alpha^4x^2. Queda (α2+α4)x2+α4x+α4=αx2+α4x+α4(\alpha^2+\alpha^4)x^2 + \alpha^4x + \alpha^4 = \alpha x^2 + \alpha^4x + \alpha^4, porque α2+(α2+α)=α\alpha^2 + (\alpha^2+\alpha) = \alpha.
  2. αx⋅(x+α4)=αx2+α5x\alpha x\cdot(x+\alpha^4) = \alpha x^2 + \alpha^5x. Queda (α4+α5)x+α4=x+α4(\alpha^4+\alpha^5)x + \alpha^4 = x + \alpha^4, porque (α2+α)+(α2+α+1)=1(\alpha^2+\alpha)+(\alpha^2+\alpha+1) = 1.
  3. 1⋅(x+α4)=x+α41\cdot(x+\alpha^4) = x+\alpha^4. Resto 0.

El cociente es x2+αx+1=f(x)x^2 + \alpha x + 1 = f(x). El símbolo correcto de la posición 5 es f(α4)=α2f(\alpha^4) = \alpha^2 (está en cc), y llegó α4\alpha^4. El error valía α4−α2=(α2+α)+α2=α\alpha^4 - \alpha^2 = (\alpha^2+\alpha) + \alpha^2 = \alpha.

Comprobación de la ecuación de la posición 5: E(α4)=0E(\alpha^4) = 0 y Q(α4)=0Q(\alpha^4) = 0, así que se cumple valga lo que valga r5r_5.

En resumen

  • Con tt errores, el polinomio correcto es el único de grado menor que kk que coincide con lo recibido en al menos n−tn-t posiciones, si 2t≤n−k2t \le n-k.
  • Berlekamp-Welch añade el localizador EE como incógnita: las ecuaciones Q(ai)=riE(ai)Q(a_i) = r_iE(a_i) son lineales, EE señala el error y f=Q/Ef = Q/E.
  • En la práctica se usan Berlekamp-Massey o Euclides, que parten del síndrome.
  • Errores y borrones se mezclan con la regla 2e+b≤n−k2e+b \le n-k.
  • El entrelazado reparte una ráfaga entre varias palabras.

Y ahora, ¿qué?

Aquí termina el curso. Has visto qué es un código, los cuerpos finitos, los códigos lineales, la matriz generatriz y la de paridad, los errores y los borrones, el síndrome, los códigos cíclicos y Reed-Solomon, con su decodificación. Para seguir:

  • Códigos BCH: los cíclicos con distancia garantizada; Reed-Solomon es un caso particular.
  • Códigos LDPC: matrices de paridad muy dispersas, decodificación iterativa, y muy cerca del límite teórico del canal (la capacidad de Shannon).
  • Códigos polares: alcanzan esa capacidad de forma asintótica, cuando la longitud tiende a infinito, en los canales binarios simétricos sin memoria.
  • Códigos cuánticos: la misma idea de redundancia aplicada a cúbits, necesaria para construir ordenadores cuánticos que funcionen.

Para profundizar, Essential Coding Theory (libre) sigue con la parte algebraica, y el libro de MacKay (también libre) con LDPC y la teoría de la información. Tienes el mapa completo en la guía de códigos correctores, y puedes volver a Raya y corrige cuando quieras.

Pruébalo: Raya y corrige

Para profundizar