Technopedia Center
PMB University Brochure
Faculty of Engineering and Computer Science
S1 Informatics S1 Information Systems S1 Information Technology S1 Computer Engineering S1 Electrical Engineering S1 Civil Engineering

faculty of Economics and Business
S1 Management S1 Accountancy

Faculty of Letters and Educational Sciences
S1 English literature S1 English language education S1 Mathematics education S1 Sports Education
  • Registerasi
  • Brosur UTI
  • Kip Scholarship Information
  • Performance
  1. WeltenzyklopÀdie
  2. Gray-Code
Gray-Code 👆 Click Here!
aus Wikipedia, der freien EnzyklopÀdie
Gray-Code
stetig ja
Hamming-Abstand 1

Der Gray-Code ist eine spezielle Art der Codierung, bei der sich benachbarte Zahlen nur in einer einzigen Stelle unterscheiden. Dies bedeutet, dass beim Wechsel von einer Zahl zur nĂ€chsten nur ein Bit (eine binĂ€re Ziffer) geĂ€ndert wird. Diese Eigenschaft hilft, Übertragungsfehler zu reduzieren, insbesondere bei digitalen Signalen, die sich schnell Ă€ndern. So können unterschiedliche Laufzeiten in mehradrigen Kabeln keinen Einfluss auf die DatenĂŒbertragung haben.

Der Gray-Code wurde ursprĂŒnglich fĂŒr elektromechanische Sensoren und Schalter entwickelt, die anfĂ€llig fĂŒr Fehler sind. Heute wird dieser Code auch in modernen digitalen Übertragungssystemen eingesetzt, wie zum Beispiel im digitalen Fernsehen (DVB-T) und im Kabelfernsehen. Der Code ist nach dem US-amerikanischen Physiker Frank Gray benannt, der 1953 das Patent fĂŒr dieses Verfahren erhielt.[1]

Generierung

[Bearbeiten | Quelltext bearbeiten]

Beginne mit einer BinĂ€rzahl, die nur aus Nullen besteht. Ändere dann immer die am weitesten rechts stehende Ziffer (das niederwertigste Bit) von 0 zu 1 oder umgekehrt, solange dadurch keine Kombination entsteht, die bereits vorkam.

Eine alternative Methode, die leichter zu merken und anzuwenden ist, besteht aus folgenden Schritten:[2]

  1. Beginne mit dem einfachsten Gray-Code-Werten: 0 und 1.
  2. ErgÀnze die Codefolge mit den gespiegelten vorhandenen Werten (schreibe sie in umgekehrter Reihenfolge auf).
  3. Setze vor die ursprĂŒnglichen Werte eine 0, vor die gespiegelten eine 1.
  4. Wiederhole Schritte 2 und 3, bis die gewĂŒnschte LĂ€nge erreicht ist.

Der so erzeugte Code hat die Eigenschaft, dass sich niederwertige Bits hÀufiger Àndern als höherwertige. Es kann aber auch ein balancierter Gray-Code konstruiert werden, in dem sich alle Stellen (Bits) der Codewörter gleich hÀufig von benachbarten Codewörtern unterscheiden. Beim Durchgehen aller Codewörter in korrekter Reihenfolge Àndert sich dann jede Stelle gleich oft.[3]

Der Gray-Code wird hauptsĂ€chlich als BinĂ€rcode verwendet, kann jedoch auch fĂŒr mehrstufige Übertragungswege eingesetzt werden.

Logische Operatoren

[Bearbeiten | Quelltext bearbeiten]

Die folgenden Punkte zeigen, wie man Schritt fĂŒr Schritt aus einem BinĂ€rcode eine Gray-codierte BinĂ€rzahl erhĂ€lt:

  • X1: Dualzahl im BinĂ€rcode
  • X2: Rechts-Shift der Dualzahl um 1 Bit
  • X3: Modulo-2-Addition (XOR-VerknĂŒpfung) von X1 und X2; dies ist die gewĂŒnschte Zahl im Graycode.

Das gleiche als Pseudocode:

  • BinĂ€rcode X1 → Graycode: X3 = (X1 XOR X2)

oder anders ausgedrĂŒckt:

  • BinĂ€rcode X1 → Graycode: X3 = (X1 XOR (X1 SHR 1))

wobei SHR der rechts Shiften Operator ist.

Und als Formel:

x 3 = x 1 ⊕ ( x 1 ≫ 1 ) {\displaystyle x_{3}=x_{1}\oplus (x_{1}\gg 1)} {\displaystyle x_{3}=x_{1}\oplus (x_{1}\gg 1)}

Generatormatrix

[Bearbeiten | Quelltext bearbeiten]

Da der Gray-Code ein linearer Code ist, kann man ihn mit einer Generatormatrix G {\displaystyle G} {\displaystyle G} erzeugen. Ein binÀres Wort w {\displaystyle w} {\displaystyle w} der LÀnge n {\displaystyle n} {\displaystyle n} kann man als Vektor eines n {\displaystyle n} {\displaystyle n}-dimensionalen F 2 {\displaystyle \mathbb {F} _{2}} {\displaystyle \mathbb {F} _{2}}-Vektorraums F 2 n {\displaystyle \mathbb {F} _{2}^{n}} {\displaystyle \mathbb {F} _{2}^{n}} betrachten. Sei w {\displaystyle w} {\displaystyle w} nun ein Zeilenvektor, dann lÀsst sich die Kodierung des Wortes w {\displaystyle w} {\displaystyle w} in das Codewort c {\displaystyle c} {\displaystyle c} wie folgt darstellen:

c = w [ 1 1 0 ⋱ ⋱ ⋱ 1 0 1 ] ⏟ =: G {\displaystyle c=w\underbrace {\begin{bmatrix}1&1&&0\\&\ddots &\ddots &\\&&\ddots &1\\0&&&1\end{bmatrix}} _{=:G}} {\displaystyle c=w\underbrace {\begin{bmatrix}1&1&&0\\&\ddots &\ddots &\\&&\ddots &1\\0&&&1\end{bmatrix}} _{=:G}}

