Código gris

Ajustar Compartir Imprimir Citar
Código lucal
54321
Código gris
4321
000000
100011
200110
300101
401100
501111
601010
701001
811000
911011
1011110
1111101
1210100
1310111
1410010
1510001

El código binario reflejado (RBC), también conocido como binario reflejado (RB) o código Gray en honor a Frank Gray, es una ordenación del sistema numérico binario tal que dos valores sucesivos difieren en un solo bit (dígito binario).

Por ejemplo, la representación del valor decimal "1" en binario normalmente sería "001" y "2" sería "010". En código Gray, estos valores se representan como "001" y "011". De esa manera, incrementar un valor de 1 a 2 requiere solo un bit para cambiar, en lugar de dos.

Los códigos grises se utilizan ampliamente para evitar salidas falsas de interruptores electromecánicos y para facilitar la corrección de errores en comunicaciones digitales, como la televisión digital terrestre y algunos sistemas de televisión por cable.

Función

Muchos dispositivos indican la posición cerrando y abriendo interruptores. Si ese dispositivo usa códigos binarios naturales, las posiciones 3 y 4 están una al lado de la otra, pero los tres bits de la representación binaria difieren:

Decimalbinario
......
3011
4100
......

El problema con los códigos binarios naturales es que los interruptores físicos no son ideales: es muy poco probable que los interruptores físicos cambien de estado exactamente en sincronía. En la transición entre los dos estados que se muestran arriba, los tres interruptores cambian de estado. En el breve período mientras todos están cambiando, los interruptores leerán alguna posición falsa. Incluso sin keybounce, la transición podría verse como 011001101100. Cuando los interruptores parecen estar en la posición 001, el observador no puede decir si ese es el "real" posición 1, o un estado de transición entre otras dos posiciones. Si la salida alimenta un sistema secuencial, posiblemente a través de una lógica combinacional, entonces el sistema secuencial puede almacenar un valor falso.

Este problema puede resolverse cambiando solo un interruptor a la vez, por lo que nunca hay ambigüedad de posición, lo que resulta en códigos que asignan a cada uno de un conjunto contiguo de números enteros, o a cada miembro de una lista circular, una palabra de símbolos tal que no hay dos palabras de código idénticos y cada dos palabras de código adyacentes difieren exactamente en un símbolo. Estos códigos también se conocen como unidad-distancia, single-distance, single-step, monostrophic o códigos sincopicos, en referencia a la distancia de Hamming de 1 entre códigos adyacentes.

Invención

La patente de Gray introduce el término "código binario reflejado"

En principio, puede haber más de un código de este tipo para una longitud de palabra dada, pero el término código Gray se aplicó por primera vez a un código binario particular para enteros no negativos, el código Gray reflejado en binario, o BRGC. Investigador de Bell Labs George R. Stibitz describió un código de este tipo en una solicitud de patente de 1941, concedida en 1943. Frank Gray introdujo el término código binario reflejado en su solicitud de patente de 1947, y señaló que el código "todavía no tenía sin nombre reconocido". Derivó el nombre del hecho de que "puede construirse a partir del código binario convencional mediante una especie de proceso de reflexión".

En la codificación estándar, el bit menos significativo sigue un patrón repetitivo de 2 encendido, 2 apagado (… 11001100 …); el siguiente dígito un patrón de 4 encendido, 4 apagado; el nésimo bit menos significativo un patrón de 2n encendido 2n apagado. La versión de cuatro bits de esto se muestra a continuación:

Visualizado como traversal de vértices de un tesseract
Código gris a lo largo de la línea número
DecimalbinarioGrayDecimal
de Gray
0000000000
1000100011
2001000113
3001100102
4010001106
5010101117
6011001015
7011101004
81000110012
91001110113
10Graben 19, 1010111115
111011111014
121100Graben 19, 101010
131101101111
14111010019
15111110008

Para el decimal 15, el código pasa al decimal 0 con solo un cambio de interruptor. Esto se denomina propiedad cíclica o de adyacencia del código.

En las comunicaciones digitales modernas, los códigos Gray juegan un papel importante en la corrección de errores. Por ejemplo, en un esquema de modulación digital como QAM, donde los datos se transmiten típicamente en símbolos de 4 bits o más, el diagrama de constelación de la señal se organiza de modo que los patrones de bits transmitidos por los puntos de constelación adyacentes difieran solo en un bit. Al combinar esto con la corrección de errores hacia adelante capaz de corregir errores de un solo bit, es posible que un receptor corrija cualquier error de transmisión que provoque que un punto de la constelación se desvíe hacia el área de un punto adyacente. Esto hace que el sistema de transmisión sea menos susceptible al ruido.

A pesar de que Stibitz describió este código antes que Gray, el código binario reflejado recibió más tarde el nombre de Gray por otros que lo usaron. Dos solicitudes de patente diferentes de 1953 utilizan el "código Gray" como nombre alternativo para el "código binario reflejado"; uno de ellos también enumera "código de error mínimo" y "código de permutación cíclica" entre los nombres. Una solicitud de patente de 1954 hace referencia al "código Bell Telephone Gray". Otros nombres incluyen "código binario cíclico", "código de progresión cíclica", "binario de permutación cíclica" o "binario permutado cíclico" (CPB).

El código Gray a veces se atribuye erróneamente al inventor de dispositivos eléctricos del siglo XIX, Elisha Gray.

