De Wikipedia, la enciclopedia libre
  (Redirigido desde Reed Solomon )
Saltar a navegación Saltar a búsqueda

Los códigos Reed-Solomon son un grupo de códigos de corrección de errores que fueron introducidos por Irving S. Reed y Gustave Solomon en 1960. [1] Tienen muchas aplicaciones, las más destacadas incluyen tecnologías de consumo como minidiscos , CD , DVD , Discos Blu-ray , códigos QR , tecnologías de transmisión de datos como DSL y WiMAX , sistemas de transmisión como comunicaciones por satélite, DVB y ATSC , y sistemas de almacenamiento como RAID 6.

Los códigos Reed-Solomon operan en un bloque de datos tratados como un conjunto de elementos de campo finito llamados símbolos. Los códigos Reed-Solomon pueden detectar y corregir múltiples errores de símbolos. Mediante la adición de t = n  -  k símbolos de verificación para los datos, un código de Reed-Solomon puede detectar (pero no correcta) cualquier combinación de hasta e incluyendo t símbolos erróneos, o localizar y corregir hasta e incluyendo t / 2⌋ errónea símbolos en ubicaciones desconocidas. Como código de borrado , puede corregir hasta e incluyendo tborrados en ubicaciones que son conocidas y proporcionadas al algoritmo, o puede detectar y corregir combinaciones de errores y borrados. Los códigos Reed-Solomon también son adecuados como códigos de corrección de errores de bits de ráfagas múltiples , ya que una secuencia de errores de bits consecutivos b  + 1 puede afectar como máximo a dos símbolos de tamaño b . La elección de t depende del diseñador del código y puede seleccionarse dentro de amplios límites.

Hay dos tipos básicos de códigos Reed-Solomon - vista original y vista BCH - siendo la vista BCH la más común, ya que los decodificadores de vista BCH son más rápidos y requieren menos almacenamiento de trabajo que los decodificadores de vista originales.

Historia [ editar ]

Los códigos Reed-Solomon fueron desarrollados en 1960 por Irving S. Reed y Gustave Solomon , que eran entonces miembros del personal del Laboratorio Lincoln del MIT . Su artículo fundamental se tituló "Códigos polinomiales sobre ciertos campos finitos". ( Reed y Solomon 1960 ). El esquema de codificación original descrito en el artículo de Reed & Solomon utilizó un polinomio variable basado en el mensaje que se codificará, en el que el codificador y el descodificador solo conocen un conjunto fijo de valores (puntos de evaluación) que se codificarán. El decodificador teórico original generó polinomios potenciales basados ​​en subconjuntos de k (longitud de mensaje no codificado) de n(longitud del mensaje codificado) valores de un mensaje recibido, eligiendo el polinomio más popular como el correcto, lo cual no era práctico para todos los casos excepto el más simple. Esto se resolvió inicialmente cambiando el esquema original a un esquema similar al código BCH basado en un polinomio fijo conocido tanto por el codificador como por el decodificador, pero más tarde, se desarrollaron decodificadores prácticos basados ​​en el esquema original, aunque más lento que los esquemas BCH. El resultado de esto es que hay dos tipos principales de códigos Reed Solomon, los que usan el esquema de codificación original y los que usan el esquema de codificación BCH.

También en 1960, un práctico decodificador polinomial fijo para códigos BCH desarrollado por Daniel Gorenstein y Neal Zierler fue descrito en un informe del Laboratorio Lincoln del MIT por Zierler en enero de 1960 y más tarde en un artículo en junio de 1961. [2] El decodificador Gorenstein-Zierler y el trabajo relacionado con los códigos BCH se describe en un libro Error Correcting Codes de W. Wesley Peterson (1961). [3] En 1963 (o posiblemente antes), JJ Stone (y otros) reconocieron que los códigos de Reed Solomon podrían usar el esquema BCH de usar un polinomio generador fijo, haciendo de dichos códigos una clase especial de códigos BCH, [4]pero los códigos de Reed Solomon basados ​​en el esquema de codificación original, no son una clase de códigos BCH y, dependiendo del conjunto de puntos de evaluación, ni siquiera son códigos cíclicos .

En 1969, Elwyn Berlekamp y James Massey desarrollaron un decodificador de esquema BCH mejorado , conocido desde entonces como el algoritmo de decodificación de Berlekamp-Massey .

En 1975, Yasuo Sugiyama desarrolló otro decodificador de esquema BCH mejorado, basado en el algoritmo euclidiano extendido . [5]

En 1977, los códigos Reed-Solomon se implementaron en el programa Voyager en forma de códigos de corrección de errores concatenados . La primera aplicación comercial en productos de consumo producidos en masa apareció en 1982 con el disco compacto , donde se utilizan dos códigos Reed-Solomon intercalados . En la actualidad, los códigos Reed-Solomon se implementan ampliamente en dispositivos de almacenamiento digital y estándares de comunicación digital , aunque están siendo reemplazados lentamente por códigos más modernos de verificación de paridad de baja densidad (LDPC) o códigos turbo . Por ejemplo, los códigos Reed-Solomon se utilizan en el estándar DVB-S de transmisión de video digital (DVB)., pero los códigos LDPC se utilizan en su sucesor, DVB-S2 .

En 1986, se desarrolló un decodificador de esquema original conocido como el algoritmo de Berlekamp-Welch .

En 1996, Madhu Sudan y otros desarrollaron variaciones de los decodificadores de esquemas originales llamados decodificadores de lista o decodificadores de software, y el trabajo continúa en este tipo de decodificadores; consulte el algoritmo de decodificación de listas de Guruswami-Sudan .

En 2002, Shuhong Gao desarrolló otro decodificador de esquema original, basado en el algoritmo euclidiano extendido Gao_RS.pdf .

Aplicaciones [ editar ]

Almacenamiento de datos [ editar ]

La codificación Reed-Solomon se utiliza mucho en los sistemas de almacenamiento masivo para corregir los errores de ráfaga asociados con los defectos de los medios.

La codificación Reed-Solomon es un componente clave del disco compacto . Fue el primer uso de una fuerte codificación de corrección de errores en un producto de consumo de producción masiva, y DAT y DVD usan esquemas similares. En el CD, dos capas de codificación Reed-Solomon separadas por un intercalador convolucional de 28 vías producen un esquema llamado Codificación Reed-Solomon entrelazada cruzada ( CIRC). El primer elemento de un decodificador CIRC es un código Reed-Solomon interno relativamente débil (32,28), abreviado de un código (255,251) con símbolos de 8 bits. Este código puede corregir errores de hasta 2 bytes por bloque de 32 bytes. Más importante aún, marca como borrado cualquier bloque incorregible, es decir, bloques con errores de más de 2 bytes. Los bloques decodificados de 28 bytes, con indicaciones de borrado, son luego esparcidos por el desintercalador a diferentes bloques del código externo (28, 24). Gracias al desintercalado, un bloque de 28 bytes borrado del código interno se convierte en un solo byte borrado en cada uno de los 28 bloques de código externos. El código externo corrige esto fácilmente, ya que puede manejar hasta 4 borrados de este tipo por bloque.

