stringtranslate.com

código BCH

En teoría de la codificación , los códigos Bose-Chaudhuri-Hocquenghem ( códigos BCH ) forman una clase de códigos cíclicos de corrección de errores que se construyen utilizando polinomios sobre un campo finito (también llamado campo de Galois ). Los códigos BCH fueron inventados en 1959 por el matemático francés Alexis Hocquenghem , y de forma independiente 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 (erróneamente, 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 la cantidad de errores de símbolos que el código puede corregir. En particular, es posible diseñar códigos BCH binarios que puedan corregir errores de múltiples bits. Otra ventaja de los códigos BCH es la facilidad con la que se pueden decodificar, concretamente, mediante un método algebraico conocido como decodificación de síndrome . Esto simplifica el diseño del decodificador de estos códigos, utilizando un pequeño hardware electrónico 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 potencia prima q m con enteros positivos m y d tales que dq m − 1 , un código BCH primitivo de sentido estricto sobre el campo finito (o campo de Galois) GF( q ) con longitud de código n = q m − 1 y la distancia al menos d se construye 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 ) = lcm ( 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 tanto, el código polinómico definido por g ( x ) es un código cíclico.

Ejemplo

Sean 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 , usando 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 mínima de Hamming de al menos 3 y corrige hasta un error. Dado que 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 indica como: (15, 11) código BCH.

El código BCH tiene el polinomio generador.

Tiene una distancia mínima de Hamming de al menos 5 y corrige hasta dos errores. Dado que 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 indica como: (15, 7) código BCH.

El código BCH tiene el polinomio generador.

Tiene una distancia mínima de Hamming 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 indica como: (15, 5) código BCH. (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 de Hamming mínima de 15 y corrige 7 errores. Tiene 1 bit de datos y 14 bits de suma de comprobación. También se indica como: (15, 1) código BCH. De hecho, este código tiene solo dos palabras en clave: 000000000000000 y 111111111111111 (un código de repetición trivial ).

Códigos generales BCH

Los códigos BCH generales se diferencian 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 del orden del elemento

En segundo lugar, las raíces consecutivas del polinomio generador pueden ir desde en lugar de

Definición. Fijar un campo finito donde hay una potencia primaria. Elija números enteros positivos tales que y sea el orden multiplicativo del módulo

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

Nota: si es 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 como polinomio generador se llama código BCH El código BCH y un 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 (datos y polinomio 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 como máximo un grado . Además, si y , el polinomio generador tiene grado como máximo .

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

Un código BCH es cíclico.

Codificación

Debido a 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 el generador como factor.

El código BCH en sí no es prescriptivo sobre el 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 mínima de Hamming a la palabra de código recibida. Por lo tanto, el código BCH puede implementarse como código sistemático o no, dependiendo de cómo el implementador elija 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 algún polinomio arbitrario y el generador. En este caso, se puede elegir un polinomio arbitrario 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 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 palabra por palabra en algún lugar dentro de la palabra clave. Por lo tanto, la codificación BCH sistemática 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 restar el resto de un dividendo da como resultado 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 resto), podemos usar la división euclidiana de polinomios para obtener:

Aquí vemos que es una palabra clave válida. Como siempre es de grado menor que (que es el grado de ), podemos restarlo con seguridad sin alterar ninguno de los coeficientes del mensaje, por lo tanto tenemos nuestro as

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

La ventaja de la codificación sistemática es que el receptor puede recuperar el mensaje original descartando todo lo que sigue a 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. Calcule los síndromes s j para el vector recibido.
  2. Determine el número de errores t y el polinomio localizador de errores Λ(x) a partir de los síndromes
  3. Calcule las raíces del polinomio de ubicación de errores para encontrar las ubicaciones de errores X i
  4. Calcule los valores de error Y i en esas ubicaciones de error
  5. Corrige los errores

Durante algunos de estos pasos, el algoritmo de decodificación puede determinar que el vector recibido tiene demasiados errores y no puede corregirse. Por ejemplo, si no se encuentra un valor apropiado de t , la corrección fallaría. 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, sin saberlo, producir 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 clave correcta y un vector de error desconocido. Los valores del síndrome se forman considerándolo como un polinomio y evaluándolo en Así, los síndromes son [7]

para a

Dado que los ceros de son múltiplos, al examinar los valores del síndrome se aísla el vector de error para que se pueda comenzar a resolverlo.

Si no hay ningún error, para todos. Si todos los síndromes son 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 necesita determinar cuántos errores y su ubicación.

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

por lo que juntos nos permiten calcular y proporcionar cierta información (determinarla 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 síndromes computacionales y con polinomio localizador mínimo 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 de decodificación BCH generalizado. El algoritmo de Peterson se utiliza para calcular los coeficientes polinomiales del localizador de errores de un polinomio.

Ahora el procedimiento del algoritmo de Peterson-Gorenstein-Zierler. [8] Espere que tengamos al menos 2 t síndromes sc , …, sc +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. Denotemos los coeficientes polinomiales desconocidos, que están dados por
  4. Formar la ecuación matricial
  5. Si el determinante de la matriz es distinto de cero, entonces podemos encontrar una inversa de esta matriz y resolver los valores de valores desconocidos.
  6. Si entonces sigue
     si entonces declarar un polinomio localizador de errores vacío detener el procedimiento de Peterson. fin colocar
    continuar desde el comienzo de la decodificación de Peterson haciendo más pequeños
  7. Una vez que tenga los valores de , tendrá el polinomio localizador de errores.
  8. Detenga el procedimiento de Peterson.

Polinomio localizador de error de factor

Ahora que 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 producirán las posiciones donde 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 luego para corregir los valores recibidos en esas ubicaciones para recuperar la palabra de código original.

Para el caso de BCH binario (con todos los caracteres legibles), esto es trivial; simplemente invierta 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 algoritmo de Forney .

Dejar

Y el polinomio evaluador de errores [9]

Finalmente:

dónde

Que 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 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 generación de funciones .

Considere y en aras de la simplicidad suponga para y para Entonces

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

gracias a que tenemos

Gracias al (truco de interpolación de Lagrange) la suma degenera a una sola suma para

Para conseguirlo simplemente debemos deshacernos del producto. Podríamos calcular el producto directamente a partir de raíces ya calculadas , 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

Decodificació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 localizando estas posiciones. Establezca valores en posiciones ilegibles en 0 y calcule los síndromes.

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

Ejecutemos un 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 Bajo grado de garantías, que satisfaría condiciones de definición extendidas (por ) para

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

La principal ventaja del algoritmo es que, al mismo tiempo, calcula lo requerido en la fórmula de Forney.

Explicación del proceso de decodificación.

El objetivo es encontrar una palabra clave que se diferencie lo mínimo posible de la palabra recibida en posiciones legibles. Al expresar la palabra recibida como una suma de la palabra de código más cercana y la palabra de error, intentamos encontrar una palabra de error con un número mínimo de valores distintos de ceros en posiciones legibles. El síndrome restringe la palabra de error por condición

Podríamos escribir estas condiciones por separado o podríamos crear polinomios

y comparar coeficientes cercanos a potencias

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

Un 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 que la coordenada donde tenemos un es cero, si para 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 síndromes establecidos por síndromes establecidos conduce a

Por lo tanto,

Después de reemplazar por , se requeriría una ecuación para los coeficientes cercanos a las 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 ocurre con los caracteres ilegibles. Si encontramos posiciones tales que eliminar su influencia conduce a obtener un conjunto de síndromes que consisten exclusivamente en ceros, entonces existe un vector de error con errores sólo en estas coordenadas. Si denotamos el polinomio eliminando la influencia de estas coordenadas, obtenemos

En el algoritmo euclidiano, intentamos corregir la mayoría de los errores (en posiciones legibles), porque con un mayor número de errores podría haber más palabras en código a la misma distancia de la palabra recibida. Por lo tanto, para lo que estamos buscando, la ecuación debe ser válida para coeficientes cercanos a potencias a partir de

En la fórmula de Forney, podría multiplicarse por un escalar dando el mismo resultado.

Podría suceder que el algoritmo euclidiano encuentre un grado superior a tener 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 todas formas corregir tantos errores podría ser arriesgado (especialmente sin otros restricciones en la palabra recibida). Generalmente después de obtener un mayor grado, 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 mediante la fórmula de Forney que devuelve un error fuera del alfabeto transmitido.

Corrige 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 ). Deje que el mensaje a transmitir sea [1 1 0 1 1], o en notación polinómica. Los símbolos de "suma de verificació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 adjuntan al mensaje, por lo que la palabra clave transmitida es [1 1 0 1 1 1 0 0 0 0 1 0 1 0 0].

Ahora, imagine que hay dos errores de bits en la transmisión, por lo que la palabra clave recibida es [1 0 0 1 1 1 0 0 0 1 1 0 1 0 0]. En notación polinomial:

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

Debido a la fila cero, S 3×3 es singular, lo cual no sorprende 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 el 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 notación logarítmica que es independiente de los isomorfismos GF(2 4 ). Para verificar el cálculo podemos usar la misma representación para la suma que se usó en anteriores (Por ejemplo, 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 del síndrome

calcular

Ejecute el algoritmo euclidiano extendido:

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

obtenemos

Por lo tanto,

No se preocupe, encuentre por fuerza bruta una raíz de Las raíces son y (después de encontrar, por ejemplo, podemos dividir por el monom correspondiente y la raíz del monom resultante se podrá encontrar fácilmente).

Dejar

Busquemos valores de error usando la fórmula.

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

De hecho, eso no debería sorprender.

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 una pequeña cantidad de errores.

Muestremos el comportamiento del algoritmo para el caso con una pequeña cantidad de errores. Deje que la palabra recibida sea [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

obtenemos

Por lo tanto,

No te preocupes porque la raíz de es

Dejar

Busquemos valores de error usando la fórmula donde están las raíces del polinomio

Obtenemos

El hecho de que esto no debería sorprender.

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 Phobos Lander: software y análisis" (PDF) . Archivado (PDF) desde el original el 9 de octubre de 2022 . Consultado el 25 de febrero de 2012 .
  5. ^ Marelli, Alessia; Micheloni, Rino (2018). "Códigos BCH para unidades de estado sólido". Unidades de estado sólido internas (SSDS) . Serie Springer en Microelectrónica Avanzada. vol. 37. págs. 369–406. doi :10.1007/978-981-13-0599-3_11. ISBN 978-981-13-0598-6. Consultado 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

Otras lecturas