logo资料库

信道仿真matlab代码范例.pdf

第1页 / 共22页
第2页 / 共22页
第3页 / 共22页
第4页 / 共22页
第5页 / 共22页
第6页 / 共22页
第7页 / 共22页
第8页 / 共22页
资料共22页,剩余部分请下载后查看
Channel Coding I Matlab solutions of the exercises – WS 2004/2005 – Dirk W¨ubben NW1, Room N 2380, Tel.: 0421/218-2545 E-mail: wuebben@ant.uni-bremen.de Universit¨at Bremen, FB1 Institut f¨ur Telekommunikation und Hochfrequenztechnik Arbeitsbereich Nachrichtentechnik Prof. Dr.-Ing. K. D. Kammeyer Postfach 33 04 40 D–28334 Bremen WWW-Server: http://www.ant.uni-bremen.de Version from 13th January 2005 1 INTRODUCTION 13th January 2005 2 1 Introduction MATLAB Solution of exercise 1.1 Design of a discrete channel % ################################################################################## % ## Loesung: Grundlegendes zur Kanalcodierung ## % ## -------------------------------------------------------------------------- ## % ## Aufgabe 1.1) Entwurf eines diskreten Kanals ## % ## -------------------------------------------------------------------------- ## % ## benoetigte Matlab-Dateien: ## % ################################################################################## % ############################################################################# % ##### Aufgabenteil a) Entwurf eines diskreten Kanals ##### % ############################################################################# disp(’Aufgabenteil a) Entwurf eines diskreten Kanals’); sigma2 = 1; P11 = erf(sqrt(0.5/sigma2)); P33 = 0.5 + 0.5 * erf(sqrt(0.5/sigma2)); P13 = 0.5 * erfc(sqrt(0.5/sigma2)); P31 = 0.5 * (erf(sqrt(4.5/sigma2)) - erf(sqrt(0.5/sigma2))); P1_3 = 0.5 * erfc(sqrt(4.5/sigma2)); P3_3 = 0.5 * erfc(sqrt(12.5/sigma2)); P3_1 = 0.5 * (erf(sqrt(12.5/sigma2)) - erf(sqrt(4.5/sigma2))); disp(’Matrix der Uebergangswahrscheinlichkeiten: ’); P_yx = [ P33 P31 P3_1 P3_3; P13 P11 P31 P1_3; P1_3 P31 P11 P13; P3_3 P3_1 P31 P33] disp(’Weiter mit beliebiger Taste’); pause; % ############################################################### % ##### Aufgabenteil b) Ueberpruefen der Matrix ##### % ############################################################### disp(’Aufgabenteil b) Ueberpruefen der Matrix’); disp(’Summe ueber alle Spalten muss entsprechend Gl. (2.4.8) Eins ergeben: ’); sum(P_yx,2) disp(’Vorsicht! Dies gilt nicht fuer alle Spalten’); sum(P_yx,1) disp(’Weiter mit beliebiger Taste’); pause; % ###################################################################### % ##### Aufgabenteil c) Verbundwahrscheinlichkeiten ##### % ###################################################################### disp(’Aufgabenteil c) Verbundwahrscheinlichkeiten’); disp(’Matrix der Verbundwahrscheinlichkeit fr P(D)=0.25:’) Pxy=0.25 * P_yx disp(’Weiter mit beliebiger Taste’); pause; % ############################################################### % ##### Aufgabenteil d) Auftrittswahrscheinlichkeit ##### % ############################################################### disp(’Aufgabenteil d) Auftrittswahrscheinlichkeit’); Py = sum(Pxy,1); disp(’Die Auftrittswahrscheinlichkeit der Kanalausgangssymbole betraegt:’); P_xy = Pxy ./ (ones(4,1)*Py)
1 INTRODUCTION 13th January 2005 3 1 INTRODUCTION 13th January 2005 4 disp(’Weiter mit beliebiger Taste’); pause; % ################################################################# % ##### Aufgabenteil e) Fehlerwahrscheinlichkeit fuer ##### % ##### Sendeymbole und mittlere Gesamtfehler##### % ################################################################# disp(’Aufgabenteil e) Fehlerwahrscheinlichkeit fuer Sendesymbole’); disp(’Die Fehlerwahrscheinlichkeit fuer die Sendesymbole betraegt:’); P_e = sum(P_yx - diag(diag(P_yx))) disp(’Als mittlere Gesamtfehlerwahrscheinlichkeit erhaelt man:’); P_eg = sum(P_e)*.25 disp(’Ende von Aufgabe 1.1’); MATLAB Solution of exercise 1.2 Statistics of the channel % ############################################################################## % ## Loesung: Grundlegendes zur Kanalcodierung ## % ## ---------------------------------------------------------------------- ## % ## Aufgabe 1.2) Statistik des diskreten Kanals ## % ## ---------------------------------------------------------------------- ## % ## benoetigte Matlab-Dateien: ## % ############################################################################## % ############################################################################## % ##### Aufgabenteil a) Ergaenzen der fehlenden Wahrscheinlichkeiten ##### % ############################################################################## % erster Kanal disp(’Erster Kanal’); P_d = zeros(2,1); P1_yd = zeros(2,3); P1_y = zeros(3,1); %gegebene Wahrscheinlichkeiten P_d(1) = 0.2; P1_yd(1,1) = 0.7; P1_y(1) = 0.3; %Wahrscheinlichkeiten fuer Eingangssymbol P_d(2) = 1-P_d(1); %Uebergangswahrscheinlichkeit fuer D0 -> Y1 P1_yd(1,2) = 1-P1_yd(1,1); %Wahrscheinlichkeiten fuer Ausgangssymbole P1_y(2) P1_y(3) = P_d(1)*P1_yd(1,2); = 1-P1_y(1)-P1_y(2); %Uebergangswahrscheinlichkeit fuer D1 -> Y1 und D1 -> Y2 P1_yd(2,1) = (P1_y(1)-P_d(1)*P1_yd(1,1))/P_d(2); P1_yd(2,3) = 1-P1_yd(2,1); disp(’Auftrittswahrscheinlichkeiten der Eingangssymbole’); P_d disp(’Uebergangswahrscheinlichkeiten’); P1_yd disp(’Auftrittswahrscheinlichkeiten der Ausgangssymbole’); P1_y % zweiter Kanal disp(’Zweiter Kanal’); P2_d = zeros(2,1); P2_yd = zeros(2,3); P2_y = zeros(3,1); %gegebene Wahrscheinlichkeiten P2_d(1)=0.2; P2_yd(1,1) = 0.8; P2_yd(2,3) = 0.8; P2_y(2) = 0.08; %Wahrscheinlichkeiten fuer Eingangssymbol P2_d(2) = 1-P2_d(1); %Uebergangswahrscheinlichkeiten P2_yd(1,3) = 1-P2_yd(1,1); P2_yd(2,2) = P2_y(2)/P_d(2); P2_yd(2,1) = 1-P2_yd(2,2)-P2_yd(2,3); %Wahrscheinlichkeiten fuer Ausgangssymbole P2_y(3) = P_d(1)*P2_yd(1,3)+P_d(2)*P2_yd(2,3); P2_y(1) = 1-P2_y(2)-P2_y(3); disp(’Auftrittswahrscheinlichkeiten der Eingangssymbole’); P2_d disp(’Uebergangswahrscheinlichkeiten’); P2_yd disp(’Auftrittswahrscheinlichkeiten der Ausgangssymbole’); P2_y disp(’Weiter mit beliebiger Taste’); pause; % ############################################################################## % ##### Aufgabenteil c) Fehlerwahrscheinlichkeit bei HD ##### % ############################################################################## disp(’Aufgabenteil c) Fehlerwahrscheinlichkeit bei Hard-Decision’); % erster Kanal disp(’Fehlerwahrscheinlichkeit erster Kanal fuer Y*=Y_1:’); P1_e = P_d(2)*P1_yd(2,1) disp(’Fehlerwahrscheinlichkeit erster Kanal fuer Y*=Y_0:’); P1_e = P_d(1)*P1_yd(1,1) % zweiter Kanal disp(’Fehlerwahrscheinlichkeit zweiter Kanal fuer Y*=Y_1:’); P2_e = P_d(1)*P2_yd(1,3) + P_d(2)*P2_yd(2,1) disp(’Fehlerwahrscheinlichkeit zweiter Kanal fuer Y*=Y_1:’); P2_e = P_d(1)*P2_yd(1,3) + P_d(2)*P2_yd(2,1) disp(’Weiter mit beliebiger Taste’); pause; % ############################################################################## % ##### Aufgabenteil d) Fehlerwahrscheinlichkeit ohne HD ##### % ############################################################################## disp(’Aufgabenteil d) Fehlerwahrscheinlichkeit ohne HD’); % erster Kanal disp(’Fehlerwahrscheinlichkeit erster Kanal fuer Y*=Y_1:’); P1_e = P_d(2)*P1_yd(2,1) disp(’Ausloeschwahrscheinlichkeit erster Kanal fuer Y*=Y_1:’); P1_q = P_d(1)*P1_yd(1,2) disp(’Fehlerwahrscheinlichkeit erster Kanal fuer Y*=Y_0:’); P1_e = 0 disp(’Ausloeschwahrscheinlichkeit erster Kanal fuer Y*=Y_0:’); P1_q = P_d(1)*P1_yd(1,1) + P_d(2)*P1_yd(2,1) % zweiter Kanal disp(’Fehlerwahrscheinlichkeit zweiter Kanal fuer Y*=Y_1:’); P2_e = P_d(1)*P2_yd(1,3) + P_d(2)*P2_yd(2,1) disp(’Ausloeschwahrscheinlichkeit zweiter Kanal fuer Y*=Y_1:’); P2_q = P_d(2)*P2_yd(2,2) disp(’Fehlerwahrscheinlichkeit zweiter Kanal fuer Y*=Y_0:’); P2_e = P_d(2)*P2_yd(2,1) disp(’Ausloeschwahrscheinlichkeit zweiter Kanal fuer Y*=Y_0:’);
1 INTRODUCTION 13th January 2005 5 1 INTRODUCTION 13th January 2005 6 fprintf(’\nPe(D0)=%2.2f\n’,P_e(1)); fprintf(’\nPe(D1)=%2.2f\n’,P_e(2)); disp(’Gesamtfehlerwahrscheinlichkeit’); Pg_e = 0.2*P_e(1) + 0.8*P_e(2) disp(’fuer das Ausloeschungssymbol gilt’); P_q = 0.2*Pg_yq(1,3) + 0.8*Pg_yq(2,3) disp(’Weiter mit beliebiger Taste’); pause; % ############################################################### % ##### Aufgabenteil c) Hard Decision fuer einen diskreten ##### % ##### ##### % ############################################################### Kanal disp(’Aufgabenteil c) Hard Decision fuer einen diskreten Kanal’); disp(’Uebergangswahrscheinlichkeiten des binaeren Kanals’); P_eh = zeros(2,1); P_eh(1) = Pg_yq(1,3) + Pg_yq(1,4); P_eh(2) = Pg_yq(2,1) + Pg_yq(2,2); fprintf(’\nPe(D0)=%2.2f\n’,P_eh(1)); fprintf(’\nPe(D1)=%2.2f\n’,P_eh(2)); disp(’Fehlerwahrscheinlichkeit der kombinierten Kanaele’); Pg_eh = 0.2*P_eh(1) + 0.8*P_eh(2) disp(’Ende von Aufgabe 1.3’); P2_q = P_d(1)*P2_yd(1,3) + P_d(2)*P2_yd(2,3) % Abspeichern der Ergebnisse fuer Aufgabe 1.3 save a1_2.mat disp(’Ende von Aufgabe 1.2’); MATLAB Solution of exercise 1.3 Concatenation of discrete channels % ############################################################################## % ## Loesung: Grundlegendes zur Kanalcodierung ## % ## ---------------------------------------------------------------------- ## % ## Aufgabe 1.3) Verkettung diskreter Kanaele (Diversitaet) ## % ## ---------------------------------------------------------------------- ## % ## benoetigte Matlab-Dateien: ## % ############################################################################## clear all; close all; % Laden der Kanaldaten von Aufgabe 1.2 load results/a1_2.mat; % ###################################################################### ##### % ##### Aufgabenteil a) Auftrittswahrscheinlichkeit der Symbole % ##### vor und nach dem Schwellwertentscheider ##### % ###################################################################### disp(’Aufgabenteil a) Auftrittswahrscheinlichkeit der Symbole’); Pg_yq = zeros(2,5); Pg_yq(1,1) = P1_yd(1,1)*P2_yd(1,1); Pg_yq(1,2) = P1_yd(1,1)*P2_yd(1,2)+P1_yd(1,2)*P2_yd(1,1); Pg_yq(1,3) = P1_yd(1,1)*P2_yd(1,3)+P1_yd(1,2)*P2_yd(1,2)+P1_yd(1,3)*P2_yd(1,1); Pg_yq(1,4) = P1_yd(1,2)*P2_yd(1,3)+P1_yd(1,3)*P2_yd(1,2); Pg_yq(1,5) = P1_yd(1,3)*P2_yd(1,3); Pg_yq(2,1) = P1_yd(2,1)*P2_yd(2,1); Pg_yq(2,2) = P1_yd(2,1)*P2_yd(2,2)+P1_yd(2,2)*P2_yd(2,1); Pg_yq(2,3) = P1_yd(2,1)*P2_yd(2,3)+P1_yd(2,2)*P2_yd(2,2)+P1_yd(2,3)*P2_yd(2,1); Pg_yq(2,4) = P1_yd(2,2)*P2_yd(2,3)+P1_yd(2,3)*P2_yd(2,2); Pg_yq(2,5) = P1_yd(2,3)*P2_yd(2,3); disp(’Auftrittswahrscheinlichkeit vor der Schwellwertentscheidung’); Pg_yq % Auftrittswahrscheinlichkeit der Symbole nach dem Schwellwertentscheider Pg_y = zeros(2,1); disp(’Auftrittswahrscheinlichkeit nach der Schwellwertentscheidung’); tmp = Pg_yq’ * P_d; tmp’ Pg_y(1) = tmp(1)+tmp(2); Pg_y(2) = tmp(3); Pg_y(3) = tmp(4)+tmp(5); disp(’Auftrittswahrscheinlichkeit von y’); Pg_y disp(’Weiter mit beliebiger Taste’); pause; % ################################################################# % ##### Aufgabenteil b) Fehlerwahrscheinlichkeit des System ##### % ################################################################# disp(’Aufgabenteil b) Fehlerwahrscheinlichkeit des System’); P_e = zeros(2,1); P_e(1) = Pg_yq(1,5) + Pg_yq(1,4); P_e(2) = Pg_yq(2,1) + Pg_yq(2,2); disp(’Fehlerwahrscheinlichkeiten’)
2 INFORMATION THEORY 13th January 2005 7 2 INFORMATION THEORY 13th January 2005 8 2 Information theory MATLAB Solution of exercise 2.1 Design of a discrete channel % ############################################################################## % ## Information Theory ## % ## ---------------------------------------------------------------------- ## % ## Excersise 2.1) Entropy ## % ## ---------------------------------------------------------------------- ## % ## required Matlab-Files: ## % ############################################################################## % Probabiltiy of Symbols X_nu P = 0:0.01:1; % Average information content of symbol X_nu H = -P .*log2(P+eps); % Calculation of maximum entropy and associated probability [H_max, idx] = max(H); P_max = P(idx); disp(’P_max:’); P_max disp(’H_max:’); H_max % Graphical Output plot(P,H); set(gca,’FontSize’,12) grid; axis([0 1 0 0.6]) xlabel(’P(X_\nu)’); ylabel(’P(H_\nu)’); title(’Average information content H(X_\nu)’) hold on plot(P_max,H_max,’o’); text(P_max+0.01,H_max+0.01,’Maximum part entropy’); hold off set(gca,’YTick’,[0 0.1 0.2 0.3 0.4 0.5 0.6]) disp(’End of excersise 2.1’); print -deps2 m2_1 MATLAB Solution of exercise 2.3 Channel capacity of a discrete memory-free channel % ################################################################################## ## % ## Loesung: Informationstheorie ## % ##-------------------------------------------------------------------------- ## % ## Aufgabe 2.3) Kanalkapazitaet eines binaeren Kanals ## % ##-------------------------------------------------------------------------- % ## benoetigte Matlab-Dateien: ## % ################################################################################## clear all; close all; PRINT_PLOT = 1; % ################################################################################## ##### % #####Aufgabenteil a) Transinformation fuer gleichwahrscheinliche ##### % ##### % ##### ##### % ################################################################################## Eingangssymbole eines binaeren symm. Kanals in Abhaengigkeit von der Uebergangswahrscheinlichkeit disp(’Aufgabenteil a) Transinformation fuer binaeren symmetrischen Kanal’); % Uebergangswahrscheinlicheit P_e = 0:0.01:1; % Kanalkapazitaet des BSC fuer gleichwahrscheinliche Eingangssymbole C_BSC = 1 + P_e .* log2(P_e+eps) + (1-P_e) .* log2(1-P_e+eps); % Grafische Ausgabe figure(1) plot(P_e,C_BSC) set(gca,’FontSize’,12) xlabel(’P_e’) ylabel(’C’) axis([0 1 0 1]) %title(’Channel Capacity ’) grid if PRINT_PLOT print -deps2 m2_3a end disp(’Weiter mit beliebiger Taste’); pause; % ################################################################################## % #####Aufgabenteil b) Transinformation eines unsymmetrischen binaeren Kanals ##### in Abhaengigkeit von den Uebergangswahrscheinlichkeiten ##### % ##### % ##### und der Statistik der Eingangssymbole ##### % ################################################################################## disp(’Aufgabenteil b) Transinformation fuer binaeren unsymmetrischen Kanal’); disp(’P_e0 = P_e1’); P_x0 = 0.001:0.01:0.999; P_e0 = 0:0.05:0.3; P_e1 = P_e0; % Eingangsstatistik % P(Y1|X0) % P(Y0|X1) % Bestimmen der Transinformation for i=1:length(P_e0) [C(i),H(:,i)] = C_DMC(P_e0(i),P_e1(i),P_x0); end figure(2) plot(P_x0,H); set(gca,’FontSize’,12) legend(’Pe = 0’,’Pe = 0.05’,’Pe = 0.10’,’Pe = 0.15’,’Pe = 0.20’,’Pe = 0.25’,’Pe = 0.30’,0); xlabel(’P(x_0)’) ylabel(’C(P(x_0),P_{e1},P_{e2})’) %title(’Channel Capacity for varying Pe (P_e0=P_e1)’) if PRINT_PLOT print -deps2 m2_3b1 end disp(’Weiter mit beliebiger Taste’); pause; % P_e1 = 0.1, P_e0 variabel disp(’Aufgabenteil b) Transinformation fuer binaeren symmetrischen Kanal’); disp(’P_e1=0.1’); clear P_x0 P_e0 P_e1 H; P_x0 = 0.001:0.01:0.999; P_e0 = 0:0.05:0.3; P_e1 = repmat(0.1,size(P_e0)); % Eingangsstatistik % P(Y1|X0) % P(Y0|X1) % Bestimmen der Transinformation for i=1:length(P_e0) [C(i),H(:,i)] = C_DMC(P_e0(i),P_e1(i),P_x0); end figure(3) plot(P_x0,H); set(gca,’FontSize’,12) legend(’Pe = 0’,’Pe = 0.05’,’Pe = 0.10’,’Pe = 0.15’,’Pe = 0.20’,’Pe = 0.25’,’Pe = 0.30’,0); xlabel(’P(x_0)’) ylabel(’C(P(x_0),P_{e1},P_{e2})’) %title(’Channel Capacity for varying P_e0, P_e1=0.1’) if PRINT_PLOT print -deps2 m2_3b2 end disp(’Weiter mit beliebiger Taste’); pause; % P_e1 = 0.1, P_e0 variabel disp(’Aufgabenteil b) Transinformation fuer binaeren symmetrischen Kanal’); disp(’P_e1=0.3’);
2 INFORMATION THEORY 13th January 2005 9 2 INFORMATION THEORY 13th January 2005 10 clear P_x0 P_e0 P_e1 C H; P_x0 = 0.001:0.01:0.999; P_e0 = 0:0.05:0.3; P_e1 = repmat(0.3,size(P_e0)); % Eingangsstatistik % P(Y1|X0) % P(Y0|X1) if nargin<1 Pe_0 = 0.01; Pe_1 = Pe_0; end %=================================================================================== % Eingangswahrscheinlicheiten P(X) % | P(X_0) | fr P_X0 = 0:0.01:1 % | P(X_1) | P_x = [Px ; 1-Px]; steps = size(P_x,2); %=================================================================================== % Kanalmatrix P(Y|K) % | P(Y_0|X_0) P(Y_1|X_0) | % | P(Y_0|X_1) P(Y_1|X_1) | Kanal = [ 1-Pe_0 Pe_0; Pe_1 1-Pe_1]; %=================================================================================== % Ausgabewahrscheinlichkeiten P(Y) % | P(Y_0) | fr P_X0 = 0:0.01:1 % | P(Y_1) | fr P_X1 = 1:0.01:0 % Berechnung: % | P(Y_0) = (1-Pe_0) * P(X_0) + % | P(Y_1) = P_y = Kanal’ * P_x; Pe_0 * P(X_1) * P(X_0) + (1-Pe_1) * P(X_1) Pe_1 %=================================================================================== % Entropien % P(Y_0|X_0) * P(X_0) * log2 ( P(Y_0|X_0) / P(X_0)) % + P(Y_0|X_1) * P(X_1) * log2 ( P(Y_0|X_1) / P(X_1)) % + P(Y_1|X_0) * P(X_0) * log2 ( P(Y_1|X_0) / P(X_0)) % + P(Y_0|X_1) * P(X_1) * log2 ( P(Y_0|X_1) / P(X_1)) % Bestimmen der Einzelentropien H(Y_mu,X_nu) % Addition von eps verhindert Division durch Null und Logarithmus von Null for cntX =1:2 for cntY =1:2 end end H_e(cntY,cntX,:) = (Kanal(cntX,cntY)*P_x(cntX,:)) ... .*log2((repmat(Kanal(cntX,cntY),1,steps)+eps) ./ (P_y(cntY,:)+eps) ); % Bestimmen der Gesamtentropie % H_ges = H(0,0)+H(0,1)+H(1,0)+H(1,1) H_ges = H_e(1,1,:) + H_e(2,1,:) + H_e(1,2,:) + H_e(2,2,:); % Verringern der Gesamtdimension fr Entropie H H = squeeze(H_ges); % Bestimmen der Kanalkapazitt C = max(H); % Bestimmen der Transinformation for i=1:length(P_e0) [C(i),H(:,i)] = C_DMC(P_e0(i),P_e1(i),P_x0); end figure(4) plot(P_x0,H); set(gca,’FontSize’,12) legend(’Pe = 0’,’Pe = 0.05’,’Pe = 0.10’,’Pe = 0.15’,’Pe = 0.20’,’Pe = 0.25’,’Pe = 0.30’,0); xlabel(’P(x_0)’) ylabel(’C(P(x_0),P_{e1},P_{e2})’) %title(’Channel Capacity for varying P_e0, P_e1=0.3’) if PRINT_PLOT print -deps2 m2_3b3 end disp(’Weiter mit beliebiger Taste’); pause; % ################################################################################## % #####Aufgabenteil c) Transinformation eines unsymmetrischen binaeren Kanals ##### in Abhaengigkeit von den Uebergangswahrscheinlichkeiten ##### % ##### % ##### und der Statistik der Eingangssymbole ##### % ################################################################################## disp(’Aufgabenteil c) Transinformation fuer binaeren Kanal bei festem P(X0), P(X1)’); clear P_x0 P_e0 P_e1 C H; P_x0 = [0.5 0.3 0.1]; P_e0 = 0.001:0.01:0.999; P_e1 = P_e0; for i=1:length(P_e0) [C(i),H(:,i)] = C_DMC (P_e0(i),P_e1(i),P_x0); end figure(5); plot(P_e0,H); set(gca,’FontSize’,12) legend(’P(X_0) = 0.5’,’P(X_0) = 0.3’,’P(X_0) = 0.1’,0); xlabel(’P_e’) ylabel(’C(P(x_0),P_e)’) %title(’Funktion der Kanalkapazitt fr verschiedene P(X_0)’) if PRINT_PLOT print -deps2 m2_3c end disp(’Ende von Aufgabe 2.3’); % ################################################################################## ## % ## Loesung: Informationstheorie ## % ##-------------------------------------------------------------------------- % ## Hilfsfunktion zu Aufgabe 2.3b) Kanalkapazitaet eines binaeren Kanals ## ## % ##-------------------------------------------------------------------------- ## % ## benoetigte Matlab-Dateien: ## % ## ## % ## ## % ## function [C] = KanalC (Pe_0,Pe_1) ## % ## ## % ## EINGABE: % ## ## % ## ## % ## % ## AUSGBE: % ## % ## % ################################################################################## Fehlerwahrscheinlichkeit X_0 -> Y_1 Fehlerwahrscheinlichkeit X_1 -> Y_0 C = Kanalkapazitt H = Entropie-Funktion Pe_0 = P(Y_1|X_0) Pe_1 = P(Y_0|X_1) function [C,H] = C_DMC (Pe_0,Pe_1,Px) %=================================================================================== % Setzen von Default-Werten fr Pe_0 und Pe_1
3 LINEAR BLOCK CODES 13th January 2005 11 3 LINEAR BLOCK CODES 13th January 2005 12 3 Linear block codes 3.2 Finite field algebra MATLAB Solution of exercise 3.1 Polynomial in the GF(2) % ############################################################################## % ## Loesung: Lineare Blockcodes ## % ## ---------------------------------------------------------------------- ## % ## Aufgabe 3.1) Polynom in GF(2) ## % ## ---------------------------------------------------------------------- ## % ## benoetigte Matlab-Dateien: gfprimck.m, de2bi.m, gfdeconv.m, gfpretty.m ## % ## ## % ############################################################################## gfprimfd.m (communications Toolbox) clear all; close all; % ############################################################## % #####Aufgabenteil a) Primitivitaet und Irreduzibilitaet ##### % ############################################################## disp(’Aufgabenteil a) Ist das Polynom primitiv oder irreduzibel?’); p = [1 0 0 1 1 1 1]; disp(sprintf([’Das Programm gfprimck(p) (siehe "help gfprimck") ’,... ’gibt folgendes aus:’])); disp(sprintf(’+1: p(D) ist primitiv’)); disp(sprintf(’ 0: p(D) ist irreduzibel, aber nicht primitiv’)); disp(sprintf(’-1: p(D) ist weder irreduzibel noch primitv\n’)); ck = gfprimck(p); [r,c]=size(pprim); disp(’Die primitiven Polynome in GF(2ˆ6) lauten:’); for i=1:r gfpretty(pprim(i,:),’D’) end disp(’Weiter mit beliebiger Taste’); pause; % ################################################################### % #####Aufgabenteil d) Bestimmung aller irreduziblen aber nicht ##### % ##### ##### % ################################################################### primitven Polynome disp(sprintf([’\nAufgabenteil d) ’,... ’Bestimmung aller irreduziblen, nicht primitiven Polynome\n’])); disp(sprintf([’Die irreduziblen, aber nicht primitiven Polynome ’,... ’vom Grad m=6 lauten:\n’])); for j=3+2ˆm:2:2ˆ(m+1)-1 pol = de2bi(j,m+1); if gfprimck(pol)==0 gfpretty(pol,’D’) end end disp(’Ende von Aufgabe 3.1’); MATLAB Solution of exercise 3.2 2-out-of-5-code % ############################################################################## % ## Loesung: Lineare Blockcodes ## % ## ---------------------------------------------------------------------- ## % ## Aufgabe 8.3.3) 2-aus-5 Code ## % ## ---------------------------------------------------------------------- ## % ## benoetigte Matlab-Dateien: ## % ############################################################################## switch ck end case 1, fprintf(’Fuer p(D) gilt in diesem Fall: %d, das Polynom ist primitiv.’,ck); case 0, fprintf(’Fuer p(D) gilt in diesem Fall: %d, das Polynom ist irreduzibel, aber nicht primitiv.’,ck); case -1, fprintf(’Fuer p(D) gilt in diesem Fall: %d, das Polynom ist ist weder irreduzibel noch primitv.’,ck); disp(’Weiter mit beliebiger Taste’); pause; % ################################################################ % #####Aufgabenteil b) Bestimmung der Teilpolynome von p(D) ##### % ################################################################ clear all; close all; % #################################################### % #####Aufgabenteil a) Bestimmung des Coderaums ##### % #################################################### disp(sprintf(’\nAufgabenteil b) Bestimmung der Teilpolynome von p(D)\n’)); disp(’Aufgabenteil a) Bestimmung des Coderaums’); % finde Wurzeln von p in GF(2) m = 6; test1 = 3:2ˆm-1; test u teiler = test(u,:); = de2bi(test1,m); = find(sum(test,2)>2); % Grad des Polynoms % Mindestgewicht 3 --> ntest > 7 % Mindestgewicht 3 disp(sprintf(’Die Teilpolynome lauten:\n’)); [r,c] = size(teiler); for i=1:r [q,rest] = gfdeconv(p,teiler(i,:),2); if (rest==0) gfpretty(teiler(i,:),’D’) end end disp(’Weiter mit beliebiger Taste’); pause; % ########################################################################## % #####Aufgabenteil c) Bestimmung aller primitiven Polynome in GF(64) ##### % ########################################################################## disp(sprintf([’\nAufgabenteil c) ’,... ’Bestimmung aller primitiven Polynome in GF(2ˆ6)\n’])); pprim=gfprimfd(m,’all’); % nichtlinearer 2-aus-5-Code C = [1 1 0 0 0; 1 0 1 0 0; 1 0 0 1 0; 1 0 0 0 1; 0 1 1 0 0; 0 1 0 1 0; 0 1 0 0 1; 0 0 1 1 0; 0 0 1 0 1; 0 0 0 1 1]; disp(’Der nichtlineare Coderaum C lautet:’); C disp(’Weiter mit beliebiger Taste’); pause; % ############################################################### % #####Aufgabenteil b) Bestimmung der Distanzeigenschaften ##### % ############################################################### disp(sprintf(’\nAufgabenteil b) Bestimmung der Distanzeigenschaften’)); % Da Code nichtlinear ist, muessen Codeworte paarweise verglichen werden M = 10; n = 5; % Anzahl der Codeworte % Laenge der Codeworte
3 LINEAR BLOCK CODES 13th January 2005 13 3 LINEAR BLOCK CODES 13th January 2005 14 A = zeros(M,M); % Distanz-Matrix for k=1:M-1 for l=k+1:M u = find(C(k,:)˜=C(l,:)); A(k,l) = length(u); A(l,k) = A(k,l); end end % Schleife ueber alle Codeworte % Schleife ueber alle Codeworte % Vergleich aller Codeworte disp(’Die Matrix der Distanzeigenschaften lautet:’); A disp(’Weiter mit beliebiger Taste’); pause; % ###################################################################### % #####Aufgabenteil c) Wahrscheinlichkeit fuer unerkannten Fehler ##### % ##### ##### % ###################################################################### beim BSC (Fehlerwahrscheinlichkeit Pe) % Jedes Codewort hat 6 Nachbarn mit Distanz 2 und 3 Nachbarn mit Distanz 4 Pe = 1e-3:1e-3:0.5; Pue = 6 .* Pe.ˆ2 .* (1-Pe).ˆ3 + 3 .* Pe.ˆ4 .* (1-Pe); loglog(Pe,Pue,’LineWidth’,2); grid on; set(gca,’FontSize’,16) xlabel(’P_e \rightarrow’); ylabel(’P_{ue} \rightarrow’); % ####################################################################### % #####Aufgabenteil d-f) Ueberpruefung des Ergebnisses durch die ##### % ##### Simulation einer Datenuebertragungsstrecke ##### % ####################################################################### disp(sprintf(’\nAufgabenteil c-f) Simulation einer Datenuebertragungsstrecke’)); X = 1-2*C; % antipodale Signalform aller Codeworte % Fehlerwahrscheinlichkeit beim AWGN snr esn0 = -2:0.5:6; = 10.ˆ(snr./10); Pw = 0.5 * (6 * erfc(sqrt(2*esn0)) + 3 * erfc(sqrt(4*esn0))); % Uebertragungsstrecke zur Ueberpruefung der analytischen Ergebnisse N % Anzahl zu sendender Codeworte = 10ˆ5; % Auswahl Codeworte u = ceil(rand(N,1)*M); c = C(u,:); x = 1-2*c; % antipodale Signalform aller Codeworte % Simulation des BSC als AWGN mit Hard-Decision simPe = 0.5 .* erfc(sqrt(esn0)); simPue = zeros(size(snr)); simPw = zeros(size(snr)); for run=1:length(snr) %Empfangswerte y = x + randn(size(x))/sqrt(esn0(run)*2); % BSC x_hat = sign(y); err % Korrelation jedes Empfangswortes (HD) mit jedem moeglichen Codewort = x_hat * X’; index err(index) = 0; % Entfernen der gesendeten Worte, da nur unerkannte Fehler wichtig = (u-1)*N + (1:N)’; simPue(run) = length(find(err==n)) / N; % AWGN korr = X * y’; % Korrelation jedes Empfangswortes (SD) mit jedem moeglichen Codewort [h,u_hat] = max(korr); err = find(u_hat(:)˜=u); simPw(run) = length(err) / N; end % Ausdruck der Ergebnisse figure loglog(Pe,Pue,’b--’,simPe,simPue,’bo’,Pe,Pe,’b-’,’LineWidth’,2); grid on; set(gca,’FontSize’,16) xlabel(’P_e \rightarrow’); ylabel(’P_{ue} \rightarrow’); legend(’analytisch’,’simuliert’,’Pe’,4); title(’Wahrscheinlichkeit unerkannter Fehler fuer BSC’); figure semilogy(snr,Pw,’b--’,snr,simPw,’bo’, snr,simPe,’b-’,’LineWidth’,2); grid on; set(gca,’FontSize’,16) xlabel(’E_s/N_0 \rightarrow’); legend(’analytisch’,’simuliert’,’uncodiert’,3); title(’Fehlerwahrscheinlichkeit beim AWGN’); disp(’Ende von Aufgabe 8.3.3’); 3.5 Matrix description of block codes MATLAB Solution of exercise 3.6 Generator and parity check matrices % ############################################################################## % ## Loesung: Lineare Blockcodes ## % ## ---------------------------------------------------------------------- ## % ## Aufgabe 8.4.1) Generator und Pruefmatrix ## % ## ---------------------------------------------------------------------- ## % ## benoetigte Matlab-Dateien: de2bi.m (comm. toolbox), ## % ############################################################################## clear all; close all; % ############################################################ % #####Aufgabenteil a) Generator- und Pruefmatrix eines ##### % ##### ##### % ############################################################ (n,1,n)-Wiederholungscodes disp([’Aufgabenteil a) ’,... ’Generator- und Pruefmatrix eines (n,1,n) Wiederholungscodes’]); % (4,1,4)-Wiederholungscode n = 4; % Generatormatrix disp(’Die Generatormatrix des Wiederholungscodes lautet:’); G_WH = ones(1,n) [k,n] = size(G_WH); % Pruefmatrix disp(’Fuer die Pruefmatrix gilt dann:’); H_WH = [G_WH(1:k,k+1:n)’ eye(n-k)] disp(’Weiter mit beliebiger Taste’); pause; % ###################################################################### % #####Aufgabenteil b) Pruefmatrix fuer Hammingcode der Ordnung r ##### % ######################################################################
3 LINEAR BLOCK CODES 13th January 2005 15 3 LINEAR BLOCK CODES 13th January 2005 16 disp(sprintf(’\nAufgabenteil b) Pruefmatrix fuer Hammingcode der Ordnung r’)); % Hamming-Code der Ordnung r=3 r k n = 3; = 2ˆr-r-1; = 2ˆr-1; % Anzahl der Infobit % Anzahl der Codestellen = 1:2ˆr-1; tmp disp(’Die Pruefmatrix in nichtsystematischer Form lautet:’); H_H = de2bi(tmp,r)’ % Pruefmatrix in nichtsystematischer Form disp(’Die Pruefmatrix in systematischer Form lautet:’); H_Hs = [H_H(:,[3 5 6 7 1 2 4])] % Pruefmatrix in systematischer Form disp(’Die Generatormatrix in systematischer Form lautet:’); G_Hs = [eye(k) H_Hs(:,1:4)’] % Generatormatrix in systematischer Form disp(’Die Generatormatrix in nichtsystematischer Form lautet:’); G_H = [G_Hs(:,[5 6 1 7 2 3 4])]% Generatormatrix in nichtsystematischer Form disp(’Ende von Aufgabe 3.6’); MATLAB Solution of exercise 3.7 Expansion, shortening and puncturing of codes % ############################################################################## % ## Loesung: Lineare Blockcodes ## % ## ---------------------------------------------------------------------- ## % ## Aufgabe 3.7) Erweitern, Kuerzen und Punktieren von Codes ## % ############################################################################## clear all; close all; % ############################################################## % #####Aufgabenteil a) Erweitern des (7,4,3)-Hammingcodes ##### % ############################################################## disp(’Aufgabenteil a) Erweitern des (7,4,3)-Hammingcodes’); % Hamming-Code der Ordnung r=3 r k = 3; = 2ˆr-r-1; = de2bi(tmp,r)’; tmp = 1:2ˆr-1; H H_s = [H(:,[3 5 6 7 1 2 4])]; G_s = [eye(k) H_s(:,1:4)’]; G [r,n] = size(H_s); = [G_s(:,[5 6 1 7 2 3 4])]; % Generatormatrix in nichtsystematischer Form % Pruefmatrix in nichtsystematischer Form % Pruefmatrix in systematischer Form % Generatormatrix in systematischer Form % Erweiterung des Hamming-Codes auf d_min=4 H_E [r,n] = size(H_E); = [H_s zeros(r,1); ones(1,n+1)] % Bestimmung der minimalen Anzahl linear unabhaengiger Spalten in H_E u = 3:2ˆn-1; u = de2bi(u,n); spalten = 2; stop = 0; while ((spalten
分享到:
收藏