Die Dekodierung erfolgt mit der Multiplikation der Inversen G − 1 {\displaystyle G^{-1}} {\displaystyle G^{-1}} von G {\displaystyle G} {\displaystyle G}. Diese hat folgende Form:

G − 1 = [ 1 ⋯ ⋯ 1 ⋱ ⋼ ⋱ ⋼ 0 1 ] ∈ F 2 n × n {\displaystyle G^{-1}={\begin{bmatrix}1&\cdots &\cdots &1\\&\ddots &&\vdots \\&&\ddots &\vdots \\0&&&1\end{bmatrix}}\in \mathbb {F} _{2}^{n\times n}} {\displaystyle G^{-1}={\begin{bmatrix}1&\cdots &\cdots &1\\&\ddots &&\vdots \\&&\ddots &\vdots \\0&&&1\end{bmatrix}}\in \mathbb {F} _{2}^{n\times n}}

Der Vektorraum F 2 n {\displaystyle \mathbb {F} _{2}^{n}} {\displaystyle \mathbb {F} _{2}^{n}} lĂ€sst sich anschaulich mit HyperwĂŒrfeln darstellen.

Gray-ZĂ€hler

[Bearbeiten | Quelltext bearbeiten]

Man kann auch direkt einen Gray-Code-ZĂ€hler in Hardware (z. B. in HDL) programmieren. Hierzu ist es hilfreich, ein Hilfsregister zu benutzen, das mit jedem Taktzyklus toggelt.

 Qh [n+1] = !Qh [n]
 Qh [0  ] =  0     wenn der Gray-Code-ZĂ€hler mit Null startet also Q[0]=0, oder Q[0] eine gerade Anzahl an Einsen hat. Bei anderer Initialisierung wĂŒrde der ZĂ€hler rĂŒckwĂ€rts laufen.

Damit wird die Kombinatorik recht ĂŒbersichtlich:

 Q0  [n+1] = !(Q0  [n] ^   Qh  [n] )
 Q1  [n+1] =   Q1  [n] ^ ( Q0  [n] &  Qh  [n] )
 Q2  [n+1] =   Q2  [n] ^ ( Q1  [n] & !Q0  [n] &  Qh [n] )
 Q3  [n+1] =   Q3  [n] ^ ( Q2  [n] & !Q1  [n] & !Q0 [n] & Qh [n] )
           

 Qk-1[n+1] =   Qk-1[n] ^ ( Qk-2[n] & !Qk-3[n] & 
  & !Q1 [n] & !Q0 [n] & Qh [n])
 Qk  [n+1] =   Qk  [n] ^ (!Qk-2[n] &            
  & !Q1 [n] & !Q0 [n] & Qh [n])

Der Unterschied zwischen den Formeln fĂŒr das grĂ¶ĂŸte Bit Qk und den kleineren Bits Qk-1 ist nötig, damit der ZĂ€hler zyklisch ist, also der ZĂ€hler nach dem letzten Wert Q=100
00 auf den Anfangswert Q=000
00 springt. Bei einem unendlichen ZĂ€hler gĂ€be es keinen Unterschied.

 ^ := Exklusiv Oder / XOR / Antivalenz
 ! := Inverter / NOT / Negation
& := Und / AND / Konjunktion

Eigenschaften

[Bearbeiten | Quelltext bearbeiten]

Die Hamming-Distanz benachbarter Codewörter ist 1, d. h. die Werte unterscheiden sich in genau einem Bit. Das ist das höchstwertige Bit, das sich in der BinÀrdarstellung der mit 0 beginnenden Zeilennummern Àndert. Zum Beispiel haben Zeile 11 und Zeile 12 die BinÀrdarstellungen 001011 und 001100. Es Àndern sich also die letzten drei Bits. Die Codewörter von Zeile 11 und 12, nÀmlich 001110 und 001010, unterscheiden sich daher im drittletzten Bit.

Die absolute Differenz benachbarter Codewörter ist also eine Zweierpotenz. Diese Zweierpotenz ist die grĂ¶ĂŸte Zweierpotenz, durch die sich die Zeilennummer des zweiten Codeworts teilen lĂ€sst. Ist der grĂ¶ĂŸte ungerade Teiler der Zeilennummer von der Form 4k + 1, also 1, 5, 9, ..., dann ist die Differenz positiv. Ist der grĂ¶ĂŸte ungerade Teiler von der Form 4k + 3, also 3, 7, 11, ..., dann ist die Differenz negativ. Zum Beispiel hat die Zeile 12 die Zahl 22 = 4 als grĂ¶ĂŸte Zweierpotenz und die Zahl 3 als grĂ¶ĂŸte ungerade Teiler. Die Differenz der Codewörter von Zeile 11 und Zeile 12 ist also gleich −4.

Bedeutung

[Bearbeiten | Quelltext bearbeiten]

Ein Ziffernschritt sei nachfolgend der kleinstmögliche Unterschied, die kleinste Differenz, das kleinste Intervall zwischen zwei digitalisierten Werten. Eine zeitliche VerĂ€nderung eines Zahlenwertes um einen Ziffernschritt wird nachfolgend als stetige VerĂ€nderung bezeichnet. Signale werden ĂŒber DatenĂŒbertragungsstrecken ĂŒbertragen. Typische Signalgeber sind z. B. Signale eines Temperatursensors oder eines Drehwinkelgebers.

Die Motivation fĂŒr die Entwicklung dieses Codes ist das folgende Problem: SignalĂŒbertragungsstrecken und Signalgeber unterliegen StöreinflĂŒssen, die dazu fĂŒhren können, dass sich einzelne oder mehrere Stellen eines Codewortes (codierte Zahl) unbeabsichtigterweise verĂ€ndern oder falsch interpretiert werden können. Physische Schalter sind beispielsweise nicht ideal. Es ist sehr unwahrscheinlich, dass physische Schalter ihren Zustand exakt synchron Ă€ndern.

