% ##############################################################################
% ##  Loesung:  Einfluss von Rauschen, Matched Filter                         ##
% ##  ----------------------------------------------------------------------  ##
% ##  Aufgabe 5.2.3) Bitfehlerrate bei einer zweistufigen AWGN-Uebertragung   ##
% ##  ----------------------------------------------------------------------  ##
% ##  benoetigte Matlab-Dateien: wurzcos.m, awgn_sym.m                        ##
% ##############################################################################

clear all;
close all;

% #################################################################
% #####  Aufgabenteil a) Bitfehlerwahrscheinlichkeit Theorie  #####
% #################################################################

disp('Aufgabenteil a) Bitfehlerwahrscheinlichkeit Theorie');

Es_N0_dB=[-2 -1 0 1 2 3 4 5 6 7 8 9 10];
Es_N0=10.^(Es_N0_dB/10);
Pb_anti_theo=0.5*erfc(sqrt(Es_N0));
Pb_uni_theo=0.5*erfc(sqrt(0.5*Es_N0));

figure;
semilogy(Es_N0_dB,Pb_anti_theo,Es_N0_dB,Pb_uni_theo);
grid;
title('AWGN-Uebertragung');
ylabel('P_{b}  \rightarrow');
xlabel('E_{S}/N_{0}  \rightarrow');
text(6.2,0.025,'unipolar');
text(1.0,0.015,'antipodal');
axis([-2 10 0.0001 0.3]);
hold on;

disp('Weiter mit beliebiger Taste'); pause;

% ####################################################################
% #####  Aufgabenteil b) Bitfehlerwahrscheinlichkeit Simulation  #####
% ####################################################################

disp('Aufgabenteil b) Bitfehlerwahrscheinlichkeit Simulation');

Lsim=11;
w=4;
[t_g,g_S]=wurzcos(1,w,4);
g_E=g_S;
N_anti=[1000 1000 2000 5000 8000 10000 12000 15000 50000,80000,150000];
Pb=zeros(1,Lsim);
for i=1:Lsim
  Es_N0_dB=i-3;       % Es_No_dB = -2 ... 8
  disp(sprintf('Es/N0= %2d dB',Es_N0_dB));
  NN=N_anti(i);
  d_anti=sign(randn(1,NN));
  d_uni=(d_anti+1)/2;
  [y_anti,d_ref_anti] = awgn_sim(g_S,g_E,w,d_anti,Es_N0_dB,0,1);
  [y_uni,d_ref_uni]   = awgn_sim(g_S,g_E,w,d_uni ,Es_N0_dB,0,1);
  y_anti=real(y_anti);
  Pb_anti=sum(abs(sign(y_anti)-d_ref_anti)/2)/NN;
  y_uni=real(y_uni);
  Pb_uni=sum(abs(0.5*sign(y_uni-0.5)+0.5-d_ref_uni))/NN;
  semilogy(Es_N0_dB,Pb_anti,'o',Es_N0_dB,Pb_uni,'o');
end;
hold off;

disp('Ende von Aufgabe 5.2.3');
