% ##############################################################################
% ##  Loesung:  Mobilfunkkanaele                                              ##
% ##  ----------------------------------------------------------------------  ##
% ##  Aufgabe 2.3.4) Verwendung von ANT-Channel                               ##
% ##  ----------------------------------------------------------------------  ##
% ##  benoetigte Matlab-Dateien: antchannel.m, ftrafo.m, tvc.dll              ##
% ##############################################################################

clear all;
close all;

% generelle Einstellungen der Kanalparameter
channel.name       = 'cost207';
channel.number     = 'HT';
channel.profile    = 'd';        % 'p' use power profile (default)
% 'd' use delay profile (only 'exp','cost207')
channel.n_echo     = 50000;       % Anzahl der Echos
channel.f_0        = 1900e6;     % Traegerfrequenz [Hz]
channel.v_0        = 100 / 3.6;  % max. Objektgeschwindigkeit [m/s]
channel.f_a        = 1e6;        % Abtastfrequenz [Hz]
channel.flag_show  = 1;          % berechnet Zeitvariante Impulsantwort
channel.const_taps = 2000;       % Anzahl der nicht-zeitvarianten Abtastungen
channel.flag_init  = 1           % set if new initialisation is needed
channel.seed       = 151;        % set SEED for rand - function

% #############################################################################
% #####  Aufgabenteil a) zeitvariante Impulsantwort eines Kanals nach     #####
% #####                  dem Hilly Terrain                                #####
% #############################################################################

disp(['Aufgabenteil a) ',...
      'Zeitvariante Impulsantwort eines Kanals (Hilly Terrain)']);

t_max = 0.2;                        % Laenge des Eingangssignals
n     = t_max * channel.f_a;
signal = ones(n,1);

% Erzeugung des Kanalprofils fuer variable Verzoegerungszeiten
[out,ch] = ant_channel(signal, channel);

figure('name', 'a) zeitvariante Impulsantwort', 'numbertitle', 'off');
mesh(ch.time*1000, ch.tau*1e6, abs(ch.impulse_response));
grid on;
view(142.5,30);
xlabel('t/ms \rightarrow');
ylabel('\tau/{\mu}s \rightarrow');
title('Zeitvariante Impulsantwort');

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

% ###############################################################
% #####  Aufgabenteil b) Berechnung der Scattering Function #####
% ###############################################################

disp('Aufgabenteil b) Berechnung der Scattering Function');

rhh = zeros(length(ch.tau),2*length(ch.time)-1);
time=[-fliplr(ch.time(2:length(ch.time))) ch.time];
for cnt=1:length(ch.tau)
  rhh(cnt,:)     = xcorr(ch.impulse_response(cnt,:));
  [fd,Rhh(cnt,:)] = f_trafo(time,rhh(cnt,:),2);
end

figure('name', 'b) Scattering Function','numbertitle', 'off');
mesh(fd, ch.tau*1e6, real(Rhh));
grid on;
view(142.5,30);
axis([-250 250 0 20 0 3]);
xlabel('f_d/Hz \rightarrow');
ylabel('\tau/{\mu}s \rightarrow')
title('Scattering Function')

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

% #######################################################################
% #####  Aufgabenteil c) Kanalprofil fuer feste Verzoegerungszeiten #####
% #######################################################################

disp('Aufgabenteil c) Kanalprofil fuer feste Verzoegerungszeiten');

channel.profile = 'p';
[out2,ch2] = ant_channel(signal, channel);

figure('name', 'c) feste Verzoegerung','numbertitle', 'off');
mesh(ch2.time*1000, ch2.tau*1e6, abs(ch2.impulse_response));
grid on;
view(142.5,30);
xlabel('t/ms \rightarrow')
ylabel('\tau/{\mu}s \rightarrow')
title('Zeitvariante Impulsantwort')

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

% ###############################################################
% #####  Aufgabenteil d) Berechnung der Scattering Function #####
% ###############################################################

disp('Aufgabenteil d) Berechnung der Scattering Function');

rhh = zeros(length(ch2.tau),2*length(ch2.time)-1);
time=[-fliplr(ch2.time(2:length(ch2.time))) ch2.time];
for cnt=1:length(ch2.tau)
  rhh(cnt,:)     = xcorr(ch2.impulse_response(cnt,:));
  [fd2,Rhh2(cnt,:)] = f_trafo(time,rhh(cnt,:),1);
end

figure('name', 'd) Scattering Function','numbertitle', 'off');
mesh(fd2, ch2.tau*1e6, real(Rhh2));
grid on;
view(142.5,30);
axis([-250 250 0 20 0 1.5]);
xlabel('f_d/Hz \rightarrow');
ylabel('\tau/{\mu}s \rightarrow');
title('Scattering Function');

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

% #################################################################
% #####  Aufgabenteil e) Dopplerleistungsdichtespektrum und   #####
% #####                  Verzoegerungsleistungsdichtespektrum #####
% #################################################################

disp('Aufgabenteil e) Doppler-LDS und Verz.-LDS');

% Berechnung des Dopplerleistungsdichtespektrums
Ps=sum(Rhh);

figure('name', 'e) Doppler-LDS','numbertitle', 'off');
plot(fd,abs(Ps),'b');
grid on;
xlabel('f_d/Hz \rightarrow');
title('Dopplerleistungsdichtespektrum');

% Berechnung des Verzoegerungsleistungsdichtespektrums
Phi=sum(Rhh,2);

figure('name', 'e) Verz.-LDS','numbertitle', 'off');
plot(ch.tau*1e6,abs(Phi),'b');
grid on;
xlabel('\tau/{\mu}s \rightarrow');
title('Verzoegerungsleistungsdichtespektrum')

disp('Ende von Aufgabe 2.3.4');
