% COMUNICACIONES DIGITALES
% Tema 2
% Ejemplo de Canal multicamino (estacionario y selectivo en frecuencia)
% Canal real, canal equivalente paso bajo y canal discreto equivalente
% Curso 2023-2024

close all

%% Canal Original
fs1=100;    % Frecuencia de muestreo inicial
h=[0 0 0 0 1 -0.2 0.1 0 0.4 0 -0.2 -0.3 0.4 -0.1 0 0 0 0 0 -0.2 0.1 -0.2 0 0 0 0 -0.3 0 0 0]/10;  % Respuesta al impulso del canal original (multicamino)

%% Canal equivalente paso bajo
fc=25;    % Frecuencia central (portadora)
heq1=h.*exp(-1i*2*pi*fc/fs1*(0:length(h)-1));    % Canal equivalente paso bajo a fs1
fs2=10;
R=fs1/fs2;  % Factor de diezmado
filtro_pb=fir1(200,1/R);
heq2=conv(heq1,filtro_pb);  % Filtrado paso bajo
heq=heq2(1:R:end)*R;   % Diezmado

%% Canal discreto equivalente (ver transparencia 31 Tema 1) 
roll_off=0.5;
Rs=5;n0=2;
% Rs=2;n0=4;  % Régimen de símbolo y retardo
% Rs=1;n0=4;  % Régimen de símbolo y retardo

L=fs2/Rs   % Factor de sobremuestreo

hsqrrc=rcosine(Rs,fs2,'sqrt',roll_off,8);
hrc=conv(hsqrrc,hsqrrc);
he1=conv(hrc,heq);  % Convolución filtro TX, RX y canal equivalente paso bajo
he=he1(n0:L:end);   % Canal discreto equivalente

%% Plots

% Canal Original
[H,f1]=freqz(h,1,(-512:511)/1024*fs1,fs1);  % Respuesta en frecuencia del canal original
figure(1);
subplot(211);plot(f1,20*log10(abs(H)));grid;xlabel('f (Hz)');ylabel('|H(f)| (dB)')
ejes1=gca;
title('Canal original');
subplot(212);plot(f1,180/pi*unwrap(angle(H)));grid;xlabel('f (Hz)');ylabel('fase de H(f) (º)')

% Canal equivalente paso bajo
[Heq1,f1]=freqz(heq1,1,f1,fs1);
figure(2);
subplot(211);plot(f1,20*log10(abs(Heq1)));grid;xlabel('f (Hz)');ylabel('|Heq(f)| (dB)')
set(gca,'YLim',ejes1.YLim,'XLim',ejes1.XLim);
title(sprintf('Canal equivalente paso bajo sin diezmar (fc=%i Hz)',fc));
subplot(212);plot(f1,180/pi*unwrap(angle(Heq1)));grid;xlabel('f (Hz)');ylabel('fase de Heq(f) (º)')

[Heq2,f1]=freqz(heq2,1,f1,fs1);
figure(3);
subplot(211);plot(f1,20*log10(abs(Heq2)));grid;xlabel('f (Hz)');ylabel('|Heq(f)| (dB)')
set(gca,'YLim',ejes1.YLim,'XLim',ejes1.XLim);
title(sprintf('Canal equivalente paso bajo filtrado paso bajo(fc=%i Hz)',fc));
subplot(212);plot(f1,180/pi*unwrap(angle(Heq2)));grid;xlabel('f (Hz)');ylabel('fase de Heq(f) (º)')


[Heq,f2]=freqz(heq,1,(-512:511)/1024*fs2,fs2);
figure(4);
subplot(211);plot(f2,20*log10(abs(Heq)));grid;xlabel('f (Hz)');ylabel('|Heq(f)| (dB)')
title(sprintf('Canal equivalente paso bajo (fc=%i Hz)',fc));
subplot(212);plot(f2,180/pi*unwrap(angle(Heq)));grid;xlabel('f (Hz)');ylabel('fase de Heq(f) (º)')

figure(5)
subplot(411);stem(h);title(sprintf('h[n] (@fs=%i muestras/s)',fs1));xlabel('n (muestras)')
subplot(412);stem(real(heq1),'b');hold on;stem(imag(heq1),'r');hold off;title(sprintf('heq[n] (@fs=%i muestras/s)',fs1));xlabel('n (muestras)')
subplot(413);stem(real(heq2),'b');hold on;stem(imag(heq2),'r');hold off;title(sprintf('heq[n] filtrado paso bajo (@fs=%i muestras/s)',fs1));xlabel('n (muestras)')
subplot(414);stem(real(heq),'b');hold on;stem(imag(heq),'r');hold off;title(sprintf('heq[n] (@fs=%i muestras/s)',fs2));xlabel('n (muestras)')

figure(6)
subplot(421);stem(h);title(sprintf('h[n] (@fs=%i muestras/s)',fs1));xlabel('n (muestras)')
subplot(423);stem(real(heq1),'b');hold on;stem(imag(heq1),'r');hold off;title(sprintf('heq[n] (@fs=%i muestras/s)',fs1));xlabel('n (muestras)')
subplot(425);stem(real(heq2),'b');hold on;stem(imag(heq2),'r');hold off;title(sprintf('heq[n] filtrado paso bajo (@fs=%i muestras/s)',fs1));xlabel('n (muestras)')
subplot(427);stem(real(heq),'b');hold on;stem(imag(heq),'r');hold off;title(sprintf('heq[n] (@fs=%i muestras/s)',fs2));xlabel('n (muestras)')
subplot(422);plot(f1,20*log10(abs(H)));grid;xlabel('f (Hz)');ylabel('|H(f)| (dB)')
subplot(424);plot(f1,20*log10(abs(Heq1)));grid;xlabel('f (Hz)');ylabel('|Heq(f)| (dB)')
subplot(426);plot(f1,20*log10(abs(Heq2)));grid;xlabel('f (Hz)');ylabel('|Heq(f)| (dB)')
set(gca,'YLim',ejes1.YLim,'XLim',ejes1.XLim);
subplot(428);plot(f2,20*log10(abs(Heq)));grid;xlabel('f (Hz)');ylabel('|Heq(f)| (dB)')


% Canal discreto equivalente
figure(7)
subplot(411);stem(real(heq),'b');hold on;stem(imag(heq),'r');hold off;title(sprintf('heq[n] (@fs=%i muestras/s)',fs2))
subplot(412);stem(hrc);title('hrc[n]');title(sprintf('hrc[n]=conv(htx[n],hrx[n]) (@fs=%i muestras/s, Rs=%i simb/s)',fs2,Rs))
subplot(413);stem(real(he1),'b');hold on;stem(imag(he1),'r');hold off;title(sprintf('he1[n]=conv(htx[n],hrx[n],heq[n]) (@fs=%i muestras/s)',fs2))
subplot(414);stem(real(he),'b');hold on;stem(imag(he),'r');hold off;title(sprintf('he[n] (@fs=Rs=%i muestras/s)',Rs))