El resultado es un CIRC que puede corregir completamente las ráfagas de errores de hasta 4000 bits, o aproximadamente 2,5 mm en la superficie del disco. Este código es tan fuerte que la mayoría de los errores de reproducción de CD se deben casi con certeza a errores de seguimiento que hacen que el láser salte de pista, no a ráfagas de errores incorregibles. [6]

Los DVD usan un esquema similar, pero con bloques mucho más grandes, un código interno (208,192) y un código externo (182,172).

La corrección de errores de Reed-Solomon también se usa en archivos parchive que comúnmente se publican adjuntos a archivos multimedia en USENET . El servicio de almacenamiento distribuido en línea Wuala (descontinuado en 2015) también solía hacer uso de Reed – Solomon al dividir archivos.

Código de barras [ editar ]

Casi todos los códigos de barras bidimensionales como PDF-417 , MaxiCode , Datamatrix , QR Code y Aztec Code utilizan la corrección de errores Reed-Solomon para permitir una lectura correcta incluso si una parte del código de barras está dañada. Cuando el lector de códigos de barras no puede reconocer un símbolo de código de barras, lo tratará como un borrado.

La codificación Reed-Solomon es menos común en los códigos de barras unidimensionales, pero la utiliza la simbología PostBar .

Transmisión de datos [ editar ]

Se pueden utilizar formas especializadas de códigos Reed-Solomon, específicamente Cauchy -RS y Vandermonde -RS, para superar la naturaleza poco confiable de la transmisión de datos a través de canales de borrado . El proceso de codificación asume un código de RS ( NK ) que da como resultado N palabras de código de longitud N símbolos, cada uno de los cuales almacena K símbolos de datos, que se generan, que luego se envían a través de un canal de borrado.

Cualquier combinación de K palabras de código recibidas en el otro extremo es suficiente para reconstruir todas las N palabras de código. La tasa de código generalmente se establece en 1/2 a menos que la probabilidad de borrado del canal se pueda modelar adecuadamente y se considere que es menor. En conclusión, N suele ser 2 K , lo que significa que al menos la mitad de todas las palabras de código enviadas deben recibirse para reconstruir todas las palabras de código enviadas.

Los códigos Reed-Solomon también se utilizan en los sistemas xDSL y las Especificaciones del Protocolo de Comunicaciones Espaciales de CCSDS como una forma de corrección de errores hacia adelante .

Transmisión espacial [ editar ]

Sistema de codificación concatenado de espacio profundo. [7] Notación: RS (255, 223) + CC ("longitud de restricción" = 7, tasa de código = 1/2).

Una aplicación importante de la codificación Reed-Solomon fue codificar las imágenes digitales enviadas por el programa Voyager .

La Voyager introdujo la codificación Reed-Solomon concatenada con códigos convolucionales , una práctica que desde entonces se ha generalizado mucho en el espacio profundo y las comunicaciones por satélite (p. Ej., Radiodifusión digital directa).

Los decodificadores de Viterbi tienden a producir errores en ráfagas cortas. La corrección de estos errores de ráfaga es un trabajo que se realiza mejor mediante códigos Reed-Solomon breves o simplificados.

En las misiones Mars Pathfinder , Galileo , Mars Exploration Rover y Cassini se utilizaron versiones modernas de codificación convolucional concatenada Reed-Solomon / Viterbi decodificada , donde funcionan entre 1 y 1,5 dB del límite máximo, la capacidad de Shannon .

Estos códigos concatenados ahora están siendo reemplazados por códigos turbo más potentes :

Construcciones [ editar ]

El código Reed-Solomon es en realidad una familia de códigos, donde cada código se caracteriza por tres parámetros: un tamaño de alfabeto q , una longitud de bloque n y una longitud de mensaje k, con k <n ≤ q. El conjunto de símbolos del alfabeto se interpreta como el campo finito de orden q y, por tanto, q tiene que ser una potencia prima . En las parametrizaciones más útiles del código Reed-Solomon, la longitud del bloque suele ser un múltiplo constante de la longitud del mensaje, es decir, la tasa R = k / nes una constante y, además, la longitud del bloque es igual o uno menor que el tamaño del alfabeto, es decir, n = q o n = q - 1 . [ cita requerida ]

Vista original de Reed & Solomon: La palabra en clave como una secuencia de valores [ editar ]

Existen diferentes procedimientos de codificación para el código Reed-Solomon y, por lo tanto, existen diferentes formas de describir el conjunto de todas las palabras de código. En la visión original de Reed y Solomon (1960) , cada palabra clave del código Reed-Solomon es una secuencia de valores de función de un polinomio de grado menor que k . Para obtener una palabra clave del código Reed-Solomon, los símbolos del mensaje (cada uno dentro del alfabeto de tamaño q) se tratan como los coeficientes de un polinomio p de grado menor que k , sobre el campo finito F con q elementos. A su vez, el polinomio p se evalúa en nq puntos distintos del campoF , y la secuencia de valores es la palabra de código correspondiente. Las opciones comunes para un conjunto de puntos de evaluación incluyen {0, 1, 2, ..., n - 1}, {0, 1, α , α 2 , ..., α n −2 } o para n < q , {1, α , alfa 2 , ..., α n -1 }, ..., donde α es un elemento primitivo de F .

Formalmente, el conjunto de palabras en clave del código Reed-Solomon se define de la siguiente manera:

Dado que dos polinomios distintos de grado menor que concuerdan en la mayoría de los puntos, esto significa que dos palabras de código cualesquiera del código Reed-Solomon no concuerdan en al menos posiciones. Además, hay dos polinomios que coinciden en puntos pero no son iguales y, por lo tanto, la distancia del código Reed-Solomon es exactamente . Entonces la distancia relativa es , donde es la tasa. Esta compensación entre la distancia relativa y la tasa es asintóticamente óptima ya que, por el límite de Singleton , todo código satisface . Al ser un código que logra esta compensación óptima, el código Reed-Solomon pertenece a la clase decódigos separables de distancia máxima .

Si bien el número de polinomios diferentes de grado menor que k y el número de mensajes diferentes son ambos iguales y , por lo tanto, cada mensaje puede mapearse de forma única en dicho polinomio, existen diferentes formas de realizar esta codificación. La construcción original de Reed y Solomon (1960) interpreta el mensaje x como los coeficientes del polinomio p , mientras que las construcciones posteriores interpretan el mensaje como los valores del polinomio en los primeros k puntos y obtienen el polinomio p interpolando estos valores con un polinomio de grado menor que k. El último procedimiento de codificación, aunque es algo menos eficaz, tiene la ventaja de que da lugar a un código sistemático , es decir, el mensaje original siempre está contenido como una subsecuencia de la palabra de código.

Procedimiento de codificación simple: el mensaje como una secuencia de coeficientes [ editar ]

En la construcción original de Reed & Solomon (1960) , el mensaje se asigna al polinomio con