Auf mehreren Adern einer elektrischen Datenleitung sollen nun beispielsweise Daten parallel ĂŒbertragen werden, die sich stetig Ă€ndern. Als Dualzahl ĂŒbertragen, Ă€ndern sich die Bits bei einem neuen Messwert auf jeder betroffenen Leitung theoretisch exakt gleichzeitig, und zwar sowohl am Eingang der Leitung als auch am Ausgang. TatsĂ€chlich aber Ă€ndern sich die Bits auf der Leitung nicht gleichzeitig. Das kann verschiedene Ursachen haben: Bauteilestreuung, Laufzeiten, Asymmetrien usw. Dadurch kommt es zu ungewollten ZwischenzustĂ€nden und kurzzeitig (zwischen den roten Linien) falsch empfangenen Werten:

2-Bit-
Gray-Code
00
01
11
10
3-Bit-
Gray-Code
000
001
011
010
110
111
101
100
4-Bit-
Gray-Code
0000
0001
0011
0010
0110
0111
0101
0100
1100
1101
1111
1110
1010
1011
1001
1000
5-Bit-
Gray-Code
00000
00001
00011
00010
00110
00111
00101
00100
01100
01101
01111
01110
01010
01011
01001
01000
11000
11001
11011
11010
11110
11111
11101
11100
10100
10101
10111
10110
10010
10011
10001
10000
6-Bit-
Gray-Code
000000
000001
000011
000010
000110
000111
000101
000100
001100
001101
001111
001110
001010
001011
001001
001000
011000
011001
011011
011010
011110
011111
011101
011100
010100
010101
010111
010110
010010
010011
010001
010000
110000
110001
110011
110010
110110
110111
110101
110100
111100
111101
111111
111110
111010
111011
111001
111000
101000
101001
101011
101010
101110
101111
101101
101100
100100
100101
100111
100110
100010
100011
100001
100000

Problem bei Dualcode-Signalen

[Bearbeiten | Quelltext bearbeiten]

Dualcodesignal

ErklÀrung zu den Abbildungen:

Als steigende Flanke wird nachfolgend der Übergang vom Wert 0 („Aus“) auf 1 („Ein“) eines Signals auf einer Datenleitung bezeichnet. In der oberen Abbildung sind theoretische Dualcode (BCD) Signale auf vier parallelen Leitungen dargestellt sowie reale Dualcode Signale in der Abbildung darunter wie sie in der Praxis auftreten können. Die realen Signale auf der Leitung 1 sind im Vergleich zu dem theoretischen Signal zeitlich verschoben. Die erste steigende Flanke des realen Signals auf Datenleitung 1 kommt hier im Vergleich zu dem theoretischen Signal um das Zeitintervall t2−t1 spĂ€ter am Ausgang an, wĂ€hrend die zweite steigende Flanke um das Intervall t4−t3 frĂŒher am Ausgang anliegt. Die Signale „0“ und „1“ auf den Leitungen werden nachfolgend als Tetrade (vier-stelliges Codewort) geschrieben, wobei der Kanal 3 an der Stelle ganz links und der Kanal 0 an der Stelle ganz rechts notiert wird. Die dazugehörigen Werte, die theoretisch vor der Codierung bei dem Signalgeber vorhanden waren, lauten im Dezimalsystem: 0, 1, 2, 3, 4, 5, 6, 7 usw. Die Werte des Gebers Ă€ndern sich in diesem Beispiel also stetig, das heißt immer nur um das kleinstmögliche Intervall von 1, also ohne grĂ¶ĂŸere SprĂŒnge zwischen zwei aufeinanderfolgenden Werten.

WĂ€hrend das theoretische Signal in der Reihenfolge

  • {0000}, {0001}, {0010}, {0011}, {0100}, {0101}, {0110}, {0111} usw.

abgesendet wird, kommen am Ausgang des realen Signals kurzzeitig andere SignalzustÀnde an:

  • {0000}, {0001}, {0000}, {0010}, {0011}, {0100}, {0101}, {0111}, {0110}, {0111} usw.

WĂ€hrend sich der Dezimalwert des Gebers zwischen zwei aufeinanderfolgenden Werten theoretisch maximal um 1 Ă€ndert, entsteht hier auf der EmpfĂ€ngerseite verursacht durch einen Laufzeitfehler ein Sprung mit einem Betrag von 2 (dezimal) und zwar verursacht durch die Signalfolge {0000} und {0010}, die der Zahlenfolge 0 und 2 im Dezimalsystem entspricht. Ein weiterer Sprung um den Betrag von 2 (dezimal) entsteht durch die Signalfolge {0101} und {0111} (dezimal: 5 und 7). Der theoretisch richtige Dezimalwert des Gebers betrug 3 zwischen den Zeitpunkten t1 und t2. Der Laufzeitfehler des realen Signals fĂŒhrt allerdings dazu, dass der Wert in diesem Intervall als 1 interpretiert wird. Der Betrag des Fehlers zwischen theoretischem und realem gestörten Signal betrĂ€gt also zwei, wie auch der Fehler zwischen den Zeitpunkten t3 und t4.

Lösung mit Gray-Code

[Bearbeiten | Quelltext bearbeiten]

Graycodesignal

Die theoretischen Ausgangswerte des Signalgebers lauten wie oben im Dezimalsystem: 0, 1, 2, 3, 4, 5, 6, 7 usw. Die Dezimalwerte sind allerdings nun mithilfe des Gray-Codes codiert bzw. werden mithilfe des Gray-Codes gesendet. Zwischen zwei aufeinanderfolgenden Eingangswerten Àndert sich dabei immer nur ein Bit (eine Stelle im Codewort):

  • Abgesendete Sequenz: {0000}, {0001}, {0011}, {0010}, {0110}, {0111}, {0101}, {0100} usw.
  • Ankommende Sequenz: {0000}, {0001}, {0011}, {0010}, {0110}, {0111}, {0101}, {0100} usw.

Hier kommt also am Ausgang auch dann die gleiche Sequenz wie am Eingang an, wenn beachtliche Zeitfehler (rote Linien) auftreten.

