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