La palabra clave de se obtiene evaluando en diferentes puntos del campo . Por lo tanto, la función de codificación clásica para el código Reed-Solomon se define de la siguiente manera:

Esta función es un mapeo lineal , es decir, satisface para la siguiente -matriz con elementos de :

Esta matriz es la transpuesta de una matriz de Vandermonde sobre . En otras palabras, el código Reed-Solomon es un código lineal y, en el procedimiento de codificación clásico, su matriz generadora es .

Procedimiento de codificación sistemático: el mensaje como secuencia inicial de valores [ editar ]

Existe un procedimiento de codificación alternativo que también produce el código Reed-Solomon, pero que lo hace de forma sistemática . Aquí, el mapeo del mensaje al polinomio funciona de manera diferente: el polinomio ahora se define como el polinomio único de grado menor que tal que

vale para todos .

Para calcular este polinomio a partir de , se puede utilizar la interpolación de Lagrange . Una vez encontrado, se evalúa en los demás puntos del campo. La función de codificación alternativa para el código Reed-Solomon es nuevamente solo la secuencia de valores:

Dado que las primeras entradas de cada palabra de código coinciden con , este procedimiento de codificación es de hecho sistemático . Dado que la interpolación de Lagrange es una transformación lineal, es un mapeo lineal. De hecho, tenemos , donde

Transformada discreta de Fourier y su inversa [ editar ]

Una transformada discreta de Fourier es esencialmente lo mismo que el procedimiento de codificación; utiliza el polinomio generador p (x) para mapear un conjunto de puntos de evaluación en los valores del mensaje como se muestra arriba:

La transformada de Fourier inversa podría usarse para convertir un conjunto libre de errores de n < q valores de mensaje de nuevo en el polinomio de codificación de k coeficientes, con la restricción de que para que esto funcione, el conjunto de puntos de evaluación usados ​​para codificar el mensaje debe ser un conjunto de potencias crecientes de α :

Sin embargo, la interpolación de Lagrange realiza la misma conversión sin la restricción sobre el conjunto de puntos de evaluación o el requisito de un conjunto libre de errores de valores de mensaje y se utiliza para la codificación sistemática y en uno de los pasos del decodificador Gao .

La vista BCH: la palabra de código como una secuencia de coeficientes [ editar ]

En esta vista, el mensaje se interpreta como los coeficientes de un polinomio . El remitente calcula un polinomio relacionado de grado donde y envía el polinomio . El polinomio se construye multiplicando el polinomio del mensaje , que tiene grado , con un polinomio generador de grado que es conocido tanto por el emisor como por el receptor. El polinomio generador se define como el polinomio cuyas raíces son potencias secuenciales de la primitiva de campo de Galois.

Para una "estrecha código de sentido", .

Procedimiento de codificación sistemático [ editar ]

El procedimiento de codificación para la vista BCH de los códigos Reed-Solomon se puede modificar para producir un procedimiento de codificación sistemático , en el que cada palabra de código contiene el mensaje como prefijo y simplemente agrega símbolos de corrección de errores como sufijo. Aquí, en lugar de enviar , el codificador construye el polinomio transmitido de manera que los coeficientes de los monomios más grandes sean iguales a los coeficientes correspondientes de , y los coeficientes de orden inferior de se elijan exactamente de tal manera que se vuelvan divisibles por . Entonces los coeficientes de son una subsecuencia (específicamente, un prefijo) de los coeficientes de . Para obtener un código que sea sistemático en general, construimos el polinomio del mensaje interpretando el mensaje como la secuencia de sus coeficientes.

Formalmente, la construcción se realiza multiplicando por para dejar espacio para los símbolos de verificación, dividiendo ese producto entre para encontrar el resto y luego compensando ese resto restándolo. Los símbolos de verificación se crean calculando el resto :

El resto tiene grado como máximo , mientras que los coeficientes de en el polinomio son cero. Por tanto, la siguiente definición de la palabra de código tiene la propiedad de que los primeros coeficientes son idénticos a los coeficientes de :

Como resultado, las palabras de código son elementos de , es decir, son divisibles por el polinomio generador : [9]

Propiedades [ editar ]

El código Reed-Solomon es un código [ n , k , n - k + 1]; en otras palabras, es un código de bloque lineal de longitud n (sobre F ) con dimensión k y distancia mínima de Hamming El código Reed-Solomon es óptimo en el sentido de que la distancia mínima tiene el valor máximo posible para un código lineal de tamaño ( nk ); esto se conoce como el límite de Singleton . Este código también se denomina código de distancia máxima separable (MDS) .

La capacidad de corrección de errores de un código Reed-Solomon está determinada por su distancia mínima o, de manera equivalente, por la medida de redundancia en el bloque. Si las ubicaciones de los símbolos de error no se conocen de antemano, entonces un código Reed-Solomon puede corregir hasta símbolos erróneos, es decir, puede corregir la mitad de errores que símbolos redundantes agregados al bloque. A veces ubicaciones de error se conocen de antemano (por ejemplo, "información lateral" en demodulador relaciones de señal a ruido ) -estos son llamados borraduras . Un código Reed-Solomon (como cualquier código MDS ) puede corregir el doble de borrados que errores, y cualquier combinación de errores y borrados puede corregirse siempre que la relación 2 E  +  Se satisface S  ≤  n  -  k , donde es el número de errores y es el número de borrados en el bloque.

Rendimiento teórico de BER del código Reed-Solomon (N = 255, K = 233, QPSK, AWGN). Característica escalonada.

El límite de error teórico se puede describir mediante la siguiente fórmula para el canal AWGN para FSK : [10]

y para otros esquemas de modulación:

donde , , , es la tasa de error de símbolo en el caso AWGN no codificado y es el orden de modulación.

Para usos prácticos de los códigos Reed-Solomon, es común usar un campo finito con elementos. En este caso, cada símbolo se puede representar como un valor de -bit. El remitente envía los puntos de datos como bloques codificados y el número de símbolos en el bloque codificado es . Por tanto, un código Reed-Solomon que opera con símbolos de 8 bits tiene símbolos por bloque. (Este es un valor muy popular debido a la prevalencia de los sistemas informáticos orientados a bytes ). El número , con , de símbolos de datos en el bloque es un parámetro de diseño. Un código de uso común codifica símbolos de datos de ocho bits más 32 símbolos de paridad de ocho bits en un bloque de símbolos ; esto se denota como un código, y es capaz de corregir hasta 16 errores de símbolo por bloque.

Las propiedades del código Reed-Solomon discutidas anteriormente los hacen especialmente adecuados para aplicaciones donde los errores ocurren en ráfagas . Esto se debe a que no le importa al código cuántos bits de un símbolo tienen errores; si varios bits de un símbolo están dañados, solo cuenta como un solo error. Por el contrario, si un flujo de datos no se caracteriza por ráfagas de errores o pérdidas, sino por errores aleatorios de un solo bit, un código Reed-Solomon suele ser una mala elección en comparación con un código binario.