Die gestörte Tetrade zwischen den Zeitpunkten t1 und t2 lautet hier {0001}, die anstatt dem theoretischen Codewort {0011} empfangen worden ist, was im Dezimalsystem dem Empfang einer 1 anstatt der 2 entspricht. Die gestörte Tetrade zwischen den Zeitpunkten t3 und t4 lautet {0101}, anstatt dass {0111} empfangen worden ist. Das entspricht dezimal dem Empfang einer 6 anstatt 5.

Der Dezimalbetrag des Fehlers zwischen dem „wahren“ Wert des Gebers im Vergleich zu dem gestörten Signal entspricht bei Verwendung des Gray Codes also nur 1 und ist somit geringer als im oberen Beispiel, bei dem der Dezimalwert des Gebers BCD (dual) codiert wurde.

Abweichungen an einer oder wenigen Stellen eines Codewortes werden bei der Verwendung des Gray Codes also zwar nicht erkannt, resultieren aber nicht in gravierenden Abweichungen des ursprĂŒnglichen Eingangswertes. Die Verwendung des Gray Codes erlaubt auch keine Fehlerkorrektur.

Karnaugh-Veitch-Diagramm

[Bearbeiten | Quelltext bearbeiten]

Im Karnaugh-Veitch-Diagramm erkennt man den Graycode – es sind mehrere Sequenzen möglich – daran, dass ÜbergĂ€nge nur zwischen (horizontal oder vertikal) benachbarten Feldern vorkommen.

Reihenfolge Dualcode
ÂŹX0 X0 X0 ÂŹX0
ÂŹX2 0 1 3 2 ÂŹX3
X2 4 5 7 6 ÂŹX3
X2 12 13 15 14 X3
ÂŹX2 8 9 11 10 X3
ÂŹX1 ÂŹX1 X1 X1
Reihenfolge Graycode
ÂŹX0 X0 X0 ÂŹX0
ÂŹX2 0 1 2 3 ÂŹX3
X2 7 6 5 4 ÂŹX3
X2 8 9 10 11 X3
ÂŹX2 15 14 13 12 X3
ÂŹX1 ÂŹX1 X1 X1

Der Code eignet sich auch fĂŒr zyklische Anwendungen wie der unten abgebildeten Scheibe, da sich auch beim Übergang von der höchsten Zahl auf die Null nur eine Stelle Ă€ndert.

Die Wertigkeit einer 1 an der Position n {\displaystyle n} {\displaystyle n} im Gray-Code Zahlensystem ist 2 n − 1 {\displaystyle 2^{n}-1} {\displaystyle 2^{n}-1} (wobei n ab 1 zĂ€hlt, also 
 31, 15, 7, 3, 1). Die einzelnen Einsen werden, im Gegensatz zum normalen BinĂ€rsystem, nicht addiert, sondern von rechts beginnend subtrahiert. Beispiel: 111Gray = 7 − (3 − 1) = 5 oder 1111Gray = 15 − (7 − (3 − 1)) = 10. Stellen, die 0 sind, werden dabei ausgelassen, Beispiel: 101Gray = 7 − 1 = 6.

Bei der Generierung von Gray-Code wird symmetrisch vorgegangen.

Da sich benachbarte Werte nur in einer Ziffer unterscheiden, ist der Gray-Code geeignet, um Fehler in seriellen Prozessen aufzudecken.

Programmierung

[Bearbeiten | Quelltext bearbeiten]

Folgendes Beispiel zeigt eine Implementierung in der Programmiersprache C++, die die Zeilen des Gray-Codes mit 6 Bits iterativ erzeugt und auf der Konsole ausgibt.[4][5]

#include <iostream>
#include <string>
#include <vector>
using namespace std;

void writeGrayCode (int const bits)           // Diese Funktion erzeugt den bits-Bit-Gray-Code und gibt ihn auf der Konsole aus
{
    vector<string> GrayCode {""};             // Ergebnis-Vektor mit initialer leerer Zeile

    // Diese for-Schleife wird bits-mal durchlaufen und erzeugt iterativ die Text fĂŒr den 1-Bit-, 2-Bit-, ..., n-Bit-Gray-Code.
    // Die Schleifenvariable pos durchlÀuft die jeweiligen Bitpositionen 1, 2, 4, ..., 2^(n-1)
    for (int pos = 1; pos < (1 << bits); pos *= 2)
    {
        for (int i = pos; --i >= 0; )         // HĂ€nge die zuletzt erzeugten Zeilen in umgekehrter Reihenfolge am Ende noch mal an.
            GrayCode.push_back (GrayCode[i]); // Die Anzahl der Zeilen verdoppelt sich dadurch.

        for (int i = 0*pos; i < 1*pos; i++)   // FĂŒge eine '0' am Anfang der Zeilen der ersten HĂ€lfte hinzu.
            GrayCode[i] = "0" + GrayCode[i];

        for (int i = 1*pos; i < 2*pos; i++)   // FĂŒge eine '1' am Anfang der Zeilen der zweiten HĂ€lfte hinzu.
            GrayCode[i] = "1" + GrayCode[i];
    }

    for (auto & E : GrayCode)                 // Diese for-Schleife durchlÀuft alle Zeilen des Gray-Code
        cout << E << endl;                    // Ausgabe auf der Konsole
}

int main()                                    // Eintrittspunkt beim Aufruf eines C++-Programms
{
    writeGrayCode(6); // Aufruf der Funktion, die hier den 6-Bit-Gray-Code erzeugt und auf der Konsole ausgibt
}

Zwei- und mehrdimensionale Graycodes

[Bearbeiten | Quelltext bearbeiten]

In mehrdimensionalen VektorrĂ€umen sind mehrdimensionale Graycodes möglich. In N {\displaystyle N} {\displaystyle N}-dimensionalen Graycodes mit jeweils n ≄ 4 {\displaystyle n\geq 4} {\displaystyle n\geq 4} Codeworten pro Dimension hat jedes Codewort 2 N {\displaystyle 2N} {\displaystyle 2N} Nachbarn in 2 N {\displaystyle 2N} {\displaystyle 2N} Richtungen, die sich um maximal 1 Bit unterscheiden. In N {\displaystyle N} {\displaystyle N}-dimensionalen Graycodes mit jeweils n = 2 {\displaystyle n=2} {\displaystyle n=2} Codeworten pro Dimension hat jedes Codewort N {\displaystyle N} {\displaystyle N} Nachbarn in 2 N {\displaystyle 2N} {\displaystyle 2N} Richtungen (die entgegengesetzten Nachbarn sind die gleichen), die sich um maximal 1 Bit unterscheiden.