Historia y aplicación práctica

Acertijos matemáticos

Los códigos binarios reflejados se aplicaron a los acertijos matemáticos antes de que los ingenieros los conocieran.

El código Gray reflejado en binario representa el esquema subyacente del rompecabezas de anillos chino clásico, un mecanismo de rompecabezas mecánico secuencial descrito por el francés Louis Gros en 1872.

Puede servir como una guía de solución para el problema de las Torres de Hanoi, basado en un juego del francés Édouard Lucas en 1883. De manera similar, las configuraciones de juego denominadas Torres de Bucarest y Torres de Klagenfurt producen códigos Gray ternarios y pentarios..

Martin Gardner escribió un relato popular del código Gray en su columna Juegos matemáticos de agosto de 1972 en Scientific American.

El código también forma un ciclo hamiltoniano en un hipercubo, donde cada bit se ve como una dimensión.

Códigos de telegrafía

Cuando el ingeniero francés Émile Baudot dejó de usar un 6 código de unidad (6 bits) a código de 5 unidades para su sistema de telégrafo de impresión, en 1875 o 1876, ordenó los caracteres alfabéticos en su rueda de impresión usando un código binario reflejado, y asignó los códigos usando solo tres de los bits para vocales Con las vocales y consonantes ordenadas en su orden alfabético y otros símbolos colocados apropiadamente, el código de caracteres de 5 bits ha sido reconocido como un código binario reflejado. Este código se conoció como código Baudot y, con cambios menores, finalmente se adoptó como Alfabeto Telegráfico Internacional No. 1 (ITA1, CCITT-1) en 1932.

Casi al mismo tiempo, el alemán-austríaco Otto Schäffler [de] demostró otro telégrafo de impresión en Viena usando un código binario reflejado de 5 bits para el mismo propósito, en 1874.

Conversión de señal analógica a digital

Frank Gray, que se hizo famoso por inventar el método de señalización que llegó a usarse para la televisión en color compatible, inventó un método para convertir señales analógicas en grupos de códigos binarios reflejados utilizando un aparato basado en tubos de vacío. Presentado en 1947, el método y el aparato obtuvieron una patente en 1953, y el nombre de Gray se mantuvo en los códigos. El "tubo PCM" El aparato que Gray patentó fue fabricado por Raymond W. Sears de Bell Labs, en colaboración con Gray y William M. Goodall, quienes le dieron crédito a Gray por la idea del código binario reflejado.

Parte frontal de la patente de Gray, mostrando tubo PCM (10) con código binario reflejado en la placa (15)

Gray estaba más interesado en usar los códigos para minimizar los errores en la conversión de señales analógicas a digitales; sus códigos todavía se utilizan hoy para este propósito.

Codificadores de posición

Codificador rotativo para dispositivos de medición de ángulo marcado en código gris de 3 bits (BRGC)
Un encoder rotativo absoluto de código gris con 13 pistas. Vivienda, disco interrumpidor y fuente de luz están en la parte superior; elementos de detección y componentes de soporte están en la parte inferior.

Los códigos Gray se utilizan en codificadores de posición rotatorios y lineales (codificadores absolutos y codificadores de cuadratura) con preferencia a la codificación binaria ponderada. Esto evita la posibilidad de que, cuando varios bits cambien en la representación binaria de una posición, se produzca una lectura incorrecta debido a que algunos de los bits cambian antes que otros.

Por ejemplo, algunos codificadores rotatorios proporcionan un disco que tiene un patrón de código Gray conductor de electricidad en anillos concéntricos (pistas). Cada pista tiene un contacto de resorte de metal estacionario que proporciona contacto eléctrico al patrón de código conductivo. Juntos, estos contactos producen señales de salida en forma de código Gray. Otros codificadores emplean mecanismos sin contacto basados en sensores ópticos o magnéticos para producir las señales de salida del código Gray.

Independientemente del mecanismo o la precisión de un codificador en movimiento, el error de medición de posición puede ocurrir en posiciones específicas (en los límites del código) porque el código puede estar cambiando en el momento exacto en que se lee (muestra). Un código de salida binario podría causar errores de medición de posición significativos porque es imposible hacer que todos los bits cambien exactamente al mismo tiempo. Si, en el momento de muestrear la posición, algunos bits han cambiado y otros no, la posición muestreada será incorrecta. En el caso de los codificadores absolutos, la posición indicada puede estar muy lejos de la posición real y, en el caso de los codificadores incrementales, esto puede dañar el seguimiento de la posición.

Por el contrario, el código Gray utilizado por los codificadores de posición garantiza que los códigos de dos posiciones consecutivas cualesquiera diferirán en solo un bit y, en consecuencia, solo un bit puede cambiar a la vez. En este caso, el error de posición máximo será pequeño, indicando una posición adyacente a la posición real.

Algoritmos genéticos

Debido a las propiedades de distancia de Hamming de los códigos Gray, a veces se utilizan en algoritmos genéticos. Son muy útiles en este campo, ya que las mutaciones en el código permiten cambios mayormente incrementales, pero ocasionalmente un solo cambio de bit puede causar un gran salto y dar lugar a nuevas propiedades.

Minimización de circuitos booleanos

Los códigos Gray también se utilizan para etiquetar los ejes de los mapas de Karnaugh desde 1953, así como en los gráficos circulares de Händler desde 1958, ambos métodos gráficos para la minimización de circuitos lógicos.