El código Reed-Solomon, como el código convolucional , es un código transparente. Esto significa que si los símbolos de canal se han invertido en algún lugar a lo largo de la línea, los decodificadores seguirán funcionando. El resultado será la inversión de los datos originales. Sin embargo, el código Reed-Solomon pierde su transparencia cuando se abrevia. Los bits "faltantes" en un código abreviado deben completarse con ceros o unos, dependiendo de si los datos se complementan o no. (Para decirlo de otra manera, si los símbolos están invertidos, entonces el relleno con cero debe invertirse en un relleno). Por esta razón, es obligatorio que el sentido de los datos (es decir, verdadero o complementado) se resuelva antes de la decodificación Reed-Solomon.

Si el código Reed-Solomon es cíclico o no depende de los detalles sutiles de la construcción. En la vista original de Reed y Solomon, donde las palabras de código son los valores de un polinomio, uno puede elegir la secuencia de puntos de evaluación de tal manera que el código sea cíclico. En particular, si es una raíz primitiva del campo , entonces, por definición, todos los elementos distintos de cero de toman la forma para , donde . Cada polinomio sobre da lugar a una palabra clave . Dado que la función también es un polinomio del mismo grado, esta función da lugar a una palabra de código ; ya que se mantiene, esta palabra de código es el desplazamiento cíclico a la izquierdade la palabra de código original derivada de . Por lo tanto, elegir una secuencia de poderes de raíz primitivos como puntos de evaluación hace que la vista original del código Reed-Solomon sea cíclica . Los códigos Reed-Solomon en la vista BCH son siempre cíclicos porque los códigos BCH son cíclicos .

Comentarios [ editar ]

Los diseñadores no están obligados a utilizar los tamaños "naturales" de los bloques de código Reed-Solomon. Una técnica conocida como "acortamiento" puede producir un código más pequeño de cualquier tamaño deseado a partir de un código más grande. Por ejemplo, el código (255,223) ampliamente utilizado se puede convertir en un código (160,128) rellenando la parte no utilizada del bloque fuente con 95 ceros binarios y no transmitiéndolos. En el decodificador, la misma porción del bloque se carga localmente con ceros binarios. El teorema de Delsarte-Goethals-Seidel [11] ilustra un ejemplo de una aplicación de códigos abreviados de Reed-Solomon. Paralelamente al acortamiento, una técnica conocida como punción permite omitir algunos de los símbolos de paridad codificados.

Decodificadores de vista BCH [ editar ]

Los decodificadores descritos en esta sección utilizan la vista BCH de una palabra de código como una secuencia de coeficientes. Utilizan un polinomio generador fijo conocido tanto por el codificador como por el descodificador.

Decodificador Peterson-Gorenstein-Zierler [ editar ]

Daniel Gorenstein y Neal Zierler desarrollaron un decodificador que fue descrito en un informe del Laboratorio Lincoln del MIT por Zierler en enero de 1960 y más tarde en un artículo en junio de 1961. [12] El decodificador Gorenstein-Zierler y el trabajo relacionado en códigos BCH se describen en libro Error Correcting Codes de W. Wesley Peterson (1961). [13]

Formulación [ editar ]

El mensaje transmitido`` se ve como los coeficientes de un polinomio s ( x ):

Como resultado del procedimiento de codificación de Reed-Solomon, s ( x ) es divisible por el polinomio generador g ( x ):

donde α es una raíz primitiva.

Dado que s ( x ) es un múltiplo del generador g ( x ), se deduce que "hereda" todas sus raíces:

El polinomio transmitido se corrompe en tránsito por un polinomio de error e ( x ) para producir el polinomio recibido r ( x ).

donde e i es el coeficiente para la i -ésima potencia de x . El coeficiente e i será cero si no hay error en esa potencia de x y distinto de cero si hay un error. Si hay ν errores en distintas potencias i k de x , entonces

El objetivo del decodificador es encontrar el número de errores ( ν ), las posiciones de los errores ( i k ) y los valores de error en esas posiciones ( e i k ). A partir de ellos, e ( x ) se puede calcular y restar de r ( x ) para obtener el mensaje enviado originalmente s ( x ).

Decodificación del síndrome [ editar ]

El decodificador comienza evaluando el polinomio recibido en ciertos puntos. Llamamos a los resultados de esa evaluación los "síndromes", S j . Se definen como:

La ventaja de observar los síndromes es que el polinomio del mensaje desaparece. En otras palabras, los síndromes solo se relacionan con el error y no se ven afectados por el contenido real del mensaje que se transmite. Si todos los síndromes son cero, el algoritmo se detiene aquí e informa que el mensaje no se corrompió en tránsito.

Localizadores de errores y valores de error [ editar ]

Por conveniencia, defina los localizadores de error X k y los valores de error Y k como:

Luego, los síndromes se pueden escribir en términos de estos localizadores de error y valores de error como

Esta definición de los valores del síndrome es equivalente a la anterior desde .

Los síndromes dan un sistema de n  -  k ≥ 2 ν ecuaciones en 2 ν incógnitas, pero ese sistema de ecuaciones no es lineal en X k y no tiene una solución obvia. Sin embargo, si se conociera X k (ver más abajo), entonces las ecuaciones del síndrome proporcionan un sistema lineal de ecuaciones que puede resolverse fácilmente para los valores de error Y k .

En consecuencia, el problema es encontrar la X k , porque entonces se conocería la matriz más a la izquierda, y ambos lados de la ecuación podrían multiplicarse por su inversa, dando Y k

En la variante de este algoritmo donde ya se conocen las ubicaciones de los errores (cuando se utiliza como código de borrado ), este es el final. Las ubicaciones de error ( X k ) ya se conocen mediante algún otro método (por ejemplo, en una transmisión de FM, las secciones en las que el tren de bits no estaba claro o se superó con interferencia se pueden determinar probabilísticamente a partir del análisis de frecuencia). En este escenario, se pueden corregir hasta errores.

El resto del algoritmo sirve para localizar los errores y requerirá valores de síndrome hasta , en lugar de solo los utilizados hasta ahora. Esta es la razón por la que es necesario agregar el doble de símbolos de corrección de errores que se puedan corregir sin conocer su ubicación.

Polinomio del localizador de errores [ editar ]

Existe una relación de recurrencia lineal que da lugar a un sistema de ecuaciones lineales. Resolver esas ecuaciones identifica esas ubicaciones de error X k .

Defina el polinomio del localizador de errores Λ ( x ) como

Los ceros de Λ ( x ) son los recíprocos . Esto se sigue de la construcción de la notación del producto anterior, ya que si entonces uno de los términos multiplicados será cero , el polinomio completo se evaluará como cero.

Sea cualquier número entero tal que . Multiplica ambos lados por y seguirá siendo cero.

Suma para k = 1 a ν y seguirá siendo cero.

Reúna cada término en su propia suma.

Extraiga los valores constantes de que no se vean afectados por la suma.

¡Estas sumas son ahora equivalentes a los valores del síndrome, que conocemos y podemos sustituir! Por tanto, esto se reduce a

Restando de ambos lados se obtiene

