stringtranslate.com

Código BCH

En teoría de codificación , los códigos de Bose–Chaudhuri–Hocquenghem ( códigos BCH ) forman una clase de códigos de corrección de errores cíclicos que se construyen utilizando polinomios sobre un cuerpo finito (también llamado cuerpo de Galois ). Los códigos BCH fueron inventados en 1959 por el matemático francés Alexis Hocquenghem , e independientemente en 1960 por Raj Chandra Bose y DK Ray-Chaudhuri . [1] [2] [3] El nombre Bose–Chaudhuri–Hocquenghem (y el acrónimo BCH ) surge de las iniciales de los apellidos de los inventores (por error, en el caso de Ray-Chaudhuri).

Una de las características clave de los códigos BCH es que durante el diseño del código, existe un control preciso sobre el número de errores de símbolos que puede corregir el código. En particular, es posible diseñar códigos BCH binarios que puedan corregir múltiples errores de bit. Otra ventaja de los códigos BCH es la facilidad con la que se pueden decodificar, es decir, mediante un método algebraico conocido como decodificación de síndromes . Esto simplifica el diseño del decodificador para estos códigos, utilizando hardware electrónico pequeño y de bajo consumo.

Los códigos BCH se utilizan en aplicaciones como comunicaciones por satélite, [4] reproductores de discos compactos , DVD , unidades de disco , unidades flash USB , unidades de estado sólido , [5] y códigos de barras bidimensionales .

Definición e ilustración

Códigos BCH primitivos de sentido estricto

Dado un número primo q y una potencia prima q m con números enteros positivos m y d tales que dq m − 1 , se construye un código BCH primitivo de sentido estrecho sobre el campo finito (o campo de Galois) GF( q ) con longitud de código n = q m − 1 y distancia al menos d mediante el siguiente método.

Sea α un elemento primitivo de GF( q m ) . Para cualquier entero positivo i , sea m i ( x ) el polinomio mínimo con coeficientes en GF( q ) de α i . El polinomio generador del código BCH se define como el mínimo común múltiplo g ( x ) = mcm( m 1 ( x ),…, m d − 1 ( x )) . Se puede ver que g ( x ) es un polinomio con coeficientes en GF( q ) y divide a x n − 1 . Por lo tanto, el código polinomial definido por g ( x ) es un código cíclico.

Ejemplo

Sea q = 2 y m = 4 (por lo tanto n = 15 ). Consideraremos diferentes valores de d para GF(16) = GF(2 4 ) basados ​​en el polinomio reductor z 4 + z + 1 , utilizando el elemento primitivo α ( z ) = z . Hay catorce polinomios mínimos m i ( x ) con coeficientes en GF(2) que satisfacen

Los polinomios mínimos son

El código BCH tiene el polinomio generador

Tiene una distancia de Hamming mínima de al menos 3 y corrige hasta un error. Como el polinomio generador es de grado 4, este código tiene 11 bits de datos y 4 bits de suma de comprobación. También se denota como: código BCH (15, 11) .

El código BCH tiene el polinomio generador

Tiene una distancia de Hamming mínima de al menos 5 y corrige hasta dos errores. Como el polinomio generador es de grado 8, este código tiene 7 bits de datos y 8 bits de suma de comprobación. También se denota como: código BCH (15, 7) .

El código BCH tiene el polinomio generador

Tiene una distancia de Hamming mínima de al menos 7 y corrige hasta tres errores. Dado que el polinomio generador es de grado 10, este código tiene 5 bits de datos y 10 bits de suma de comprobación. También se denota como: código BCH (15, 5) . (Este polinomio generador en particular tiene una aplicación en el mundo real, en la "información de formato" del código QR ).

El código BCH con y superior tiene el polinomio generador