Corrección de errores

En las comunicaciones digitales modernas, los códigos Gray juegan un papel importante en la corrección de errores. Por ejemplo, en un esquema de modulación digital como QAM, donde los datos se transmiten típicamente en símbolos de 4 bits o más, el diagrama de constelación de la señal se organiza de modo que los patrones de bits transmitidos por los puntos de constelación adyacentes difieran solo en un bit. Al combinar esto con la corrección de errores hacia adelante capaz de corregir errores de un solo bit, es posible que un receptor corrija cualquier error de transmisión que provoque que un punto de la constelación se desvíe hacia el área de un punto adyacente. Esto hace que el sistema de transmisión sea menos susceptible al ruido.

Comunicación entre dominios de reloj

Los diseñadores de lógica digital utilizan mucho los códigos Gray para pasar información de conteo de bits múltiples entre lógica síncrona que opera a diferentes frecuencias de reloj. Se considera que la lógica opera en diferentes "dominios de reloj". Es fundamental para el diseño de chips grandes que funcionan con muchas frecuencias de reloj diferentes.

Recorrer estados en bicicleta con el mínimo esfuerzo

Si un sistema tiene que pasar por todas las combinaciones posibles de estados de encendido y apagado de algún conjunto de controles, y los cambios de los controles requieren gastos no triviales (por ejemplo, tiempo, desgaste, trabajo humano), un código Gray minimiza el número de cambios de configuración a un solo cambio para cada combinación de estados. Un ejemplo sería probar un sistema de tuberías para todas las combinaciones de ajustes de sus válvulas operadas manualmente.

Se puede construir un código Gray equilibrado, que cambia cada bit con la misma frecuencia. Dado que los cambios de bits se distribuyen uniformemente, esto es óptimo de la siguiente manera: los códigos Gray equilibrados minimizan el recuento máximo de cambios de bits para cada dígito.

Contadores de código gris y aritmética

George R. Stibitz ya utilizó un código binario reflejado en un dispositivo contador de pulsos binarios en 1941.

Un uso típico de los contadores de código Gray es crear un búfer de datos FIFO (primero en entrar, primero en salir) que tiene puertos de lectura y escritura que existen en diferentes dominios de reloj. Los contadores de entrada y salida dentro de un FIFO de puerto dual de este tipo a menudo se almacenan utilizando código Gray para evitar que se capturen estados transitorios no válidos cuando el conteo cruza los dominios del reloj. Los punteros de lectura y escritura actualizados deben pasar entre dominios de reloj cuando cambian, para poder rastrear el estado FIFO vacío y lleno en cada dominio. Cada bit de los punteros se muestrea de forma no determinista para esta transferencia de dominio de reloj. Entonces, para cada bit, se propaga el valor anterior o el valor nuevo. Por lo tanto, si más de un bit en el puntero de múltiples bits está cambiando en el punto de muestreo, un "incorrecto" el valor binario (ni nuevo ni antiguo) se puede propagar. Al garantizar que solo puede cambiar un bit, los códigos Gray garantizan que los únicos valores muestreados posibles son el valor de varios bits nuevo o antiguo. Por lo general, se utilizan códigos grises de longitud de potencia de dos.

A veces, los buses digitales en los sistemas electrónicos se utilizan para transmitir cantidades que solo pueden aumentar o disminuir de una en una, por ejemplo, la salida de un contador de eventos que se pasa entre dominios de reloj o a un convertidor de digital a analógico.. La ventaja de los códigos Gray en estas aplicaciones es que las diferencias en los retrasos de propagación de los muchos cables que representan los bits del código no pueden hacer que el valor recibido pase por estados que están fuera de la secuencia del código Gray. Esto es similar a la ventaja de los códigos Gray en la construcción de codificadores mecánicos, sin embargo, la fuente del código Gray es un contador electrónico en este caso. El contador en sí debe contar en código Gray, o si el contador funciona en binario, entonces el valor de salida del contador debe volver a sincronizarse después de que se haya convertido a código Gray, porque cuando un valor se convierte de binario a código Gray, es posible que las diferencias en los tiempos de llegada de los bits de datos binarios al circuito de conversión de binario a gris significarán que el código podría pasar brevemente por estados que están fuera de secuencia. Agregar un registro cronometrado después del circuito que convierte el valor de conteo en código Gray puede introducir un ciclo de reloj de latencia, por lo que contar directamente en código Gray puede ser ventajoso.

Para producir el siguiente valor de conteo en un contador de código Gray, es necesario tener alguna lógica combinacional que incremente el valor de conteo actual que se almacena. Una forma de incrementar un número de código Gray es convertirlo en código binario ordinario, agregarle uno con un sumador binario estándar y luego convertir el resultado nuevamente en código Gray. Otros métodos de conteo en código Gray se analizan en un informe de Robert W. Doran, incluida la toma de la salida de los primeros pestillos de los flip-flops maestro-esclavo en un contador de ondas binarias.

Direccionamiento de código gris

Como la ejecución del código del programa generalmente provoca un patrón de acceso a la memoria de instrucciones de direcciones localmente consecutivas, las codificaciones de bus que usan direccionamiento de código Gray en lugar de direccionamiento binario pueden reducir significativamente la cantidad de cambios de estado de los bits de dirección, lo que reduce el consumo de energía de la CPU. en algunos diseños de bajo consumo.