Recuerde que j se eligió para ser cualquier número entero entre 1 y v inclusive, y esta equivalencia es cierta para todos y cada uno de esos valores. Por lo tanto, tenemos v ecuaciones lineales, no solo una. Por tanto, este sistema de ecuaciones lineales se puede resolver para los coeficientes Λ i del polinomio de localización del error:

Lo anterior supone que el decodificador conoce el número de errores ν , pero ese número aún no se ha determinado. El decodificador PGZ no determina ν directamente, sino que lo busca probando valores sucesivos. El decodificador primero asume el valor más grande para una prueba ν y configura el sistema lineal para ese valor. Si las ecuaciones se pueden resolver (es decir, el determinante de la matriz es distinto de cero), entonces ese valor de prueba es el número de errores. Si el sistema lineal no se puede resolver, entonces la prueba ν se reduce en uno y se examina el siguiente sistema más pequeño. ( Gill nd , pág. 35)

Encuentre las raíces del polinomio del localizador de errores [ editar ]

Utilizar los coeficientes Λ i encontré en el último paso para construir el polinomio ubicación del error. Las raíces del polinomio de ubicación del error se pueden encontrar mediante una búsqueda exhaustiva. Los localizadores de error X k son los recíprocos de esas raíces. El orden de los coeficientes del polinomio de ubicación del error puede invertirse, en cuyo caso las raíces de ese polinomio invertido son los localizadores de error (no sus recíprocos ). La búsqueda de Chien es una implementación eficiente de este paso.

Calcular los valores de error [ editar ]

Una vez que se conocen los localizadores de error X k , se pueden determinar los valores de error. Esto se puede hacer mediante la solución directa de Y k en la matriz de ecuaciones de error dada anteriormente, o usando el algoritmo de Forney .

Calcular las ubicaciones de los errores [ editar ]

Calcule i k tomando la base logarítmica de X k . Esto generalmente se hace usando una tabla de búsqueda precalculada.

Corrija los errores [ editar ]

Finalmente, e (x) se genera a partir de i k y e i k y luego se resta de r (x) para obtener el mensaje enviado originalmente s (x), con los errores corregidos.

Ejemplo [ editar ]

Considere el código Reed-Solomon definido en GF (929) con α = 3 y t = 4 (esto se usa en los códigos de barras PDF417 ) para un código RS (7,3). El polinomio generador es

Si el polinomio del mensaje es p ( x ) = 3 x 2 + 2 x + 1 , entonces una palabra de código sistemática se codifica de la siguiente manera.

Los errores en la transmisión pueden causar que esto se reciba en su lugar.

Los síndromes se calculan evaluando r en potencias de α .

Usando eliminación gaussiana :

Λ (x) = 329 x 2 + 821 x + 001, con raíces x 1 = 757 = 3 −3 y x 2 = 562 = 3 −4

Los coeficientes se pueden invertir para producir raíces con exponentes positivos, pero normalmente esto no se usa:

R (x) = 001 x 2 + 821 x + 329, con raíces 27 = 3 3 y 81 = 3 4

con el registro de las raíces correspondientes a las ubicaciones de error (de derecha a izquierda, la ubicación 0 es el último término de la palabra de código).

Para calcular los valores de error, aplique el algoritmo de Forney .

Ω (x) = S (x) Λ (x) mod x 4 = 546 x + 732
Λ '(x) = 658 x + 821
e 1 = −Ω (x 1 ) / Λ '(x 1 ) = 074
e 2 = −Ω (x 2 ) / Λ '(x 2 ) = 122

Restando e 1 x 3 y e 2 x 4 desde el polinomio recibido r reproduce la palabra de código original de s .

Decodificador Berlekamp – Massey [ editar ]

El algoritmo de Berlekamp-Massey es un procedimiento iterativo alternativo para encontrar el polinomio del localizador de errores. Durante cada iteración, calcula una discrepancia basada en una instancia actual de Λ (x) con un número supuesto de errores e :

y luego ajusta Λ ( x ) ye para que un Δ recalculado sea cero. El artículo algoritmo de Berlekamp-Massey tiene una descripción detallada del procedimiento. En el siguiente ejemplo, C ( x ) se usa para representar Λ ( x ).

Ejemplo [ editar ]

Utilizando los mismos datos que en el ejemplo anterior de Peterson Gorenstein Zierler:

El valor final de C es el polinomio localizador de errores, Λ ( x ).

Decodificador euclidiano [ editar ]

Otro método iterativo para calcular tanto el polinomio del localizador de errores como el polinomio del valor del error se basa en la adaptación de Sugiyama del algoritmo euclidiano extendido .

Defina S (x), Λ (x) y Ω (x) para los síndromes t y los errores e :

La ecuación clave es:

Para t = 6 ye = 3:

Los términos intermedios son cero debido a la relación entre Λ y síndromes.

El algoritmo euclidiano extendido puede encontrar una serie de polinomios de la forma

Una yo ( x ) S ( x ) + B yo ( x ) x t = R yo ( x )

donde el grado de R disminuye a medida que aumenta i . Una vez que el grado de R i ( x ) < t / 2, entonces

Una yo (x) = Λ (x)

B yo (x) = −Q (x)

R yo (x) = Ω (x).

No es necesario guardar B (x) y Q (x), por lo que el algoritmo se convierte en:

R −1 = x t
R 0 = S (x)
A −1 = 0
A 0 = 1
i = 0
mientras que el grado de R i ≥ t / 2
yo = yo + 1
Q = R i-2 / R i-1
R yo = R i-2 - QR i-1
A yo = A i-2 - QA i-1

para establecer el término de orden inferior de Λ (x) en 1, divida Λ (x) y Ω (x) por A i (0):

Λ (x) = A yo / A yo (0)
Ω (x) = R yo / A yo (0)

A i (0) es el término constante (de orden inferior) de A i .

Ejemplo [ editar ]

Con los mismos datos que en el ejemplo de Peterson – Gorenstein – Zierler anterior:

Λ (x) = A 2 /544 = 329 x 2 + 821 x + 001
Ω (x) = R 2 /544 = 546 x + 732

Decodificador usando transformada discreta de Fourier [ editar ]

Se puede usar una transformada discreta de Fourier para decodificar. [14] Para evitar conflictos con los nombres de los síntomas, sea c ( x ) = s ( x ) la palabra en clave codificada. r ( x ) ye ( x ) son los mismos que los anteriores. Defina C ( x ), E ( x ) y R ( x ) como las transformadas discretas de Fourier de c ( x ), e ( x ) y r ( x ). Dado que r (x ) = c ( x ) + e ( x ), y dado que una transformada discreta de Fourier es un operador lineal, R ( x ) = C ( x ) + E ( x ).

Transforme r ( x ) en R ( x ) usando la transformada discreta de Fourier. Dado que el cálculo de una transformada discreta de Fourier es el mismo que el cálculo de los síndromes, los coeficientes t de R ( x ) y E ( x ) son los mismos que los de los síndromes:

Uso a través de como síndromes (que son la misma) y generar el polinomio localizador de errores utilizando los métodos de cualquiera de los decodificadores de arriba.