Este código tiene una distancia mínima de Hamming de 15 y corrige 7 errores. Tiene 1 bit de datos y 14 bits de suma de comprobación. También se denota como: código BCH (15, 1) . De hecho, este código tiene solo dos palabras de código: 000000000000000 y 111111111111111 (un código de repetición trivial ).

Códigos generales del BCH

Los códigos BCH generales difieren de los códigos BCH primitivos de sentido estricto en dos aspectos.

En primer lugar, se puede relajar el requisito de que sea un elemento primitivo . Al relajar este requisito, la longitud del código cambia de al orden del elemento .

En segundo lugar, las raíces consecutivas del polinomio generador pueden tener su origen en lugar de

Definición. Fija un cuerpo finito donde es una potencia prima. Elige números enteros positivos tales que y es el orden multiplicativo de módulo

Como antes, sea una raíz primitiva de la unidad en y sea el polinomio mínimo sobre de para todos. El polinomio generador del código BCH se define como el mínimo común múltiplo.

Nota: si como en la definición simplificada, entonces es 1, y el orden del módulo es Por lo tanto, la definición simplificada es de hecho un caso especial de la general.

Casos especiales

El polinomio generador de un código BCH tiene coeficientes de En general, un código cíclico sobre con como polinomio generador se llama código BCH sobre El código BCH sobre y polinomio generador con potencias sucesivas de como raíces es un tipo de código Reed-Solomon donde el alfabeto del decodificador (síndromes) es el mismo que el alfabeto del canal (polinomio de datos y generador), todos los elementos de . [6] El otro tipo de código Reed Solomon es un código Reed Solomon de vista original que no es un código BCH.

Propiedades

El polinomio generador de un código BCH tiene un grado como máximo de . Además, si y , el polinomio generador tiene un grado como máximo de .

Un código BCH tiene una distancia de Hamming mínima de al menos .

Un código BCH es cíclico.

Codificación

Dado que cualquier polinomio que sea múltiplo del polinomio generador es una palabra de código BCH válida, la codificación BCH es simplemente el proceso de encontrar algún polinomio que tenga al generador como factor.

El código BCH en sí no es prescriptivo en cuanto al significado de los coeficientes del polinomio; conceptualmente, la única preocupación de un algoritmo de decodificación BCH es encontrar la palabra de código válida con la distancia de Hamming mínima respecto de la palabra de código recibida. Por lo tanto, el código BCH puede implementarse como un código sistemático o no, dependiendo de cómo elija el implementador incrustar el mensaje en el polinomio codificado.

Codificación no sistemática: el mensaje como factor

La forma más sencilla de encontrar un polinomio que sea múltiplo del generador es calcular el producto de un polinomio arbitrario por el generador. En este caso, el polinomio arbitrario se puede elegir utilizando los símbolos del mensaje como coeficientes.

Como ejemplo, considere el polinomio generador , elegido para su uso en el código binario BCH (31, 21) utilizado por POCSAG y otros. Para codificar el mensaje de 21 bits {101101110111101111101}, primero lo representamos como un polinomio sobre :

Luego, calcula (también sobre ):

Por lo tanto, la palabra clave transmitida es {1100111010010111101011101110101}.

El receptor puede utilizar estos bits como coeficientes y, después de la corrección de errores para garantizar una palabra de código válida, puede volver a calcular

Codificación sistemática: El mensaje como prefijo

Un código sistemático es aquel en el que el mensaje aparece textualmente en algún lugar dentro de la palabra clave. Por lo tanto, la codificación sistemática BCH implica primero incrustar el polinomio del mensaje dentro del polinomio de la palabra clave y luego ajustar los coeficientes de los términos restantes (que no son mensajes) para garantizar que sea divisible por .

Este método de codificación aprovecha el hecho de que al restar el resto de un dividendo se obtiene un múltiplo del divisor. Por lo tanto, si tomamos nuestro polinomio de mensaje como antes y lo multiplicamos por (para "desplazar" el mensaje fuera del camino del resto), podemos usar la división euclidiana de polinomios para obtener:

Aquí, vemos que es una palabra de código válida. Como siempre es de grado menor que (que es el grado de ), podemos restarlo de forma segura sin alterar ninguno de los coeficientes del mensaje, por lo tanto, tenemos nuestro como

Además (es decir, con códigos BCH binarios), este proceso es indistinguible de la adición de una verificación de redundancia cíclica , y si se utiliza un código BCH binario sistemático solo para fines de detección de errores, vemos que los códigos BCH son solo una generalización de las matemáticas de las verificaciones de redundancia cíclica .

La ventaja de la codificación sistemática es que el receptor puede recuperar el mensaje original descartando todo lo que esté después de los primeros coeficientes, después de realizar la corrección de errores.

Descodificación

Existen muchos algoritmos para decodificar códigos BCH. Los más comunes siguen este esquema general:

  1. Calcular los síndromes s j para el vector recibido
  2. Determinar el número de errores t y el polinomio localizador de errores Λ(x) a partir de los síndromes
  3. Calcular las raíces del polinomio de ubicación de error para encontrar las ubicaciones de error X i
  4. Calcular los valores de error Y i en esas ubicaciones de error
  5. Corrija los errores

Durante algunos de estos pasos, el algoritmo de decodificación puede determinar que el vector recibido tiene demasiados errores y no se puede corregir. Por ejemplo, si no se encuentra un valor apropiado de t , la corrección fallará. En un código truncado (no primitivo), la ubicación de un error puede estar fuera de rango. Si el vector recibido tiene más errores de los que el código puede corregir, el decodificador puede producir sin saberlo un mensaje aparentemente válido que no es el que se envió.

Calcular los síndromes

El vector recibido es la suma de la palabra de código correcta y un vector de error desconocido. Los valores del síndrome se forman considerando como un polinomio y evaluándolo en Por lo tanto, los síndromes son [7]

Para a

Dado que son los ceros de de los cuales es un múltiplo, examinar los valores del síndrome aísla así el vector de error para que uno pueda comenzar a resolverlo.

Si no hay ningún error, para todos los síndromes son todos cero, entonces se realiza la decodificación.

Calcular el polinomio de ubicación del error

Si hay síndromes distintos de cero, entonces hay errores. El decodificador debe determinar cuántos errores hay y dónde se encuentran.

Si hay un solo error, escríbalo como donde es la ubicación del error y es su magnitud. Entonces los dos primeros síndromes son

Por lo que juntos nos permiten calcular y proporcionar cierta información (determinándola completamente en el caso de los códigos Reed-Solomon).

Si hay dos o más errores,

No resulta inmediatamente obvio cómo empezar a resolver los síndromes resultantes de las incógnitas y

El primer paso es encontrar, compatible con los síndromes calculados y con el mínimo polinomio localizador posible:

Tres algoritmos populares para esta tarea son:

  1. Algoritmo de Peterson-Gorenstein-Zierler
  2. Algoritmo de Berlekamp-Massey
  3. Algoritmo euclidiano de Sugiyama

Algoritmo de Peterson-Gorenstein-Zierler

El algoritmo de Peterson es el paso 2 del procedimiento generalizado de decodificación del BCH. El algoritmo de Peterson se utiliza para calcular los coeficientes polinómicos localizadores de errores de un polinomio.

Ahora el procedimiento del algoritmo de Peterson–Gorenstein–Zierler. [8] Esperemos que tengamos al menos 2 síndromes t s c , …, s c +2 t −1 . Sea v  =  t .

  1. Comience generando la matriz con elementos que son valores del síndrome
  2. Generar un vector con elementos
  3. Sea los coeficientes polinómicos desconocidos, que se dan por
  4. Formar la ecuación matricial
  5. Si el determinante de la matriz no es cero, entonces podemos encontrar una inversa de esta matriz y resolver los valores de los valores desconocidos.
  6. Si luego sigue
     si entonces Declarar un polinomio localizador de errores vacío Detener el procedimiento de Peterson. fin colocar
    Continúe desde el principio de la decodificación de Peterson haciendo más pequeñas
  7. Después de tener valores de , tienes el polinomio localizador de errores.
  8. Detener el procedimiento de Peterson.