Construcción de un código Gray de n bits

Los primeros pasos del método reflect-and-prefix.
4-bit Permutación del código gris

La lista de código Gray reflejada en binario para n bits se puede generar recursivamente a partir de la lista para n − 1 bits reflejando la lista (es decir, enumerando las entradas al revés orden), prefijando las entradas en la lista original con un binario 0, prefijando las entradas en la lista reflejada con un binario 1 y luego concatenar la lista original con la lista invertida. Por ejemplo, generar la lista n = 3 a partir de la lista n = 2:

2-bit list: 00, 01, 11, 10
Reflejado: 10, 11, 01, 00
Entradas antiguas con prefijo 0: 000, 001, 011, 010,
Prefijo nuevas entradas con 1: 110, 111, 101, 100
Concatenado: 000, 001, 011, 010, 110, 111, 101, 100

El código Gray de un bit es G1 = (0,1). Se puede pensar que se construyó recursivamente como se indicó anteriormente a partir de un código Gray de cero bits G0 = (Λ) que consta de una sola entrada de longitud cero. Este proceso iterativo de generar Gn+1 a partir de Gn aclara las siguientes propiedades del código estándar de reflexión:

Estas características sugieren un método simple y rápido de traducir un valor binario en el correspondiente código Gray. Cada bit se invierte si el siguiente bit más alto del valor de entrada se establece en uno. Esto se puede realizar en paralelo por un bit-shift y operación exclusiva si están disponibles: el nel código gris se obtiene por computación . Prependiendo de 0 bit deja el orden de las palabras clave sin cambios, prependiendo de un 1 bit revierte el orden de las palabras clave. Si los bits en posición de las palabras clave son invertidos, el orden de bloques vecinos Las palabras clave se revierten. Por ejemplo, si el bit 0 se invierte en una secuencia de palabras clave de 3 bits, el orden de dos palabras clave vecinas se invierte

000,001,010,011,100,101,110,111 → 001,000,011,010,101,100,111,110 (invert bit 0)

Si se invierte el bit 1, los bloques de 2 palabras clave cambian de orden:

000,001,010,011,100,101,110,111 → 010,011,000,001,110,111,100,101 (invertir bit 1)

Si se invierte el bit 2, los bloques de 4 palabras de código se invierten:

000,001,010,011,100,101,110,111 → 100,101,110,111,000,001,010,011 (invert bit 2)

Por lo tanto, realizar una exclusiva o un poco en posición con el bit en posición deja el orden de las palabras clave intactas si , y revierte el orden de bloques codewords si . Ahora, esta es exactamente la misma operación que el método reflect-and-prefix para generar el código Gray.

Un método similar se puede utilizar para realizar la traducción inversa, pero la computación de cada bit depende del valor calculado de la próxima parte superior, por lo que no se puede realizar en paralelo. Sumas es un poco codificado por Gray ( ser el bit más importante), y es t bit de código binario ( siendo el bit más significativo), la traducción inversa se puede dar recursivamente: , y . Alternativamente, decodificar un código gris en un número binario se puede describir como una suma prefijo de los bits en el código gris, donde cada operación de summación individual en la suma prefijo se realiza modulo dos.

Para construir el reflejo binario Código gris iterativamente, a paso 0 comienza con el , y a paso encontrar la posición de bit del menos significativo 1 en la representación binaria de y voltear el bit en esa posición en el código anterior para obtener el siguiente código . Las posiciones del bit comienzan 0, 1, 0, 2, 0, 1, 0, 3,... Vea el primer set para algoritmos eficientes para calcular estos valores.

Conversión ay desde código Gray

Las siguientes funciones en C convierten entre números binarios y sus códigos Gray asociados. Si bien puede parecer que la conversión de Gray a binario requiere que cada bit se maneje uno a la vez, existen algoritmos más rápidos.

Tipodef no firmado int Uint;// Esta función convierte un número binario no firmado para reflejar código binario Gray.Uint BinaryToGray()Uint num){} retorno num ^ ()num > 1); // La operadora √Īo está cambiando a la derecha. El operador ^ es exclusivo o.}// Esta función convierte un número de código binario Gray en un número binario.Uint GrayToBinary()Uint num){} Uint máscara = num; mientras ()máscara) {} // Cada uno El bit de código gris es exclusivo con todos los bits más significativos. máscara > 1; num ^= máscara; } retorno num;}// Una versión más eficiente para códigos grises 32 bits o menos a través del uso de técnicas SWAR (SIMD dentro de un registro). // Implementa una función paralela de prefijo XOR. Las declaraciones de asignación pueden estar en cualquier orden.// // Esta función se puede adaptar para códigos grises más largos añadiendo pasos.Uint GrayToBinary32()Uint num){} num ^= num > 16; num ^= num > 8; num ^= num > 4; num ^= num > 2; num ^= num > 1; retorno num;}// Una variante de cuatro bits a cero cambia un número binario (abcd)2 a (abcd)2 ^ (00ab)2, luego a (abcd)2 ^ (00ab)2 ^ (0abc)2 ^ (000a)2.

En los procesadores más nuevos, la cantidad de instrucciones ALU en el paso de decodificación se puede reducir aprovechando el conjunto de instrucciones CLMUL. Si MASK es la cadena binaria constante de unos terminada con un solo dígito cero, entonces la multiplicación sin acarreo de MASK con la codificación gris de x siempre dará x o su negación bit a bit.