Sea v = número de errores. Genere E (x) usando los coeficientes conocidos de , el polinomio del localizador de errores y estas fórmulas

Luego calcule C ( x ) = R ( x ) - E ( x ) y tome la transformada inversa (interpolación polinomial) de C ( x ) para producir c ( x ).

Decodificación más allá del límite de corrección de errores [ editar ]

El límite de Singleton establece que la distancia mínima d de un código de bloque lineal de tamaño ( n , k ) está delimitada en la parte superior por n  -  k  + 1. Se entendía que la distancia d limitaba la capacidad de corrección de errores a ⌊ (d- 1) / 2⌋. El código Reed-Solomon logra este límite con igualdad y, por lo tanto, puede corregir errores de hasta ⌊ (nk) / 2⌋. Sin embargo, este límite de corrección de errores no es exacto.

En 1999, Madhu Sudan y Venkatesan Guruswami del MIT publicaron "Decodificación mejorada de códigos Reed-Solomon y de geometría algebraica" introduciendo un algoritmo que permitía la corrección de errores más allá de la mitad de la distancia mínima del código. [15] Se aplica a los códigos Reed-Solomon y más generalmente a los códigos geométricos algebraicos . Este algoritmo produce una lista de palabras de código (es un algoritmo de decodificación de listas ) y se basa en la interpolación y factorización de polinomios y sus extensiones.

Decodificación suave [ editar ]

Los métodos de decodificación algebraicos descritos anteriormente son métodos de decisión difícil, lo que significa que para cada símbolo se toma una decisión difícil sobre su valor. Por ejemplo, un decodificador podría asociar con cada símbolo un valor adicional correspondiente a la confianza del demodulador de canal en la exactitud del símbolo. El advenimiento de LDPC y códigos turbo , que emplean métodos iterados de decodificación de propagación de creencias de decisión suave para lograr un rendimiento de corrección de errores cercano al límite teórico , ha estimulado el interés en aplicar la decodificación de decisión suave a los códigos algebraicos convencionales. En 2003, Ralf Koetter y Alexander Vardypresentó un algoritmo de decodificación de lista algebraica de decisión suave en tiempo polinómico para códigos Reed-Solomon, que se basó en el trabajo de Sudan y Guruswami. [16] En 2016, Steven J. Franke y Joseph H. Taylor publicaron un nuevo decodificador de decisión suave. [17]

Ejemplo de Matlab [ editar ]

Codificador [ editar ]

Aquí presentamos una implementación simple de Matlab para un codificador.

función  [codificada] = rsEncoder ( msg, m, prim_poly, n, k )   % RSENCODER Codificar mensaje con el algoritmo Reed-Solomon % m es el número de bits por símbolo % prim_poly: polinomio primitivo p (x). Es decir, para DM es 301 % k es el tamaño del mensaje % n es el tamaño total (k + redundante) % Ejemplo: msg = uint8 ('Prueba') % enc_msg = rsEncoder (mensaje, 8, 301, 12, numel (mensaje));  % Obtener el alfa alfa = gf ( 2 , m , prim_poly );      % Obtener el polinomio generador de Reed-Solomon g (x) g_x = genpoly ( k , n , alpha );      % Multiplique la información por X ^ (nk), o simplemente rellene con ceros al final para % consigue espacio para agregar la información redundante msg_padded = gf ([ msg zeros ( 1 , n - k )], m , prim_poly );          % Obtiene el resto de la división del mensaje extendido por el % Reed-Solomon generando polinomio g (x) [ ~ , resto ] = deconv ( msg_padded , g_x );      % Ahora devuelve el mensaje con la información redundante encoded = msg_padded - resto ;     final% Encuentre el polinomio generador de Reed-Solomon g (x), por cierto, este es el% igual que la función rsgenpoly en matlabfunción  g = genpoly ( k, n, alpha )   g = 1 ;   % Una multiplicación en el campo galois es solo una convolución para k = mod ( 1 : n - k , n )         g = conv ( g , [ 1 alpha . ^ ( k )]);       finalfinal

Decodificador [ editar ]

Ahora la parte de decodificación:

función [decodificado, error_pos, error_mag, g, S] = rsDecoder ( codificado, m, prim_poly, n, k )  % RSDECODER Decodificar un mensaje codificado Reed-Solomon % Ejemplo: % [dec, ​​~, ~, ~, ~] = rsDecoder (enc_msg, 8, 301, 12, numel (msg)) max_errors = piso (( n - k ) / 2 );       orig_vals = codificado . x ;   % Inicializar el vector de error errores = ceros ( 1 , n );    g = [];   S = [];    % Obtener el alfa alfa = gf ( 2 , m , prim_poly );      % Encuentre los síndromes (marque si divide el mensaje por el generador % polinomio el resultado es cero) Synd = polyval ( codificado , alfa . ^ ( 1 : n - k ));        Síndromes = trim ( Synd );    % Si todos los síndromes son ceros (perfectamente divisibles) no hay errores si está vacío ( Síndromes . x )  decodificado = orig_vals ( 1 : k );   error_pos = [];   error_mag = [];   g = [];   S = Synd ;   volver ; final  % Prepárese para el algoritmo euclidiano (se utiliza para encontrar el error de localización % polinomios) r0 = [ 1 , ceros ( 1 , 2 * max_errors )]; r0 = gf ( r0 , m , prim_poly ); r0 = recorte ( r0 );               size_r0 = longitud ( r0 );   r1 = síndromes ;   f0 = gf ([ ceros ( 1 , tamaño_r0 - 1 ) 1 ], m , prim_poly );         f1 = gf ( ceros ( 1 , tamaño_r0 ), m , prim_poly );      g0 = f1 ; g1 = f0 ;       % ¿El algoritmo euclidiano sobre los polinomios r0 (x) y los síndromes (x) en % orden para encontrar el error al localizar el polinomio si bien es cierto  % Haz una división larga [ cociente , resto ] = deconv ( r0 , r1 );     % Agrega algunos ceros cociente = almohadilla ( cociente , longitud ( g1 ));     % Hallar cociente * g1 y pad c = conv ( cociente , g1 );    c = recorte ( c );   c = almohadilla ( c , longitud ( g0 ));     % Actualizar g como cociente g0 * g1 g = g0 - c ;      % Compruebe si el grado del resto (x) es menor que max_errors si todo ( resto ( 1 : end - max_errors ) == 0 )      romper ; final  % Actualice r0, r1, g0, g1 y elimine los ceros iniciales r0 = recorte ( r1 ); r1 = recortar ( resto );      g0 = g1 ; g1 = g ;      final  % Eliminar ceros a la izquierda g = recorte ( g );    % Encuentre los ceros del polinomio de error en este campo de Galois evalPoly = polyval ( g , alpha . ^ ( n - 1 : - 1 : 0 ));             error_pos = gf ( buscar ( evalPoly == 0 ), m );       % Si no se encuentra ninguna posición de error devolvemos el trabajo recibido, porque % básicamente no es nada que podamos hacer y devolvemos el mensaje recibido si isEmpty ( error_pos )  decodificado = orig_vals ( 1 : k );   error_mag = [];   volver ; final  % Preparar un sistema lineal para resolver el polinomio de error y encontrar el error % magnitudes size_error = longitud ( error_pos );   Syndrome_Vals = Síndromes . x ;   b (:, 1 ) = Syndrome_Vals ( 1 : size_error );    para idx = 1 : size_error      e = alpha . ^ ( idx * ( n - error_pos . x ));         err = e . x ;   er ( idx , :) = err ;    final  % Resuelve el sistema lineal error_mag = ( gf ( er , m , prim_poly ) \ gf ( b , m , prim_poly )) ' ;         % Ponga la magnitud del error en el vector de error errores ( error_pos . x ) = error_mag . x ;   % Trae este vector al campo galois errors_gf = gf ( errores , m , prim_poly );      % Ahora para corregir los errores, simplemente agregue con el código codificado decoded_gf = codificado ( 1 : k ) + errores_gf ( 1 : k );     decodificado = decoded_gf . x ;   final% Eliminar ceros a la izquierda de la matriz de Galoisfunción  gt = recortar ( g )   gx = g . x ;   gt = gf ( gx ( encontrar ( gx , 1 ) : fin ), g . m , g . prim_poly );       final% Agregar ceros a la izquierdafunción  xpad = pad ( x, k )   len = longitud ( x );   si ( len < k )    xpad = [ ceros ( 1 , k - len ) x ];       finalfinal

