Instytut Informatyki Politechnika Poznańska
Proces transmisji może w prowadzać błędy do przesyłanych wiadomości błędy pojedyncze lub grupowe Detekcja: Wymaga uznania, że niektóre wiadomości są nieważne Wymaga dodatkowych bitów (nadmiarowość) Kod (n,k) zawiera słowa kodowe n-bitowe z k-bitami danych i r=(n-k) bitami nadmiarowymi Korekcja Korekcja błędów: wiele słów kodowych jest zmapowanych do tego samego słowa danych Detekcja i retransmisja 01-2014 2
Odległość Hamminga Odległość Hamminga dwóch słów bitowych = liczba pozycji na których różnią się te słowa Jeśli słowa kodowe mają minimalną odległość Hamminga D, wtedy można wykryć D-1 błędów bitowych Jeśli dostępne słowa kodowe mają minimalną odległość Hamminga D, wtedy można skorygować [(D-1)/2] błędów bitowych 1 0 1 1 0 1 1 0 1 0 HD=2 01-2014 3
Kod 01-2014 4
Błąd detekcji 01-2014 5
Błąd niewykryty 01-2014 6
Detekcja błędów 01-2014 7
Korekcja błędów 01-2014 8
Parzystość 1-bit zabezpieczenia - detekcja Każde słowo kodowe zawiera parzystą liczbę jedynek Dostępne słowa danych 01 11 00 10 011 111 Kodowanie parzystości: Biały błąd 010 110 000 100 001 101 01-2014 9
Głosowanie 1-bitowa korekcja z głosowaniem Każde słowo jest n-razy powtarzane Dostępne słowa danych 0 1 Głosowanie: Biały korekcja na 1 Niebieski korekcja na 0 011 111 010 110 000 100 001 101 01-2014 10
Przykłady Dostępne słowa Parzystość 01 11 00 10 011 111 Kodowanie parzystości: Biały błąd 010 110 000 100 001 101 Dostępne słowa Głosowanie 0 1 Głosowanie: Biały korekcja na 1 Niebieski korekcja na 0 011 111 010 110 000 100 001 101 01-2014 11
Techniki cyfrowej detekcji błędów Dwuwymiarowa parzystość Wykrywa do 3 błędnych bitów Dobre rozwiązanie dla paczek błędów Słowo kontrolne IP Proste dodawanie Prosta realizacja programowa Słowo kontrolne CRC Skuteczne rozwiązanie matematyczne (Galois Fields) Uproszczenia w realizacji programowej Proste w realizacji sprzętowej Powszechnie stosowane w protokołach transmisji 01-2014 12
Parzystość dwuwymiarowa 0101001 Parzystość bitów 1 Wykorzystana parzystość 1- wymiarowa Dane 1101001 1011110 0001110 0 1 1 Dodany drugi wymiar Dodano dodatkowy bajt Bajt Parzystości 0110100 1 1011111 0 1111011 0 Komentarz Wykrywa wszystkie błędy 1-, 2- i 3- bitów oraz dużo błędów 4-bitowych 01-2014 13
Słowo kontrolne IP Idea Dodać wszystkie słowa Wysłać wszystkie słowa Słowo kontrolne IP Wykorzystanie uzupełnienia 1-kowego dla 16-bitowych słów kodowych Przykład Słowo kodowane: 5 3 = 8 Postać binarna 0101 0011 = 1000 Suma komplementarna 0111 Prosta implementacja 01-2014 14
Słowo kontrolne IP u_short cksum(u_short *buf, int count) { register u_long sum = 0; while (count--) { sum += *buf++; if (sum & 0xFFFF0000) { /* carry occurred, so wrap around */ sum &= 0xFFFF; sum++; } } return ~(sum & 0xFFFF); } 01-2014 15
Słowo kontrolne CRC (ang. Cyclic Redundancy Check) Cel Maksymalizacja zabezpieczenia, minimalizacja ekstra bitów Idea Dodanie k bitów nadmiarowych do n-bitowej wiadomości N-bitowy komunikat może być przedstawiony jako n-bitowy wielomian, w którym każdy bit odpowiada współczynnikowi wielomianu Przykład Wiadomość = 10011010 Wielomian = 1 x 7 0 x 6 0 x 5 1 x 4 1 x 3 0 x 2 1 x 0 = x 7 x 4 x 3 x 01-2014 16
Słowo kontrolne CRC (ang. Cyclic Redundancy Check) Przykład kodowania G(x) = x 3 x 2 1 = 1101 Generator M(x) = x 7 x 4 x 3 x = 10011010 Komunikat 1101 Nadmiar m mod c 10011010000 Komunikat plus k zer 1101 1001 1101 1000 1101 1011 1101 1100 1101 1000 1101 101 Wynik: Transmisja komunikatu z dodanym nadmiarem: 10011010101 01-2014 17
Słowo kontrolne CRC (ang. Cyclic Redundancy Check) Przykład dekodowania brak błędów G(x) = x 3 x 2 1 = 1101 Generator P(x) = x 10 x 7 x 6 x 4 x 2 1 = 10011010101 Odebrany komunikat 1101 Nadmiar m mod c 10011010101 Odebrany komunikat bez 1101 błędów 1001 1101 1000 1101 1011 1101 1100 1101 1101 1101 0 Wynik: Poprawny test CRC 01-2014 18
CRC (ang. Cyclic Redundancy Check) Realizacja sprzętowa Q4 Q D Q3 Q D Q2 Q D Q1 Q D serial_in CLK G(x) = x 3 x 1 01-2014 19
CRC (ang. Cyclic Redundancy Check) Realizacja sprzętowa - kodowanie G(x) = x 3 x 1 01-2014 20
CRC (ang. Cyclic Redundancy Check) Realizacja sprzętowa dekodowanie G(x) = x 3 x 1 01-2014 21
CRC (ang. Cyclic Redundancy Check) 01-2014 22
CRC (ang. Cyclic Redundancy Check) G(x) = x 3 x 1 01-2014 23
CRC (ang. Cyclic Redundancy Check) G(x) = x 3 x 1 01-2014 24
CRC (ang. Cyclic Redundancy Check) Wada dane przy kodowaniu trzeba uzupełnić o r bitów (same zera) 01-2014 25
CRC (ang. Cyclic Redundancy Check) Realizacja sprzętowa kodowanie inna realizacja szybsza operacja kodowania SQ x 3 + x 2 2 + 1 0 x 0 Wejście danych G(x) = x 3 x 1 01-2014 26
CRC (ang. Cyclic Redundancy Check) Realizacja sprzętowa dekodowanie inna realizacja SQ x 3 + x 2 2 + 1 0 x 0 Wejście danych 01-2014 27
CRC (ang. Cyclic Redundancy Check) Generator pseudolosowy Q4 Q D Q3 Q D Q2 Q D Q1 Q D CLK G(x) = x 3 x 1 0 0 0 1 0 xor 0 0 0 0 0 0 0 0 1 0 0 xor 0 0 0 0 0 0 0 1 0 0 0 xor 0 0 0 0 0 0 1 0 0 0 0 xor 1 0 0 1 1 0 0 0 1 1 0 xor 0 0 0 0 0 0 0 1 1 0 0 xor 0 0 0 0 0 0 1 1 0 0 0 xor 1 0 0 1 1 Q4 Q3 Q2 Q1 0 1 0 1 1 0001 0010 0100 1000 0011 0110 1100 1011 0101 1010 0111 1110 1111 1101 1001 0001 01-2014 28
CRC (ang. Cyclic Redundancy Check) Wielomiany generujące CRC C(x) CRC-8 x 8 x 2 x 1 1 CRC-10 x 10 x 9 x 5 x 4 x 1 1 CRC-12 x 12 x 11 x 3 x 2 x 1 1 CRC-16 x 16 x 15 x 2 1 CRC-CCITT x 16 x 12 x 5 1 CRC-32 x 32 x 26 x 23 x 22 x 16 x 12 x 11 x 10 x 8 x 7 x 5 x 4 x 2 x 1 1 01-2014 29
CRC (ang. Cyclic Redundancy Check) Przykłady 01-2014 30
CRC (ang. Cyclic Redundancy Check) Przykłady 01-2014 31
CRC (ang. Cyclic Redundancy Check) Przykłady 01-2014 32
CRC (ang. Cyclic Redundancy Check) Modbus LRC (ang. Longitudinal Redundancy Check) LRC Przykładowy kod Funkcja przedstawia sposób wyznaczenia bajta LRC w języku C BYTE LRC (BYTE *ndata, WORD wlength) { BYTE nlrc = 0 ; // LRC char initialized for (int i = 0; i < wlength; i++) nlrc += *ndata++; return (BYTE)(-nLRC); } // End: LRC Krok 1 - dodać wszystkie wymagane bajty Krok 2 - zanegować wynik (uzupełnienie jedynkowe) Krok 3 - dodać 1 (uzupełnienie dwójkowe) 01-2014 33
Modbus wyznaczanie CRC G(x) = x 16 + x 15 + x 2 + 1 01-2014 34
Modbus wyznaczanie CRC void main() { unsigned char data[numdata+2]; // Message buffer unsigned char Crc_HByte,LByte; // unsigned int Crc;... Crc=0xFFFF; for (i=0; i<numdata; i++) { Crc = CRC16 (Crc, data[i] ); } Crc_LByte = (Crc & 0x00FF); // Low byte calculation Crc_HByte = (Crc & 0xFF00) / 256; // High byte calculation } // CRC16 calculation // ---------------- unsigned int CRC16(unsigned int crc, unsigned int data) { const unsigned int Poly16=0xA001; unsigned int LSB, i; crc = ((crc^data) 0xFF00) & (crc 0x00FF); for (i=0; i<8; i++) { LSB=(crc & 0x0001); crc=crc/2; if (LSB) crc=crc^poly16; } return(crc); } 01-2014 35
Dziękuję 36 09-2006