Polinomio localizador de error de factor

Ahora que ya tienes el polinomio, sus raíces se pueden encontrar en la forma mediante fuerza bruta, por ejemplo, utilizando el algoritmo de búsqueda de Chien . Las potencias exponenciales del elemento primitivo darán como resultado las posiciones en las que se producen errores en la palabra recibida; de ahí el nombre de polinomio "localizador de errores".

Los ceros de Λ( x ) son α i 1 , …, α i v .

Calcular valores de error

Una vez que se conocen las ubicaciones de los errores, el siguiente paso es determinar los valores de error en esas ubicaciones. Los valores de error se utilizan para corregir los valores recibidos en esas ubicaciones y recuperar la palabra clave original.

En el caso del BCH binario (con todos los caracteres legibles), esto es trivial; basta con invertir los bits de la palabra recibida en estas posiciones y tendremos la palabra de código corregida. En el caso más general, los pesos de error se pueden determinar resolviendo el sistema lineal.

Algoritmo de Forney

Sin embargo, existe un método más eficiente conocido como el algoritmo de Forney .

Dejar

Y el polinomio evaluador de error [9]

Finalmente:

dónde

Entonces, si los síndromes pudieran explicarse mediante una palabra de error, que podría ser distinta de cero solo en las posiciones , entonces los valores de error son

Para los códigos BCH de sentido estricto, c = 1, por lo que la expresión se simplifica a:

Explicación del cálculo del algoritmo de Forney

Se basa en la interpolación de Lagrange y técnicas de funciones generadoras .

Consideremos y, por el bien de la simplicidad, supongamos que para y para Entonces

Queremos calcular incógnitas y podríamos simplificar el contexto eliminando los términos. Esto nos lleva al polinomio evaluador de errores

Gracias a que tenemos

Gracias al truco de interpolación de Lagrange, la suma se degenera en un solo sumando para

Para obtenerlo, simplemente debemos deshacernos del producto. Podríamos calcular el producto directamente a partir de las raíces ya calculadas de pero podríamos usar una forma más simple.

Como derivada formal

obtenemos nuevamente solo un sumando en

Así que finalmente

Esta fórmula es ventajosa cuando se calcula la derivada formal de la forma

flexible:

dónde

Descodificación basada en algoritmo euclidiano extendido

Un proceso alternativo para encontrar tanto el polinomio Λ como el polinomio localizador de errores se basa en la adaptación de Yasuo Sugiyama del algoritmo euclidiano extendido . [10] La corrección de caracteres ilegibles también podría incorporarse fácilmente al algoritmo.

Sean posiciones de caracteres ilegibles. Se crea un polinomio que localice estas posiciones. Se establecen los valores de las posiciones ilegibles en 0 y se calculan los síndromes.

Como ya hemos definido para la fórmula de Forney, sea

Ejecutemos el algoritmo euclidiano extendido para localizar el mínimo común divisor de polinomios y El objetivo no es encontrar el mínimo común divisor, sino un polinomio de grado como máximo y polinomios tales que Grado bajo de garantías, que satisfarían condiciones extendidas (mediante ) definitorias para

Definir y utilizar en el lugar de en la fórmula de Fourney nos dará valores de error.

La principal ventaja del algoritmo es que mientras tanto calcula lo requerido en la fórmula de Forney.

Explicación del proceso de decodificación

El objetivo es encontrar una palabra clave que difiera lo menos posible de la palabra recibida en posiciones legibles. Al expresar la palabra recibida como una suma de la palabra clave más cercana y la palabra de error, intentamos encontrar la palabra de error con la menor cantidad de valores distintos de cero en posiciones legibles. Syndrom restringe la palabra de error por condición