Decodificadores de vista originales de Reed Solomon [ editar ]

Los decodificadores descritos en esta sección utilizan la vista original de Reed Solomon de una palabra de código como una secuencia de valores polinomiales donde el polinomio se basa en el mensaje que se va a codificar. El codificador y el descodificador utilizan el mismo conjunto de valores fijos, y el descodificador recupera el polinomio de codificación (y, opcionalmente, un polinomio de localización de errores) del mensaje recibido.

Decodificador teórico [ editar ]

Reed y Solomon (1960) describieron un decodificador teórico que corrigió errores al encontrar el polinomio de mensajes más popular. El decodificador sólo conoce el conjunto de valores dey qué método de codificación se utilizó para generar la secuencia de valores de la palabra de código. Se desconocen el mensaje original, el polinomio y cualquier error. Un procedimiento de decodificación podría usar un método como la interpolación de Lagrange en varios subconjuntos de n valores de palabras de código tomados k a la vez para producir repetidamente polinomios potenciales, hasta que se produzca un número suficiente de polinomios coincidentes para eliminar razonablemente cualquier error en la palabra de código recibida. Una vez que se determina un polinomio, cualquier error en la palabra de código puede corregirse volviendo a calcular los valores de la palabra de código correspondiente. Desafortunadamente, en todos los casos, excepto en el más simple, hay demasiados subconjuntos, por lo que el algoritmo no es práctico. El número de subconjuntos es el coeficiente binomial ,, y el número de subconjuntos es inviable incluso para códigos modestos. Para un código que pueda corregir 3 errores, el decodificador teórico ingenuo examinaría 359 mil millones de subconjuntos.

Decodificador Berlekamp Welch [ editar ]

En 1986, se desarrolló un decodificador conocido como el algoritmo de Berlekamp-Welch como un decodificador que es capaz de recuperar el polinomio del mensaje original así como un polinomio "localizador" de errores que produce ceros para los valores de entrada que corresponden a errores, con complejidad temporal O (n ^ 3), donde n es el número de valores en un mensaje. El polinomio recuperado se utiliza para recuperar (recalcular según sea necesario) el mensaje original.

Ejemplo [ editar ]

Usando RS (7,3), GF (929) y el conjunto de puntos de evaluación a i = i - 1

a = {0, 1, 2, 3, 4, 5, 6}

Si el polinomio del mensaje es

p ( x ) = 003 x 2 + 002 x + 001

La palabra clave es

c = {001, 006, 017, 034, 057, 086, 121}

Los errores en la transmisión pueden causar que esto se reciba en su lugar.

b = c + e = {001, 006, 123, 456, 057, 086, 121}

Las ecuaciones clave son:

Suponga el número máximo de errores: e = 2. Las ecuaciones clave se convierten en:

Usando eliminación gaussiana :

Q ( x ) = 003 x 4 + 916 x 3 + 009 x 2 + 007 x + 006
E ( x ) = 001 x 2 + 924 x + 006
Q ( x ) / E ( x ) = P ( x ) = 003 x 2 + 002 x + 001

Vuelva a calcular P (x) donde E (x) = 0: {2, 3} para corregir b dando como resultado la palabra de código corregida:

c = {001, 006, 017, 034, 057, 086, 121}

Decodificador Gao [ editar ]

En 2002, Shuhong Gao desarrolló un decodificador mejorado, basado en el algoritmo extendido de Euclid Gao_RS.pdf .

Ejemplo [ editar ]

Utilizando los mismos datos que en el ejemplo de Berlekamp Welch anterior:

Interpolación de Lagrange de para i = 1 an
Q ( x ) = R 2 = 266 x 4 + 086 x 3 + 798 x 2 + 311 x + 532
E ( x ) = UNA 2 = 708 x 2 + 176 x + 532

dividir Q (x) y E (x) por el coeficiente más significativo de E (x) = 708. (Opcional)

Q ( x ) = 003 x 4 + 916 x 3 + 009 x 2 + 007 x + 006
E ( x ) = 001 x 2 + 924 x + 006
Q ( x ) / E ( x ) = P ( x ) = 003 x 2 + 002 x + 001

Vuelva a calcular P ( x ) donde E ( x ) = 0: {2, 3} para corregir b dando como resultado la palabra de código corregida:

c = {001, 006, 017, 034, 057, 086, 121}

Ver también [ editar ]

  • Código BCH
  • Código cíclico
  • Búsqueda de Chien
  • Algoritmo de Berlekamp-Massey
  • Corrección de errores hacia adelante
  • Algoritmo de Berlekamp-Welch
  • Código plegado Reed-Solomon

Notas [ editar ]

  1. ^ Los autores en [8] proporcionan resultados de simulación que muestran que para la misma tasa de código (1/6) los códigos turbo superan a los códigos concatenados de Reed-Solomon hasta 2 dB ( tasa de error de bits ).

