Kodowanie korekcyjne błędów
Autorzy: Andrzej R. Pach, Piotr Chołda
Pliki: rozdzial_21.zip
Zamieszczono jedynie te przykłady z książki, które zawierają opracowane programy w MATLABie. Inne przykłady, mające charakter ilustracji, zostały tutaj pomienięte.
Przykład 21.3
Przykład w języku MATLAB pokazuje, jak oblicza się wartości ciągów kodowych z użyciem funkcji dod_bit_parz (plik dod_bit_parz.m), przy zadanych ciągach informacyjnych, stosując kod z kontrolą parzystości.% Przykład 21.03 function x = dod_bit_parz(u) % Funkcja dodaje bit parzystości na koniec ciągu zadanego zmienną u m = length(u); bit = 0; x = 0; for j=1:m bit = mod(u(j)+bit,2); % mod - suma bitowa modulo dwa end x = [u,bit];
Przykład 21.4
Przykład w języku MATLAB pokazuje z użyciem funkcji prawd_kontr_parz (plik prawd_kontr_patrz.m), w jaki sposób zależność (21.7) podana na stronie 812 zmienia się przy różnych wartościach p oraz n.% Przykład 21.04 function wynik = prawd_kontr_parz(P) % Funkcja rysuje wykres zależności dla zadanej wartości prawdopodobieństwa zadanego zmienną P nmin = 1; krok = 1; nmax = 100; n = nmin:krok:nmax; p1 = ((n-1)*P).*((1-P).^(n-1)); figure(1); plot(n,p1); grid on;
Przykład 21.5
Przykład w języku MATLAB pokazuje z użyciem funkcji gen_kod_lin (plik gen_kod_lin.m), jak na podstawie macierzy G otrzymywać ciągi kodowe.% Przykład 21.05 function [X,dmin] = gen_kod_lin(G) % Funkcja generuje słowa kodu liniowego o zadanej macierzy generującej zadanej jako zmienna G % Podaje również odleglość minimalną dla tego kodu oraz znajduje słowa kodowe % Np. G = [1 0 0 1; 0 1 0 1; 0 0 1 1] dla kodu (3,4) z kontrolą parzystości [k,n] = size(G); if(k>n) disp('Błędna macierz generująca! k>n'); else dmin=n; X = []; for i=0:2^k-1 u=dec2bin(i,k)-'0'; x=mod(u*G,2); X = [X; x]; fprintf('u = [%s] odpowiada x = [%s]\n', num2str(u), num2str(x)); d=mean(x)*n; if(i>0 & dmin>d) dmin=d; end end end
Przykład 21.6
Przyklad w jezyku MATLAB pokazuje z uzyciem funkcji ham_cod_corr (plik ham_cod_corr.m), jak mozna korygowac bledy jednokrotne za pomoca kodu Hamminga.% Przykład 21.06 function x = ham_cod_corr(y) % Funkcja koryguje słowo zadane zmienną y, otrzymane po przesłaniu poprawnego ciągu kodu % Hamminga (2^r-1,2^r-1-r) przez kanał n = length(y); r = log(n+1)/log(2); if(r~=floor(r) || r~=ceil(r)) disp('To nie jest odpowiednia długość słowa kodowego!'); else k = n-r; fprintf('To jest kod (%d,%d) o macierzy testów parzystości:\n',n,k); H = [zeros(r-1,1);1]; for i=2:2^r-1 H = [H transpose(dec2bin(i,r)-'0')]; end disp(H); syndrom = mod(y*transpose(H),2); fprintf('Syndrom dla y = [%s] to s = [%s], zatem:\n',... num2str(y),num2str(syndrom)); if(mean(syndrom) == 0) fprintf('przyjmujemy, ze nie wystąpiło przekłamanie.\n'); else pozycja = bin2dec(num2str(syndrom)); fprintf('przyjmujemy, ze przekłamanie wystąpiło na pozycji nr %d,\n',... pozycja); y(pozycja) = mod(y(pozycja)+1,2); x=y; fprintf('a wysłano słowo kodowe [%s].\n',num2str(y)); end end
Przykład 21.8
Przykład w języku MATLAB pokazuje z użyciem funkcji mnoz_wiel_bin (plik mnoz_wiel_bin.m) dostarczonej z książką T.K. Moona "Error Correction Coding" [2], jak można mnożyć wielomiany.% Przykład 21.08 function w = mnoz_wiel_bin(p,q) % Funkcja mnoży wielomiany zadane zmiennymi p i q i zwraca w(x) % Współczynniki wielomianów sś reprezentowane od najwyższej potęgi: % x^3 + x + 1 = [1 0 1 1] % Spolszczona wersja programu dostarczonego wraz z książką % T.K. Moona "Error Correction Coding" m = 2; % GF(2) - współczynniki binarne if(all(p==0) | all(q==0)) w = 0; else w = mod(conv(p,q),m); end
Przykład 21.9
Przykład w języku MATLAB pokazuje z użyciem funkcji dziel_wiel_bin (plik dziel_wiel_bin.m) dostarczonej z książką T.K. Moona "Error Correction Coding" [2], jak można dzielić wielomiany.% Przykład 21.09 function [w,r] = dziel_wiel_bin(p,q) % Funkcja dzieli wielomiany zadane zmiennymi p i q i zwraca wynik w oraz resztę r % Współczynniki wielomianów są reprezentowane od najwyższej potęgi: % x^3 + x + 1 = [1 0 1 1] % Spolszczona wersja programu dostarczonego wraz z książką % T.K. Moona "Error Correction Coding" m = length(p); n = length(q); w = 0; t = 2; % GF(2) - współczynniki binarne b1inv = mod(q(1)^(t-2),t); for j=1:m-n+1 w (j) = mod(p(j)*b1inv,t); for l=2:n p(l+j-1) = mod(p(l+j-1) - w(j)*q(l),t); end end r = mod(p(m-n+2:m),t); if(all(r==0)) r = 0; end
Przykład 21.12
Przykład w języku MATLAB pokazuje z użyciem funkcji gen_mac_wiel(plik gen_mac_wiel.m), jak za pomocą wielomianu generującego wytworzyć macierze generujące.% Przykład 21.12 function [Gniesyst, Gsyst] = gen_mac_wiel(g,n) % Funkcja wytwarza macierze generujące kodów niesystematycznego i % systematycznego dla wielomianu generującego zadanego zmienną g % % Współczynniki wielomianów sa reprezentowane od najwyzszej potegi: % x^3 + x + 1 = [1 0 1 1] r = length(g) - 1; k = n - r; if(k>n) disp('Błędne dane, k>n!'); else fprintf('Parametry kodu (%d,%d)\n',n,k); Gniesyst = []; for i=1:k u = zeros(1,k); u(i) = 1; Gniesyst = [Gniesyst; mnoz_wiel_bin(u,g)]; end fprintf('Macierz kodu niesystematycznego:\n'); disp(Gniesyst); Gsyst = []; for i=1:k u = zeros(1,n); u(i) = 1; [w,r] = dziel_wiel_bin(u,g); Gsyst = [Gsyst; [u(1:k) r]]; end fprintf('Macierz kodu systematycznego:\n'); disp(Gsyst); end