Tipos especiales de códigos Gray

En la práctica, el "código Gray" casi siempre se refiere a un código Gray reflejado binario (BRGC). Sin embargo, los matemáticos han descubierto otros tipos de códigos Gray. Al igual que los BRGC, cada uno consiste en una lista de palabras, donde cada palabra difiere de la siguiente en solo un dígito (cada palabra tiene una distancia de Hamming de 1 desde la siguiente palabra).

Códigos grises de n bits y de longitud inferior a 2n

Es posible construir códigos Gray binarios con n bits con una longitud inferior a 2n , si la longitud es uniforme. Una posibilidad es comenzar con un código Gray equilibrado y eliminar pares de valores al principio y al final, o en el medio. La secuencia OEIS A290772 da el número de posibles secuencias grises de longitud 2 n que incluyen cero y utilizan el número mínimo de bits.

Código Gray N-ario

Número de Ternario → ternary Gray code

0 → 000
1 → 001
2 → 002
10 → 012
11 → 011
12 → 010
20 → 020
21 → 021
22 → 022
100 → 122
101 → 121
102 → 120
110 → 110
111 → 111
112 → 112
120 → 102
121 → 101
122 → 100
200 → 200
201 → 201
202 → 202
210 → 212
211 → 211
212 → 210
220 → 220
221 → 221

222 → 222

Hay muchos tipos especializados de códigos Gray además del código Gray reflejado en binario. Uno de estos tipos de código Gray es el código n-ary Gray, también conocido como código Gray no booleano. Como su nombre lo indica, este tipo de código Gray utiliza valores no booleanos en sus codificaciones.

Por ejemplo, un código Gray 3-ario (ternario) usaría los valores 0,1,2. El (n, k)-código Gray es el código n-ario Gray con k< /i> dígitos. La secuencia de elementos en el código (3, 2)-Gray es: 00,01,02,12,11,10,20,21,22. El código (n, k)-Gray se puede construir de forma recursiva, como el BRGC, o se puede construir de forma iterativa. Se presenta un algoritmo para generar iterativamente el código (N, k)-Gray (en C):

// entradas: base, dígitos, valor// salida: Gray// Convertir un valor en un código gris con la base y los dígitos dados.// La iteración a través de una secuencia de valores resultaría en una secuencia// de códigos grises en los que sólo un dígito cambia a la vez.vacío toGray()no firmado base, no firmado dígitos, no firmado valor, no firmado gris[dígitos]){} no firmado baseN[dígitos];// Almacena el número base-N ordinario, un dígito por entradano firmado i;// La variable de bucle // Ponga el número baseN normal en el array baseN. Para la base 10, 109 // se almacenaría como [9,0,1]para ()i = 0; i . dígitos; i++) {}baseN[i] = valor % base;valor = valor / base;} // Convertir el número baseN normal en el equivalente código gris. Note que// el bucle comienza en el dígito más significativo y baja.no firmado cambio = 0;mientras ()i--) {}// El dígito gris se cambia por la suma de lo más alto// dígitos.gris[i] = ()baseN[i] + cambio) % base;cambio = cambio + base - gris[i];// Subtract from base so shift is positive}}// EXAMPLES// entrada: valor = 1899, base = 10, dígitos = 4// output: baseN[] = [9,8,1], gray[] = [0,1,7,1]// entrada: valor = 1900, base = 10, dígitos = 4// output: baseN[] = [0,0,9,1], gray[] = [0,1,8,1]

Hay otros algoritmos de código Gray para (n,k)-códigos Gray. El código (n,k)-Gray producido por el algoritmo anterior siempre es cíclico; algunos algoritmos, como el de Guan, carecen de esta propiedad cuando k es impar. Por otro lado, aunque con este método solo cambia un dígito a la vez, puede cambiar ajustando (recorriendo de n − 1 a 0). En el algoritmo de Guan, el conteo sube y baja alternativamente, de modo que la diferencia numérica entre dos dígitos del código Gray es siempre uno.

Los códigos Gray no están definidos de forma única, porque una permutación de las columnas de dicho código también es un código Gray. El procedimiento anterior produce un código en el que cuanto menor es el significado de un dígito, más a menudo cambia, lo que lo hace similar a los métodos de conteo normales.

Consulte también el sistema numérico binario sesgado, una variante del sistema numérico ternario en el que, como máximo, dos dígitos cambian en cada incremento, ya que cada incremento se puede realizar con una operación de acarreo de un dígito como máximo.

Código gris equilibrado

Aunque el código binario reflejado de Gray es útil en muchos escenarios, no es óptimo en ciertos casos debido a la falta de "uniformidad". In códigos Gray equilibrados, el número de cambios en diferentes posiciones de coordinación son lo más cerca posible. Para hacer esto más preciso, deja G ser un R- Completa Ciclo gris con secuencia de transición ; el conteos de transición ()espectro espectro espectro espectro espectro espectro espectro espectro espectro espectro espectro espectro espectro espectro) de G son la colección de enteros definidos por