Referencias [ editar ]

  1. ^ Reed y Solomon (1960)
  2. ^ D. Gorenstein y N. Zierler, "Una clase de códigos de corrección de errores lineales cíclicos en símbolos p ^ m", J. SIAM, vol. 9, págs.207-214, junio de 1961
  3. ^ Error al corregir códigos de W_Wesley_Peterson, 1961
  4. ^ Error al corregir códigos de W_Wesley_Peterson, segunda edición, 1972
  5. ^ Yasuo Sugiyama, Masao Kasahara, Shigeichi Hirasawa y Toshihiko Namekawa. Un método para resolver la ecuación clave para decodificar códigos Goppa. Information and Control, 27: 87–99, 1975.
  6. ^ Immink, KAS (1994), "Códigos Reed-Solomon y el disco compacto", en Wicker, Stephen B .; Bhargava, Vijay K. (eds.), Códigos Reed-Solomon y sus aplicaciones , IEEE Press , ISBN 978-0-7803-1025-4
  7. ^ J. Hagenauer, E. Offer y L. Papke, Códigos de Reed Solomon y sus aplicaciones. Nueva York IEEE Press, 1994 - p. 433
  8. ^ a b Andrews, Kenneth S., et al. "El desarrollo de códigos turbo y LDPC para aplicaciones en el espacio profundo". Actas del IEEE 95.11 (2007): 2142-2156. Error de cita: la referencia denominada "Andrews, 2007" se definió varias veces con contenido diferente (consulte la página de ayuda ).
  9. ^ Ver Lin y Costello (1983 , p. 171), por ejemplo.
  10. ^ "Expresiones analíticas utilizadas en bercoding y BERTool" . Archivado desde el original el 1 de febrero de 2019 . Consultado el 1 de febrero de 2019 .
  11. ^ Pfender, Florian; Ziegler, Günter M. (septiembre de 2004), "Kissing Numbers, Sphere Packings, and Some Unexpected Proofs" (PDF) , Notices of the American Mathematical Society , 51 (8): 873–883, archivado (PDF) desde el original en 2008-05-09 , consultado el 2009-09-28 . Explica el teorema de Delsarte-Goethals-Seidel como se usa en el contexto del código de corrección de errores para discos compactos .
  12. ^ D. Gorenstein y N. Zierler, "Una clase de códigos de corrección de errores lineales cíclicos en símbolos p ^ m", J. SIAM, vol. 9, págs. 207–214, junio de 1961
  13. ^ Error al corregir códigos por W Wesley Peterson, 1961
  14. ^ Shu Lin y Daniel J. Costello Jr, "Codificación de control de errores" segunda edición, págs. 255-262, 1982, 2004
  15. ^ Guruswami, V .; Sudan, M. (septiembre de 1999), "Decodificación mejorada de códigos Reed-Solomon y códigos de geometría algebraica", IEEE Transactions on Information Theory , 45 (6): 1757-1767, CiteSeerX 10.1.1.115.292 , doi : 10.1109 / 18.782097 
  16. ^ Koetter, Ralf; Vardy, Alexander (2003). "Decodificación algebraica de decisión suave de códigos Reed-Solomon". Transacciones IEEE sobre teoría de la información . 49 (11): 2809-2825. CiteSeerX 10.1.1.13.2021 . doi : 10.1109 / TIT.2003.819332 . 
  17. ^ Franke, Steven J .; Taylor, Joseph H. (2016). "Decodificador de decisión suave de código abierto para el código JT65 (63,12) Reed-Solomon" (PDF) . QEX (mayo / junio): 8–17. Archivado (PDF) desde el original el 9 de marzo de 2017 . Consultado el 7 de junio de 2017 .

Lectura adicional [ editar ]

  • Gill, John (sf), EE387 Notes # 7, Handout # 28 (PDF) , Stanford University, archivado del original (PDF) el 30 de junio de 2014 , consultado el 21 de abril de 2010
  • Hong, Jonathan; Vetterli, Martin (agosto de 1995), "Algoritmos simples para decodificación BCH" (PDF) , IEEE Transactions on Communications , 43 (8): 2324-2333, doi : 10.1109 / 26.403765
  • Lin, Shu; Costello, Jr., Daniel J. (1983), Codificación de control de errores: fundamentos y aplicaciones , Nueva Jersey, Nueva Jersey: Prentice-Hall, ISBN 978-0-13-283796-5
  • Massey, JL (1969), "Síntesis de registro de desplazamiento y decodificación BCH" (PDF) , IEEE Transactions on Information Theory , IT-15 (1): 122-127, doi : 10.1109 / tit.1969.1054260
  • Peterson, Wesley W. (1960), "Procedimientos de codificación y corrección de errores para los códigos Bose-Chaudhuri", IRE Transactions on Information Theory , IT-6 (4): 459–470, doi : 10.1109 / TIT.1960.1057586
  • Reed, Irving S .; Solomon, Gustave (1960), "Códigos polinomiales sobre ciertos campos finitos", Revista de la Sociedad de Matemáticas Industriales y Aplicadas , 8 (2): 300-304, doi : 10.1137 / 0108018
  • Welch, LR (1997), La vista original de los códigos Reed-Solomon (PDF) , Notas de la conferencia
  • Berlekamp, ​​Elwyn R. (1967), decodificación BCH no binaria , Simposio internacional sobre teoría de la información, San Remo, Italia
  • Berlekamp, ​​Elwyn R. (1984) [1968], Teoría de la codificación algebraica (edición revisada), Laguna Hills, CA: Aegean Park Press, ISBN 978-0-89412-063-3
  • Cipra, Barry Arthur (1993), "Los códigos ubicuos Reed-Solomon" , SIAM News , 26 (1)
  • Forney, Jr., G. (octubre de 1965), "On Decoding BCH Codes", IEEE Transactions on Information Theory , 11 (4): 549–557, doi : 10.1109 / TIT.1965.1053825
  • Koetter, Ralf (2005), Reed-Solomon Codes , MIT Lecture Notes 6.451 (video), archivado desde el original el 13 de marzo de 2013
  • MacWilliams, FJ; Sloane, NJA (1977), The Theory of Error-Correcting Codes , Nueva York, NY: North-Holland Publishing Company
  • Reed, Irving S .; Chen, Xuemin (1999), Codificación de control de errores para redes de datos , Boston, MA: Kluwer Academic Publishers

Enlaces externos [ editar ]

Información y tutoriales [ editar ]

  • Introducción a los códigos Reed-Solomon: principios, arquitectura e implementación (CMU)
  • Un tutorial sobre la codificación Reed-Solomon para la tolerancia a fallas en sistemas similares a RAID
  • Decodificación suave algebraica de códigos Reed-Solomon
  • Wikiversity: códigos Reed-Solomon para codificadores
  • Informe técnico de investigación y desarrollo de la BBC WHP031
  • Geisel, William A. (agosto de 1990), Tutorial sobre codificación de corrección de errores Reed-Solomon (PDF) , Memorando técnico, NASA , TM-102162
  • Gao, Shuhong (enero de 2002), nuevo algoritmo para decodificar códigos Reed-Solomon (PDF) , Clemson
  • Códigos concatenados por el Dr. Dave Forney (scholarpedia.org).

Implementaciones [ editar ]

  • Códec Schifra de código abierto C ++ Reed-Solomon
  • Biblioteca RSCode de Henry Minsky, codificador / decodificador Reed-Solomon
  • Biblioteca de decodificación suave C ++ Reed – Solomon de código abierto
  • Implementación de Matlab de errores y borrados Decodificación Reed-Solomon
  • Implementación de octava en paquete de comunicaciones
  • Implementación en Python puro de un códec Reed-Solomon