2009-12-09 14 views
9

Estoy buscando un código de corrección de errores directo que sea relativamente fácil/rápido de codificar en un microcontrolador; La decodificación se realizará en una PC, por lo que puede ser más complicado.códigos de corrección de errores destinados a CPUs lentas que transmiten a CPUs rápidas

No sé mucho sobre los códigos de corrección de errores y, a excepción de los simples códigos de Hamming, todos parecen ser más complicados de lo que puedo manejar.

¿Alguna recomendación?

edición: Voy a cortar las cosas a corto y aceptar la respuesta de Carl ... supongo que había dos cosas que no he mencionado:

(1) que hago no es estrictamente necesario la corrección de errores, es una ventaja para mí, y pensé que podría haber algún algoritmo de corrección de errores que fuera un beneficio razonable a un costo mínimo. Los códigos de Hamming son probablemente los adecuados y hasta parecen ser demasiado costosos para mi aplicación de codificación.

(2) La mayor ventaja que la corrección de errores en sí es la capacidad de resincronizar correctamente a los paquetes que siguen a un error. (Si me desincronizo durante mucho tiempo, eso es malo). Así que creo que es mejor si mantengo las cosas simples.

+0

Upvoted, porque es una pregunta interesante, y porque puedo necesitar la ayuda de personas más inteligentes. También, sugerencias actualizadas en mis comentarios. –

Respuesta

3

El problema con los códigos de corrección de errores es que le permiten recuperarse de un bit o quizás de 2 bits de errores, pero generalmente no detectan ni reparan el daño mayor.

Por lo tanto, mi recomendación sería dividir sus flujos de datos en bloques (1 KB, 10 KB, ... 1 MB como máximo) y calcular una suma de comprobación para cada bloque. Luego, cuando los datos lleguen a la otra CPU, puede determinar si es correcta y solicitar la retransmisión de ese bloque si no es así. Entonces, la computadora receptora reconocería y esperaría al siguiente bloque, o reconocería negativamente y esperaría un nuevo envío.

Sí, estamos implementando un subconjunto de TCP/IP aquí. Pero hay una razón por la cual este protocolo fue tan exitoso: ¡Funciona!

Para una suma de comprobación, recomendaría CRC-32. Requiere una tabla de (creo) 256 números de 32 bits y algunos cálculos bastante fáciles (indexación de matrices, OR y XOR, en su mayoría), por lo que es bastante fácil de computar para una CPU "tonta".

+1

en otras palabras, defiende la corrección de errores sin previo aviso, y en su lugar a un protocolo "interactivo" más convencional con sumas de comprobación y acuse de recibo y lo que no. El uso de acuses de recibo explícitos en esta aplicación no es práctico (la latencia del ciclo sería intolerable en comparación con el rendimiento que necesito), así que no es lo que estoy buscando, pero un consejo como este es útil para otras aplicaciones. –

+0

Oh, está bien. Eso cambia las cosas un poco. En mi experiencia, y de hecho he programado IO en sistemas integrados de microcomputadora, la comunicación funciona sin problemas o no funciona. A menos que se encuentre en un entorno muy ruidoso, no obtendrá el tipo de errores manejados por la corrección de un solo bit. Sé que esto todavía no ayuda con tu pregunta original ... Iré a ver qué puedo desenterrar. –

+0

OK, he consultado los artículos y referencias de la Wikipedia ... Probablemente podría implementar uno de los algoritmos propuestos, pero sería un dolor de cabeza. ¿Tienes suficiente ancho de banda que te puedes permitir hacer algo estúpido y simple? Envíe sus datos en bloques, y envíe cada bloque 3 veces. Por cada bit, lo mejor es 2 de 3 victorias. Un algoritmo ECC directo completo, descrito en 2 oraciones :) –

4

No he entendido bien la cantidad de sobrecarga que puede pagar. En su comentario, dice que un código de detección/corrección de errores de 16 bits es correcto, pero no especifica qué tan grande de un bloque está pensando en adjuntarlo. Para ser significativo, probablemente debería expresar la sobrecarga permisible como un porcentaje. 16 bits de corrección de errores para 64 bits de datos es muy diferente de 16 bits de corrección de errores de un kilobyte de datos.

Si puede pagar algo así como un 15-20% de gastos generales, puede usar un código convolucional con decodificador Viterbi. Esto es altamente asimétrico: el codificador convolucional es bastante simple (básicamente un registro de desplazamiento, con derivaciones de salida que conducen a XOR). Una muy grande podría usar un registro de 16 bits con una media docena de XOR's.

Afortunadamente usted tiene una computadora más resistente para manejar la decodificación, porque un decodificador de Viterbi puede ser una bestia temible. Especialmente cuando usa un codificador más grande para reducir la sobrecarga, el tamaño del decodificador explota. El tamaño del decodificador es exponencial con respecto al tamaño del grupo de códigos.

Se mencionaron los códigos turbo.Estos pueden hacer un mejor uso del ancho de banda disponible que los códigos convolucionales con decodificadores Viterbi, pero usan un codificador considerablemente más complejo: un mínimo de dos codificadores convolucionales de un tipo específico (codificadores convolucionales sistemáticos recursivos). Como tales, tampoco parecen ajustarse a sus especificaciones.

+0

re: overhead: no mucho, ni en datos ni en cómputo. los paquetes son cortos, 8-16 bytes típicos, y no quiero ver más de 16 bits por paquete. La complejidad computacional de tener una unidad de código diferente de una unidad de paquete (por ejemplo, múltiples paquetes por código o múltiples códigos por paquete) es probablemente inaceptable.Y, desafortunadamente, se ha eliminado una solución de hardware, por lo que incluso un codificador convolucional, si lo entiendo bien, probablemente sea demasiado trabajo en software. Pero +1 para una buena explicación + sugerencias. –

0

Sugiero utilizar una forma de paquete de corrección de errores de envío. Si tiene que enviar seis paquetes de igual longitud, envíe a cada uno de ellos con suficiente información para identificarlo como "paquete 1 de 6", "2 de 6", etc. junto con un paquete más cuyo primer byte de carga es el xor de el primer byte de carga útil de los paquetes 1-6, cuyo segundo byte de carga útil es el xor del segundo byte del paquete 1-6, etc. El código que recibe seis paquetes de los siete totales podrá reconstruir el que falta. Como una pequeña mejora, use un paquete de "paridad" para los paquetes "pares" y otro para los "impares". Si lo hace, el sistema podrá recuperarse de cualquier error de ráfaga que no sea más largo que un paquete.

Cuestiones relacionadas