Podríamos escribir estas condiciones por separado o podríamos crear un polinomio.

y comparar coeficientes cerca de potencias a

Supongamos que hay una letra ilegible en la posición en la que podríamos reemplazar el conjunto de síndromes por el conjunto de síndromes definidos por la ecuación. Supongamos que para una palabra de error se cumplen todas las restricciones del conjunto original de síndromes, entonces

Nuevo conjunto de síndromes restringe el vector de error

De la misma manera que el conjunto original de síndromes restringió el vector de error, excepto la coordenada donde tenemos un es cero, si Para el objetivo de localizar posiciones de error, podríamos cambiar el conjunto de síndromes de manera similar para reflejar todos los caracteres ilegibles. Esto acorta el conjunto de síndromes por

En la formulación polinomial, la sustitución de un conjunto de síndromes por un conjunto de síndromes conduce a

Por lo tanto,

Después de reemplazar por , se requeriría una ecuación para coeficientes cercanos a potencias

Se podría considerar la búsqueda de posiciones de error desde el punto de vista de eliminar la influencia de posiciones dadas de manera similar a como se hace con los caracteres ilegibles. Si encontramos posiciones tales que al eliminar su influencia obtenemos un conjunto de síndromes que consisten en todos los ceros, entonces existe un vector de error con errores solo en estas coordenadas. Si denota el polinomio que elimina la influencia de estas coordenadas, obtenemos

En el algoritmo euclidiano, tratamos de corregir la mayor cantidad de errores (en posiciones legibles), porque con un mayor número de errores podría haber más palabras de código en la misma distancia de la palabra recibida. Por lo tanto, para lo que buscamos, la ecuación debe cumplirse para coeficientes cercanos a potencias que comiencen desde

En la fórmula de Forney, se puede multiplicar por un escalar dando el mismo resultado.

Podría suceder que el algoritmo euclidiano encuentre un grado mayor que el que tiene un número de raíces diferentes igual a su grado, donde la fórmula de Fourney sería capaz de corregir errores en todas sus raíces, de todos modos corregir tantos errores podría ser riesgoso (especialmente sin otras restricciones en la palabra recibida). Por lo general, después de obtener un grado mayor, decidimos no corregir los errores. La corrección podría fallar en el caso de que tenga raíces con mayor multiplicidad o el número de raíces sea menor que su grado. El error también podría detectarse si la fórmula de Fourney devuelve un error fuera del alfabeto transmitido.

Corrija los errores

Utilizando los valores de error y la ubicación de los errores, corrija los errores y forme un vector de código corregido restando los valores de error en las ubicaciones de los errores.

Ejemplos de decodificación

Decodificación de código binario sin caracteres ilegibles

Considere un código BCH en GF(2 4 ) con y . (Esto se usa en códigos QR .) Sea el mensaje a transmitir [1 1 0 1 1], o en notación polinomial, Los símbolos de "suma de comprobación" se calculan dividiendo por y tomando el resto, lo que da como resultado o [ 1 0 0 0 0 1 0 1 0 0 ]. Estos se agregan al mensaje, por lo que la palabra de código transmitida es [ 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0 ].

Ahora, imaginemos que hay dos errores de bit en la transmisión, por lo que la palabra de código recibida es [ 1 0 0 1 1 1 0 0 0 1 1 0 1 0 0 ]. En notación polinómica:

Para corregir los errores, primero calculamos los síndromes. Tomando y A continuación, aplicamos el procedimiento de Peterson reduciendo por filas la siguiente matriz aumentada.