Genutzt werden diese in der Digitalen Kodierung, siehe hier.

Geometrische und graphentheoretische Darstellung

[Bearbeiten | Quelltext bearbeiten]
  • Bild 1: 3-Bit-Gray-Code als Ecken eines (3D-)WĂŒrfels
    Bild 1: 3-Bit-Gray-Code als Ecken eines (3D-)WĂŒrfels
  • Bild 2: Koordinatensystem hinzugefĂŒgt
    Bild 2: Koordinatensystem hinzugefĂŒgt

Bild 1 zeigt den Hexaeder fĂŒr 3 Variablen und Bild 2 den gleichen WĂŒrfel mit dazugehörigem Koordinatensystem. Die Knoten (Eckpunkt oder Kreise) am EinheitswĂŒrfel entsprechen jeweils einer Zeile im Gray-Code. Die ÜbergĂ€nge (Nachbarschaft der Zeilen) sind durch die Kanten des WĂŒrfels symbolisiert. Beim Wandern auf der Kante entsteht ein Gray-Code.

geschlossener 3-Bit-Gray-Code
a) b) c) d) e) f)
000 000 000 000 000 000
001 100 010 010 001 100
101 101 110 011 011 110
100 001 100 001 010 010
110 011 101 101 110 011
111 111 111 111 111 111
011 110 011 110 101 101
010 010 001 100 100 001
  • Bild 3: Die 6 Pfade zu dem Gray-Code in der Tabelle. Es handelt sich um einen Hamiltonkreis. Startpunkt: 000 (grĂŒner Kreis jeweils hinten links oben), Verlauf: grĂŒne→blaue→rote→schwarze Linie, Endpunkt: am Startpunkt Fehler in Bild b) Linie 101→111 und in Bild d) 011→111
    Bild 3: Die 6 Pfade zu dem Gray-Code in der Tabelle. Es handelt sich um einen Hamiltonkreis. Startpunkt: 000 (grĂŒner Kreis jeweils hinten links oben), Verlauf: grĂŒne→blaue→rote→schwarze Linie, Endpunkt: am Startpunkt
    Fehler in Bild b) Linie 101→111 und in Bild d) 011→111

Auf jeder Kante Ă€ndert sich genau 1 Bit. Der Gray-Code hat so viel Nachbarschaften, wie der WĂŒrfel Kanten hat. Aus dem WĂŒrfel in Bild 1 können die möglichen Pfade auf 6 verschiedenen Wegen durchschritten werden. Somit ergeben sich 12 Möglichkeiten (jeder Weg vorwĂ€rts und rĂŒckwĂ€rts), um einen 3-Bit-Gray-Code zu erzeugen, der die Bedingungen des Gray-Codes erfĂŒllt (Tabelle und Bild 3). Abgesehen davon ist der Gray-Code zyklisch und der Startpunkt könnte deshalb auch an einer anderen Zeile sein. Wegen seiner einfachen rekursiven Generierungsvorschrift wird meist der binĂ€re reflektierte Gray-Code (binary-reflected Gray code) angegeben (Spalte „e“ – vorletzte Spalte in der Tabelle). Es gibt fĂŒr eine bestimmte BitlĂ€nge eine ganze Klasse von Graycodes.

Es gibt fĂŒr einen n-Bit-Gray-Code exakt so viel Varianten, wie es Hamiltonkreise auf einem n-dimensionalen HyperwĂŒrfel gibt. Die Anzahl dieser HyperwĂŒrfel ist in der On-Line Encyclopedia of Integer Sequences als Sequenz A003042 angegeben und (Stand Februar 2022) bis zu 6 Dimensionen bekannt.[6]

FĂŒr 1 bit gibt es 1 möglichen Gray-Code, fĂŒr 2 bit gibt es 2 mögliche Gray-Codes und fĂŒr 3 bit gibt es 12 mögliche Gray-Codes:

Nr. 1 0 1
Nr. 1 00 01 11 10
Nr. 2 00 10 11 01
Nr. 1 000 001 011 010 110 111 101 100
Nr. 2 000 001 011 111 101 100 110 010
Nr. 3 000 001 101 100 110 111 011 010
Nr. 4 000 001 101 111 011 010 110 100
Nr. 5 000 010 011 001 101 111 110 100
Nr. 6 000 010 011 111 110 100 101 001
Nr. 7 000 010 110 111 011 001 101 100
Nr. 8 000 010 110 100 101 111 011 001
Nr. 9 000 100 101 111 110 010 011 001
Nr. 10 000 100 101 001 011 111 110 010
Nr. 11 000 100 110 111 101 001 011 010
Nr. 12 000 100 110 010 011 111 101 001

DarĂŒber steigt die Zahl steil an:
FĂŒr 4 bit sind es 2688, fĂŒr 5 bit 1813091520 und fĂŒr 6 bit 71676427445141767741440.

Balancierte Gray-Codes

[Bearbeiten | Quelltext bearbeiten]

Ein balancierter Gray-Code ist ein Gray-Code, bei dem sich die Anzahl der Änderungen fĂŒr alle n {\displaystyle n} {\displaystyle n} Bits höchstens um 2 unterscheidet. Wenn T C ( i ) {\displaystyle TC(i)} {\displaystyle TC(i)} und T C ( j ) {\displaystyle TC(j)} {\displaystyle TC(j)} die Anzahl der Änderungen fĂŒr die Bits mit den Indizes i {\displaystyle i} {\displaystyle i} und j {\displaystyle j} {\displaystyle j} ist, dann gilt fĂŒr jeden balancierten Gray-Code die Ungleichung | T C ( i ) − T C ( j ) | ≀ 2 {\displaystyle |TC(i)-TC(j)|\leq 2} {\displaystyle |TC(i)-TC(j)|\leq 2}.