Un código gris es uniforme o uniformemente equilibrado si sus cuentas de transición son iguales, en cuyo caso tenemos para todos k. Claramente, cuando , tales códigos existen solamente si n es un poder de 2. Si n no es un poder de 2, es posible construir equilibrado códigos binarios donde la diferencia entre dos conteos de transición es a la mayoría de 2; por lo que (combinando ambos casos) cada conteo de transición es o bien o . Los códigos grises también pueden ser exponencialmente equilibrada si todos sus conteos de transición son poderes adyacentes de dos, y tales códigos existen para cada poder de dos.

Por ejemplo, un código Gray equilibrado de 4 bits tiene 16 transiciones, que se pueden distribuir uniformemente entre las cuatro posiciones (cuatro transiciones por posición), lo que lo hace uniformemente equilibrado:

0 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 0
0 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0
0 0 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0
0 0 1 1 0 0 0 0 1 1 1 1 1 1 1

mientras que un código Gray equilibrado de 5 bits tiene un total de 32 transiciones, que no se pueden distribuir uniformemente entre las posiciones. En este ejemplo, cuatro posiciones tienen seis transiciones cada una y una tiene ocho:

1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 0 0
1 1 1 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 0 0 0 0 1 1
1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 1
1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1

Ahora mostraremos una construcción e implementación para códigos binarios bien balanceados que nos permiten generar un n-Digit balanceado Código gris para todos n. El principio principal es construir inductivamente un (n+ 2)-digit Código gris dado n-digit Código Gray G de tal manera que se conserva la propiedad equilibrada. Para ello, consideramos particiones de en un número incluso L de bloques no vacíos de la forma

Donde , , y ). Esta partición induce a -digit Código Gray dado por

Si definimos las multiplicidades de transición

para ser el número de veces el dígito en posición i cambios entre bloques consecutivos en una partición, entonces para el (n+ 2)-digit Código gris inducido por esta partición el espectro de transición es

La parte delicada de esta construcción es encontrar una partición adecuada de un equilibrio n-digit Código gris de tal manera que el código inducido por él permanece equilibrado, pero por esto sólo las multiplicidades de transición importan; uniendo dos bloques consecutivos sobre un dígito transición y dividir otro bloque en otro dígito transición produce un código gris diferente con exactamente el mismo espectro de transición , por lo que uno puede por ejemplo designar el primero transiciones a dígitos como los que caen entre dos bloques. Los códigos uniformes se pueden encontrar cuando y , y esta construcción se puede extender a la R- El caso también.

Códigos grises de larga duración

Longitud (o brecha máxima) Los códigos grises maximizan la distancia entre cambios consecutivos de dígitos en la misma posición. Es decir, la longitud de ejecución mínima de cualquier bit permanece sin cambios durante el mayor tiempo posible.

Códigos grises monotónicos

Los códigos monotónicos son útiles en la teoría de las redes de interconexión, especialmente para minimizar la dilatación de las matrices lineales de procesadores. Si definimos el peso de una cadena binaria como el número de 1 en la cadena, entonces aunque claramente no podemos tener un código Gray con un peso estrictamente creciente, es posible que queramos aproximarnos a esto teniendo el código pasar por dos pesas adyacentes antes de llegar a la siguiente.

Podemos formalizar el concepto de códigos monotone Gray como sigue: considerar la partición del hipercubo en niveles de vértices que tienen igual peso, es decir.

para . Estos niveles satisfacen . Vamos ser el subgrafo de inducido por , y dejar ser los bordes en . Un código gris monotónico es entonces un camino Hamiltoniano en tal como sea viene antes en el camino, entonces .

Una elegante construcción de monotónico n-digit Códigos Gray para cualquier n se basa en la idea de subpaths de construcción recurrente de longitud tener bordes en . Definimos , siempre o , y

De lo contrario. Aquí, es una permutación adecuada y se refiere al camino P con sus coordenadas permutadas por . Estos caminos dan lugar a dos monotónicos n-digit Códigos Gray y dado por

La elección de que asegura que estos códigos son de hecho códigos grises resulta ser . Los primeros valores de se muestran en la tabla siguiente.

Subpaths in the Savage–Winkler algoritmo
j = 0 j = 1 j = 2 j = 3
n = 1 0, 1
n = 2 00, 0110, 11
n = 3 000, 001100, 110, 010, 011101, 111
n = 4 0000, 00011000, 1100, 0100, 0110, 0010, 00111010, 1011, 1001, 1101, 0101, 01111110, 1111

Estos códigos Gray monotónicos se pueden implementar de manera eficiente de tal manera que cada elemento subsiguiente se pueda generar en tiempo O(n). El algoritmo se describe más fácilmente usando corrutinas.

Los códigos monotónicos tienen una conexión interesante con la conjetura de Lovász, que afirma que cada gráfico conectado con el vertex-transitivo contiene un camino Hamiltoniano. El subgrafo de nivel medio es vértice-transitivo (es decir, su grupo de automorfismo es transitivo, de modo que cada vértice tiene el mismo "ambiente local" y no puede diferenciarse de los otros, ya que podemos reetiquetar las coordenadas así como los dígitos binarios para obtener un automorfismo) y el problema de encontrar un camino Hamiltoniano en este subgrafo se llama el "problema de niveles medio", que puede proporcionar información sobre el conje más general. La pregunta ha sido respondida afirmativamente , y la construcción anterior para códigos monotónicos garantiza un camino de longitud Hamiltoniano al menos 0.839N Donde N es el número de vértices en el subgrafo de nivel medio.

Código Beckett-Gray