Debido a la fila cero, S 3×3 es singular, lo que no es una sorpresa ya que solo se introdujeron dos errores en la palabra clave. Sin embargo, la esquina superior izquierda de la matriz es idéntica a [ S 2×2 | C 2×1 ] , lo que da lugar a la solución El polinomio localizador de errores resultante es que tiene ceros en y Los exponentes de corresponden a las ubicaciones de los errores. No es necesario calcular los valores de error en este ejemplo, ya que el único valor posible es 1.

Decodificación con caracteres ilegibles

Supongamos el mismo escenario, pero la palabra recibida tiene dos caracteres ilegibles [ 1 0 0 ? 1 1 ? 0 0 1 1 0 1 0 0 ]. Reemplazamos los caracteres ilegibles por ceros mientras creamos el polinomio que refleja sus posiciones. Calculamos los síndromes y (Usando la notación logarítmica que es independiente de los isomorfismos GF(2 4 ). Para la comprobación del cálculo podemos usar la misma representación para la suma que se usó en el ejemplo anterior. La descripción hexadecimal de las potencias de son consecutivamente 1,2,4,8,3,6,C,B,5,A,7,E,F,D,9 con la suma basada en xor bit a bit).

Hagamos polinomio el síndrome

calcular

Ejecute el algoritmo euclidiano extendido:

Hemos alcanzado un polinomio de grado como máximo 3, y como

Nosotros conseguimos

Por lo tanto,

No te preocupes, busca por fuerza bruta una raíz de Las raíces son y (después de encontrarlas, por ejemplo, podemos dividir por el monoma correspondiente y la raíz del monoma resultante se puede encontrar fácilmente).

Dejar

Busquemos valores de error usando la fórmula

¿Dónde están las raíces de We get?

El hecho es que esto no debería sorprendernos.

Por lo tanto, el código corregido es [ 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0].

Decodificación con caracteres ilegibles con un pequeño número de errores

Demostremos el comportamiento del algoritmo para el caso con un pequeño número de errores. Sea la palabra recibida [ 1 0 0 ? 1 1 ? 0 0 0 1 0 1 0 0 ].

Nuevamente, reemplace los caracteres ilegibles por ceros mientras crea el polinomio que refleja sus posiciones. Calcule los síndromes y cree el polinomio del síndrome.

Ejecutemos el algoritmo euclidiano extendido:

Hemos alcanzado un polinomio de grado como máximo 3, y como

Nosotros conseguimos

Por lo tanto,

No te preocupes que la raíz de es

Dejar

Busquemos valores de error usando la fórmula donde son raíces del polinomio.

Nosotros lo conseguimos

El hecho es que no debería sorprendernos.

Por lo tanto, el código corregido es [ 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0].

Citas

  1. ^ Reed y Chen 1999, pág. 189
  2. ^ Hocquenghem 1959
  3. ^ Bose y Ray-Chaudhuri 1960
  4. ^ "Sistema de codificación del módulo de aterrizaje de Phobos: software y análisis" (PDF) . Archivado (PDF) desde el original el 2022-10-09 . Consultado el 25 de febrero de 2012 .
  5. ^ Marelli, Alessia; Micheloni, Rino (2018). "Códigos BCH para unidades de estado sólido". Dentro de las unidades de estado sólido (SSDS) . Springer Series in Advanced Microelectronics. Vol. 37. págs. 369–406. doi :10.1007/978-981-13-0599-3_11. ISBN 978-981-13-0598-6. Recuperado el 23 de septiembre de 2023 .
  6. ^ Gill sin fecha, pág. 3
  7. ^ Lidl y Pilz 1999, pág. 229
  8. ^ Gorenstein, Peterson y Zierler 1960
  9. ^ Gill sin fecha, pág. 47
  10. ^ Yasuo Sugiyama, Masao Kasahara, Shigeichi Hirasawa y Toshihiko Namekawa. Un método para resolver ecuaciones clave para decodificar códigos Goppa. Información y control, 27:87–99, 1975.

Referencias

Fuentes primarias

Fuentes secundarias

Lectura adicional