Ein balancierter Gray-Code mit n {\displaystyle n} {\displaystyle n} Bits kann folgendermaßen konstruiert werden:

  • Aus einem beliebigen ( n − 2 ) {\displaystyle (n-2)} {\displaystyle (n-2)}-Bit Gray-Code mit den Zeilen s = ( s 1 , s 2 , 
 , s 2 n − 2 ) {\displaystyle s=(s_{1},s_{2},\ldots ,s_{2^{n-2}})} {\displaystyle s=(s_{1},s_{2},\ldots ,s_{2^{n-2}})} wird eine Teilfolge t = ( t 1 , t 2 , 
 , t l ) {\displaystyle t=(t_{1},t_{2},\ldots ,t_{l})} {\displaystyle t=(t_{1},t_{2},\ldots ,t_{l})} ausgewĂ€hlt, wobei l {\displaystyle l} {\displaystyle l} gerade ist und t 1 {\displaystyle t_{1}} {\displaystyle t_{1}}, t 2 {\displaystyle t_{2}} {\displaystyle t_{2}} und t l − 1 {\displaystyle t_{l-1}} {\displaystyle t_{l-1}}, t l {\displaystyle t_{l}} {\displaystyle t_{l}} direkt aufeinanderfolgende Zeilen sind.
  • Die vier Kopien des ( n − 2 ) {\displaystyle (n-2)} {\displaystyle (n-2)}-WĂŒrfels. In jedem dieser WĂŒrfel betrachtet man den definierten Gray-Code mit den Zeilen s = s ( 00 ) = s ( 01 ) = s ( 11 ) = s ( 10 ) {\displaystyle s=s^{(00)}=s^{(01)}=s^{(11)}=s^{(10)}} {\displaystyle s=s^{(00)}=s^{(01)}=s^{(11)}=s^{(10)}} und löscht die ÜbergĂ€nge zwischen direkt aufeinanderfolgenden Zeilen auf folgende Weise: Aus s ( 00 ) {\displaystyle s^{(00)}} {\displaystyle s^{(00)}} werden die entsprechenden Elemente von den Zeilen mit ungeraden Indexen t 1 , t 3 , 
 , t l − 1 {\displaystyle t_{1},t_{3},\ldots ,t_{l-1}} {\displaystyle t_{1},t_{3},\ldots ,t_{l-1}} gelöscht. Aus s ( 01 ) {\displaystyle s^{(01)}} {\displaystyle s^{(01)}} werden die entsprechenden Elemente von t 2 , t 3 , 
 , t l {\displaystyle t_{2},t_{3},\ldots ,t_{l}} {\displaystyle t_{2},t_{3},\ldots ,t_{l}} gelöscht. Aus s ( 11 ) {\displaystyle s^{(11)}} {\displaystyle s^{(11)}} werden die entsprechenden Elemente von den Zeilen mit geraden Indexen t 2 , t 4 , 
 , t l {\displaystyle t_{2},t_{4},\ldots ,t_{l}} {\displaystyle t_{2},t_{4},\ldots ,t_{l}} gelöscht. Aus s ( 10 ) {\displaystyle s^{(10)}} {\displaystyle s^{(10)}} wird nur das entsprechenden Elemente von t 1 {\displaystyle t_{1}} {\displaystyle t_{1}} gelöscht.
  • Die vier TeilwĂŒrfel werden miteinander verbunden.

Es kann ĂŒberprĂŒft werden, dass die oben beschriebene Konstruktion tatsĂ€chlich einen balancierten n {\displaystyle n} {\displaystyle n}-Bit-Gray-Code ergibt. Die Verteilung der Anzahl der Änderungen fĂŒr die Bits in diesem Code hĂ€ngt von der Wahl der ausgewĂ€hlten Teilfolge t {\displaystyle t} {\displaystyle t} ab.[7]

Anwendungen

[Bearbeiten | Quelltext bearbeiten]
Schemazeichnung einer Scheibe mit Gray-Codierung. Die gelben Punkte stellen Lichtsensoren dar.
Ein Gray-Code Absolutwertgeber mit 13 bits

Eine Anwendungsmöglichkeit ist die Bestimmung der absoluten Position einer Scheibe oder Leiste, die mit schwarzen und weißen Balken markiert ist. Die Balken werden mit Lichtschranken oder anderen Sensoren abgetastet. Diese Position wird dann zur Winkel- oder Drehgeschwindigkeitsmessung verwendet.[8]

Eine weitere Anwendung ist die Streifenprojektion. Dort wird eine Folge von Mustern aus parallelen Streifen auf ein Objekt projiziert. Die Nummer der Streifen ist Gray-kodiert und kann von einer beobachtenden Kamera fĂŒr jeden Bildpunkt berechnet werden.

Eine andere Anwendung ist das asynchrone Einlesen von Daten. Beispielsweise wird der Gray-Code genutzt, um in Korrelatoren die ZĂ€hlerstĂ€nde fehlerfrei einzulesen. Selbst im ungĂŒnstigsten Fall, wenn wĂ€hrend eines kippenden Bits eingelesen wird, ist das Ergebnis immer korrekt, da ein kippendes Bit nicht definiert ist und es zudem nur einen Unterschied von ±1 ausmacht. Diese Art des Einlesens erfordert keine Synchronisation.

Weitere Anwendungsmöglichkeiten sind Windrichtungsmesser oder Wasserniveaumesser, Abbildung des Fahrkorbstands bei AufzĂŒgen.

Der reflektierte Gray-Code hat eine enge Beziehung zur Lösung des Problems der TĂŒrme von Hanoi, und er beschreibt auch den Lösungsweg der Chinesischen Ringe.

Reduktion von Bitfehlern in digital PSK-, APSK- und QAM-modulierten Signalen

[Bearbeiten | Quelltext bearbeiten]