Otro tipo de código Gray, el código Beckett-Gray, lleva el nombre del dramaturgo irlandés Samuel Beckett, que estaba interesado en la simetría. Su obra "Quad" cuenta con cuatro actores y se divide en dieciséis períodos de tiempo. Cada período termina con uno de los cuatro actores entrando o saliendo del escenario. La obra comienza y termina con un escenario vacío, y Beckett quería que cada subconjunto de actores apareciera en el escenario exactamente una vez. Claramente, el conjunto de actores actualmente en el escenario puede representarse mediante un código Gray binario de 4 bits. Beckett, sin embargo, colocó una restricción adicional en el guión: deseaba que los actores entraran y salieran para que el actor que había estado más tiempo en el escenario fuera siempre el que saliera. Los actores podrían entonces ser representados por una cola de primero en entrar, primero en salir, de modo que (de los actores en el escenario) el actor que está siendo sacado de la cola es siempre el que fue puesto primero en la cola. Beckett no pudo encontrar un código Beckett-Gray para su obra y, de hecho, una lista exhaustiva de todas las secuencias posibles revela que no existe tal código para n = 4. Hoy se sabe que tales códigos no existen para n = 2, 5, 6, 7 y 8, y no existen para n = 3 o 4. Un ejemplo de Beckett–Gray de 8 bits El código se puede encontrar en El arte de la programación de computadoras de Donald Knuth. Según Sawada y Wong, el espacio de búsqueda para n = 6 se puede explorar en 15 horas y se han encontrado más de 9.500 soluciones para el caso n = 7.

Códigos de serpiente en la caja

Longitudes máximas de serpientes (Ls) y bobinas (Lc) en el problema de las serpientes en la caja para dimensiones n de 1 a 4

Los códigos de serpiente en la caja, o serpientes, son las secuencias de nodos de caminos inducidos en un gráfico de hipercubo n-dimensional, y la bobina en- los códigos de caja, o bobinas, son las secuencias de nodos de ciclos inducidos en un hipercubo. Vistas como códigos Gray, estas secuencias tienen la propiedad de poder detectar cualquier error de codificación de un solo bit. Los códigos de este tipo fueron descritos por primera vez por William H. Kautz a fines de la década de 1950; desde entonces, se ha investigado mucho para encontrar el código con el mayor número posible de palabras clave para una dimensión de hipercubo determinada.

Código Gray de vía única

Otro tipo de código Gray es el código Gray de vía única (STGC) desarrollado por Norman B. Spedding y refinado por Hiltgen, Paterson y Brandestini en "Códigos grises de vía única& #34; (1996). El STGC es una lista cíclica de codificaciones binarias únicas P de longitud n tales que dos palabras consecutivas difieren exactamente en una posición, y cuando la lista se examina como P × < matriz i>n, cada columna es un desplazamiento cíclico de la primera columna.

Código Gray de banda única con 5 sensores.
Versión animada y codificada por colores del rotor STGC.

El nombre proviene de su uso con codificadores rotatorios, donde los contactos detectan una cantidad de pistas, lo que da como resultado para cada una una salida de 0 o 1. Para reducir el ruido debido a que diferentes contactos no cambian exactamente en el mismo momento, es preferible configurar las pistas para que la salida de datos de los contactos esté en código Gray. Para obtener una alta precisión angular, se necesitan muchos contactos; para lograr al menos 1° de precisión, se necesitan al menos 360 posiciones distintas por revolución, lo que requiere un mínimo de 9 bits de datos y, por lo tanto, el mismo número de contactos.

Si todos los contactos se colocan en la misma posición angular, se necesitan 9 pistas para obtener un BRGC estándar con al menos 1° de precisión. Sin embargo, si el fabricante mueve un contacto a una posición angular diferente (pero a la misma distancia del eje central), entonces el "patrón de anillo" necesita ser girado el mismo ángulo para dar la misma salida. Si el bit más significativo (el anillo interior en la Figura 1) se gira lo suficiente, coincide exactamente con el siguiente anillo. Dado que ambos anillos son idénticos, el anillo interior se puede cortar y el sensor de ese anillo se mueve al anillo idéntico restante (pero desplazado en ese ángulo desde el otro sensor en ese anillo). Esos dos sensores en un solo anillo hacen un codificador de cuadratura. Eso reduce el número de pistas para una resolución de "1°" Codificador angular de 8 pistas. No se puede reducir aún más el número de pistas con BRGC.

Durante muchos años, Torsten Sillke y otros matemáticos creyeron que era imposible codificar la posición en una sola pista de modo que las posiciones consecutivas difirieran en un solo sensor, excepto en el codificador de cuadratura de 1 pista y 2 sensores. Entonces, para aplicaciones en las que 8 pistas eran demasiado voluminosas, la gente usaba codificadores incrementales de una sola pista (codificadores de cuadratura) o "codificador de cuadratura + muesca de referencia" de 2 pistas. codificadores

Sin embargo, Norman B. Spedding registró una patente en 1994 con varios ejemplos que demuestran que era posible. Aunque no es posible distinguir 2 posiciones n con sensores n en una sola pista, es posible distinguir cerca de tantos. Etzion y Paterson conjeturan que cuando n es en sí mismo una potencia de 2, los sensores n pueden distinguir como máximo 2n − 2n posiciones y que para primos n el límite es de 2n − 2 posiciones. Los autores continuaron generando un código de pista única de 504 posiciones de longitud 9 que creen que es óptimo. Dado que este número es mayor que 28 = 256, cualquier código requiere más de 8 sensores, aunque un BRGC podría distinguir 512 posiciones con 9 sensores.