In moderner Digitale Kommunikation spielen 1D- and 2D-Gray-Codierungen eine bedeutende Rolle beim Verhindern von Mehrfachbitfehlern bei Übertragungen. Sie machen damit Fehlerkorrektur-Verfahren effizienter. Sie finden Verwendung bei allen PSK-Modulationen wie auch bei geradzahligen (22n) QAM-Modulationen. Benachbarte, durch Rauschen sehr wahrscheinlich auftretende fehlerhafte Codeworte unterscheiden sich nur um 1 Bit. Nicht perfekt lassen sie sich umsetzen bei APSK-Modulationen (z. B. APSK-16 und APSK-32) und bei ungeradzahligen (22n+1) QAM-Modulationen.

  • Codes 4-PSK
    Codes 4-PSK
  • Codes 8-PSK
    Codes 8-PSK
  • Codes 16-QAM
    Codes 16-QAM

Beispiel

[Bearbeiten | Quelltext bearbeiten]

Die Dezimalzahl 4 10 = 100 2 {\displaystyle 4_{10}=100_{2}} {\displaystyle 4_{10}=100_{2}} entspricht dem Gray-Code 6 10 = 110 2 {\displaystyle 6_{10}=110_{2}} {\displaystyle 6_{10}=110_{2}}. Die Dekodierung in die Dezimaldarstellung folgt dann der Regel 1 ⋅ 7 10 − ( 1 ⋅ 3 10 − 0 ⋅ 1 10 ) = 4 10 {\displaystyle 1\cdot 7_{10}-(1\cdot 3_{10}-0\cdot 1_{10})=4_{10}} {\displaystyle 1\cdot 7_{10}-(1\cdot 3_{10}-0\cdot 1_{10})=4_{10}}. Wenn mehrere Einsen in einer Gray-Code-Zahl vorkommen, werden diese voneinander subtrahiert: Der Gray-Code 7 10 = 111 2 {\displaystyle 7_{10}=111_{2}} {\displaystyle 7_{10}=111_{2}} wird wie folgt dekodiert: 1 ⋅ 7 10 − ( 1 ⋅ 3 10 − 1 ⋅ 1 10 ) = 5 10 {\displaystyle 1\cdot 7_{10}-(1\cdot 3_{10}-1\cdot 1_{10})=5_{10}} {\displaystyle 1\cdot 7_{10}-(1\cdot 3_{10}-1\cdot 1_{10})=5_{10}}.

Allgemeines Verfahren: Bei einer Umwandlung ist entscheidend, an welcher Position die Einser stehen. Die Position hat Einfluss auf die Rechnung. Wenn wir uns die Zahl 100 anschauen, dann steht die Eins auf Position 3 (von rechts nach links). Den Faktor fĂŒr die Eins bekommt man, indem man sich ĂŒberlegt, welche Dezimalzahl maximal in einer 3-Bit Zahl binĂ€r gespeichert werden kann. In 3 Bit BinĂ€rcode kann maximal die Zahl 7 (111) gespeichert werden. Nehmen wir jetzt eine grĂ¶ĂŸere BinĂ€rzahl, funktioniert das praktisch analog. BinĂ€rzahl: 11010 (1 an Position 5,4 und 2). 5 Bit BinĂ€rzahl: max. 31 4 Bit BinĂ€rzahl: max. 15 2 Bit BinĂ€rzahl: max. 3

Berechnung: 31 10 − ( 15 10 − 3 10 ) = 19 {\displaystyle 31_{10}-(15_{10}-3_{10})=19} {\displaystyle 31_{10}-(15_{10}-3_{10})=19}

Gray-Code zurĂŒckrechnen

[Bearbeiten | Quelltext bearbeiten]

Eine Zeile des Gray-Codes kann in die Zeilennummer zurĂŒckgerechnet werden, indem alle Bits vom höchstwertigen Bit bis zum aktuellen Bit mit einem exklusiven Oder verknĂŒpft werden. Dazu werden die Bits der Zeile mit jedem Iterationsschritt jeweils um 1 Bit nach rechts verschoben und mit dem Zwischenergebnis mit einem exklusiven Oder verknĂŒpft.[9]

Das folgende Beispiel zeigt die Implementierung einer Funktion, die die Zeile eines (beliebigen n-Bit) binÀren reflektierten Gray-Codes decodiert:

int GrayDecode (int const CodeWort)
{
    int res  = CodeWort;
    int mask = CodeWort;  // Die Bitmaske ist der Gray-Code res mit einer Rechtsverschiebung der Bits

    while (mask)          // Solange nicht alle gesetzten Bits nach rechts verschoben sind und der Wert ungleich 0 ist ...
    {
        mask >>= 1;       // Rechtsverschiebung um 1 Bit
        res  ^= mask;     // Exklusives Oder mit der Bitmaske
    }
    return res;
}

Spezielle Gray-Codes

[Bearbeiten | Quelltext bearbeiten]

Gray-Codes mit m bits und LĂ€nge kleiner als 2m

[Bearbeiten | Quelltext bearbeiten]

Es existieren auch Gray-Codes mit m {\displaystyle m} {\displaystyle m} Bits mit einer LĂ€nge von weniger als 2 m {\displaystyle 2^{m}} {\displaystyle 2^{m}}. HierfĂŒr muss LĂ€nge gerade sein. Eine Möglichkeit, sie zu konstruieren, besteht in der Verwendung eines Standard-Gray-Codes und dem paarweisen Wegstreichen entweder des ersten und des letzten Eintrags oder von EintrĂ€gen in der Mitte[10]. Die OEIS-Folge A290772[11] zĂ€hlt die Anzahl der möglichen Gray-Codes der LĂ€nge 2 n {\displaystyle 2n} {\displaystyle 2n} auf, wofĂŒr jeweils die minimale Anzahl von Bits verwendet werden.

Excess-Gray-Code

[Bearbeiten | Quelltext bearbeiten]

Wird aus einem Gray-Code ein Ausschnitt herausgetrennt, beispielsweise die letzten 3 Bit eines 4-Bit-Gray-Codes, so erhĂ€lt man einen sogenannten Excess-Gray-Code. Dieser Code zeichnet sich dadurch aus, dass die betroffenen, herausgetrennten Bits bei weiterem HochzĂ€hlen des originalen Codewortes rĂŒckwĂ€rts zĂ€hlen. Dies ist dadurch bedingt, dass bei einer Gray-Codierung kein Überlauf bei der höchsten Zahl entsteht, wie man ihn aus dem klassischen BinĂ€rsystem kennt.[12]

Beispiel: Die höchste mit einem 3-Bit-Gray-Code codierte Zahl, also 7, wird als (0)100 reprĂ€sentiert. Weiteres Addieren einer 1 resultiert in einer 8, im Gray-Code 1100. Die letzten 3 Bit erfahren keinen Überlauf und verhalten sich bei weiterem HochzĂ€hlen genau entgegengesetzt zur ursprĂŒnglichen ZĂ€hlrichtung.

Bei Sensoren, die mehrere Werte seriell als Gray-codierte Werte ausgeben, sollte daher darauf geachtet werden, ob es sich um einen zusammengesetzten Gray-Code oder um separate Codeworte handelt, da die ausgegebenen Werte sonst den Anschein erwecken, der Sensor wĂŒrde rĂŒckwĂ€rts zĂ€hlen.

Geschichte

[Bearbeiten | Quelltext bearbeiten]

Noch bevor die Bezeichnung Gray-Code eingefĂŒhrt wurde, gab es bereits mathematische Knobelspiele, in denen das Prinzip angewendet wurde. Erst spĂ€ter fand der Code die Beachtung von Ingenieuren. Bereits 1874 wendete Otto SchĂ€ffler, der in Wien Telegrafen und Telefone produzierte und verbesserte, den reflektierten Gray-Code an. Der Franzose Jean-Maurice-Émile Baudot verwendete Gray-Codes im Jahr 1874 fĂŒr die elektrische Telegrafie. Er erhielt fĂŒr seine Arbeit die Auszeichnung der französischen Ehrenlegion.

Namensgebend war allerdings Frank Gray, Forscher in den Bell Laboratories, der den schon 1941 von George Stibitz beschriebenen Code[13] im Jahre 1947 fĂŒr seine Zwecke wiederentdeckte. Unter dem Titel Pulse Code Communications wurde im Jahre 1953 ein Patent fĂŒr eine Gray-kodierende Elektronenröhre erteilt.[1]

Ähnliche Codes

[Bearbeiten | Quelltext bearbeiten]
  • 1-aus-10-Code
  • Aiken-Code
  • BCD-Code
  • Gillham-Code
  • Libaw-Craig-Code
  • Stibitz-Code

Literatur

[Bearbeiten | Quelltext bearbeiten]
  • Robert W. Doran: The Gray Code. In: Journal of Universal Computer Science. Band 13, Nr. 11, 2007, S. 1573–1597 (karadimov.info [PDF; 219 kB]). 

Weblinks

[Bearbeiten | Quelltext bearbeiten]
Commons: Gray code â€“ Sammlung von Bildern, Videos und Audiodateien
  • Java-Beispiel fĂŒr die Umwandlung einer Dezimalzahl in Gray-Code Darstellung (Memento vom 30. September 2007 im Internet Archive)
  • Algorithmen zur Erzeugung des reflektierten Gray-Codes auf dem Combinatorial Object Server

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. ↑ a b Patent US2632058A: Pulse code communication. Angemeldet am 13. November 1947, veröffentlicht am 17. MĂ€rz 1953, Anmelder: Bell Telephone Labor Inc, Erfinder: Frank Gray.‌
  2. ↑ EE Times: Gray Code Fundamentals – Part 2
  3. ↑ Girish S. Bhat, Carla D. Savage: Balanced Gray Codes. In: The Electronic Journal of Combinatorics. 28. August 1996, ISSN 1077-8926, S. R25–R25, doi:10.37236/1249 (combinatorics.org [abgerufen am 22. Mai 2021]). 
  4. ↑ GeeksforGeeks: Generate n-bit Gray Codes
  5. ↑ Rosetta Code: Gray code
  6. ↑ A003042: Number of directed Hamiltonian cycles (or Gray codes) on n-cube. (Formerly M2053)
  7. ↑ Girish S. Bhat, Carla D. Savage, North Carolina State University: Balanced Gray Codes
  8. ↑ Robert W. Doran: The Gray Code. In: Journal of Universal Computer Science. Band 13, Nr. 11, 2007, S. 1575, 1577. 
  9. ↑ LĂ©nĂĄrd Szolnoki's programming site: Implementations for Gray code encoding and decoding
  10. ↑ Max Maxfield: How to generate Gray Codes for non-power-of-2 sequences. 29. Juni 2007, abgerufen am 25. Februar 2023 (englisch). 
  11. ↑ A290772: Number of cyclic Gray codes of length 2n which include all-0 bit sequence and use the least possible number of bits.
  12. ↑ AutomationDirect: What are Excess Gray Codes?
  13. ↑ Patent US2307868A: Binary counter. Angemeldet am 26. November 1941, veröffentlicht am 12. Januar 1943, Anmelder: Bell Telephone Labor Inc, Erfinder: George R. Stibitz.‌
Abgerufen von „https://de.wikipedia.org/w/index.php?title=Gray-Code&oldid=258913717“
Kategorien:
  • BinĂ€rcode
  • Kodierungstheorie

  • indonesia
  • Polski
  • Ű§Ù„ŰčŰ±ŰšÙŠŰ©
  • Deutsch
  • English
  • Español
  • Français
  • Italiano
  • Ù…Ű”Ű±Ù‰
  • Nederlands
  • æ—„æœŹèȘž
  • PortuguĂȘs
  • Sinugboanong Binisaya
  • Svenska
  • ĐŁĐșŃ€Đ°Ń—ĐœŃŃŒĐșа
  • Tiáșżng Việt
  • Winaray
  • äž­æ–‡
  • РуссĐșĐžĐč
Sunting pranala
Pusat Layanan

UNIVERSITAS TEKNOKRAT INDONESIA | ASEAN's Best Private University
Jl. ZA. Pagar Alam No.9 -11, Labuhan Ratu, Kec. Kedaton, Kota Bandar Lampung, Lampung 35132
Phone: (0721) 702022
Email: pmb@teknokrat.ac.id