Aquí se reproduce un STGC para P = 30 y n = 5:

Código Gray de una sola pista para 30 posiciones
AngleCódigo AngleCódigo AngleCódigo AngleCódigo AngleCódigo
1000072°01000144°00100216°00010288°00001
12°1010084°01010156°00101228°10010300°01001
24°1110096°01110168°00111240°10011312°11001
36°11110108°01111180°10111252°11011324°11101
48°11010120°01101192°10110264°01011336°10101
60°11000132°01100204°00110276°00011348°10001

Cada columna es un cambio cíclico de la primera columna, y de cualquier fila a la fila siguiente solo cambia un bit. La naturaleza de una sola pista (como una cadena de código) es útil en la fabricación de estas ruedas (en comparación con BRGC), ya que solo se necesita una pista, lo que reduce su costo y tamaño. La naturaleza del código Gray es útil (en comparación con los códigos de cadena, también llamados secuencias de De Bruijn), ya que solo un sensor cambiará en cualquier momento, por lo que la incertidumbre durante una transición entre dos estados discretos será solo más o menos una unidad de angular. medición que el dispositivo es capaz de resolver.

Código Gray bidimensional

Un diagrama de constelación de código gris para el 16-QAM rectangular

Los códigos Gray bidimensionales se utilizan en la comunicación para minimizar la cantidad de errores de bit en los puntos adyacentes de la modulación de amplitud en cuadratura (QAM) en la constelación. En una codificación típica, los puntos de constelación adyacentes horizontales y verticales difieren en un solo bit, y los puntos adyacentes diagonales difieren en 2 bits.

Los códigos Gray bidimensionales también tienen usos en los esquemas de identificación de ubicaciones, donde el código se aplicaría a mapas de área como una proyección de Mercator de la superficie terrestre y una función de distancia bidimensional cíclica apropiada como la La métrica de Mannheim se puede utilizar para calcular la distancia entre dos ubicaciones codificadas, combinando así las características de la distancia de Hamming con la continuación cíclica de una proyección de Mercator.

Exceso-Código-Gray

Si se extrae una subsección de un valor de código específico a partir de ese valor, por ejemplo, los últimos 3 bits de un código gris de 4 bits, el código resultante será un "código gris en exceso". Este código muestra la propiedad de contar hacia atrás en esos bits extraídos si el valor original se incrementa aún más. La razón de esto es que los valores codificados en gris no muestran el comportamiento de desbordamiento, conocido por la codificación binaria clásica, cuando aumentan más allá del "más alto" valor.

Ejemplo: el código gris de 3 bits más alto, 7, se codifica como (0)100. Agregar 1 da como resultado el número 8, codificado en gris como 1100. Los últimos 3 bits no se desbordan y cuentan hacia atrás si aumenta aún más el código original de 4 bits.

Cuando se trabaja con sensores que emiten múltiples valores codificados en gris de forma serial, se debe prestar atención a si el sensor genera esos valores múltiples codificados en un solo código gris o como valores separados, ya que de lo contrario los valores podrían aparecer estar contando hacia atrás cuando un "desbordamiento" se espera.

Isometría gris

El mapeo bijetivo { 0 ↔ 00, 1 ↔ 01, 2 ↔ 11, 3 ↔ 10 } establece una isometría entre el espacio métrico sobre el campo finito con la métrica dada por la distancia Hamming y el espacio métrico sobre el anillo finito (la aritmética modular habitual) con la métrica dada por la distancia Lee. El mapeo se extiende adecuadamente a una isometría de los espacios de Hamming y . Su importancia radica en establecer una correspondencia entre varios códigos "buenos" pero no necesariamente lineales como imágenes de mapas grises en de códigos lineales de anillo .

Códigos relacionados

Hay una serie de códigos binarios similares a los códigos Gray, que incluyen:

Los siguientes códigos decimales codificados en binario (BCD) también son variantes del código Gray:

Códigos BCD de distancia de 4 bits
NombreBit0123456789PesosPistasCompl.Cyclic5sComentario
Gray BCD400000000110 a 34 3)No(2, 4, 8, 16)No
30000111111
20011110000
10110011001
Paul410000000111 a 34 3)No2, 10No
30000111111
20011110000
11110011001
Glixon400000000110 a 34No2, 4, 8, 10(shifted +1)
30000111110
20011110000
10110011000
Tompkins I400000111110-42No2, 4, 10Sí.
30000111110
20011111000
10110001100
O'Brien I (Wats)400000111110 a 3492, 4, 10Sí.
30000110000
20011111100
10110000110
Petherick (RAE)400000111111 a 3392, 10Sí.
31000110001
20011111100
11110000111
O'Brien II400000111111 a 3392, 10Sí.
30001111000
20111001110
11100000011
Susskind400000111111-4392, 10Sí.
30011111100
20111001110
11110000111
Klar400000111110-44 3)92, 10Sí.
30001111000
20011111100
10111001110
Tompkins II400000111111 a 3292, 10Sí.
30011111000
21110000011
10111001110
Exceso-3 Gray400000111111-4492, 10Sí.
30111111110
21110000111
10011001100