%generador
%Galo Nuño Barrau
%Proyecto de Fin de Carrera en Simulación de Sistemas UWB
%SISTEMA UWB
tic
%Parámetros del sistema
SpreadingFactor=31; %Factor de ensanchamiento del sistema: número de chips por bit
Nh=1024; %Número de slots de chip por trama
%El producto SpreadingFactor x Nh = 32768
Tc=1.588E-9; %Duración del chip, BW(-3dB)=0.18*8/Tc
R=19.2E3; %Velocidad de bit
fs=6.2972E+9; %Frecuencia de muestreo tal que fs*Tc=10, no aliasing
%fs=5.6675E+009; % fs*Tc=9
Nu=100; %Número de usuarios, dos como mínimo
a1=0.7*exp(-j*pi/8); %Amplitudes complejas de las componentes multitrayecto
a2=0.4*exp(-j*pi/16);
retardo1=12E-9; %Retardos del multitrayecto,con un posible error de medio 1/fs despreciable.
retardo2=18E-9;
delta =0.2*Tc; %PPM, diferencia de tiempo entre ceros y unos
jitter=0; %Jitter del receptor respecto al instante de muestreo
Tipo=1; %Tipo de monopulso empleado: 1 Gaussiano, 2 Rayleigh.
iteraciones=1000; %Iteraciones del método MonteCarlo
SNR=-30; %Potencia de 1 usuario a la entrada/ruido en dB
enfasis=4; %Constante de énfasis del muestreo enfatizado
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Variables
%Generacion de la secuencia de los usuario
secuencias=secuencia(Nh,Nu,SpreadingFactor); %Matriz con los valores de todas la secuencias de los Nu usuarios
secuenciaPN=zeros(1,SpreadingFactor); %Vector con los valores de la secuencia aleatoria de cada usuario
indice=zeros(1,Nu); %Correspondencia usuario-códigos
indice(Nu)=Nu; %El último siempre es constante
%Almacenamiento de tiempos y datos
tiempo= (0:SpreadingFactor-1)*Nh*Tc*fs;%Posición de las ranuras en la trama
base0=zeros(1,ceil(fs/R)); %Vector de muestras base del sistema para los 0
base1=zeros(1,ceil(fs/R)); %Vector de muestras base del sistema para los 1
base0t1=zeros(1,ceil(fs/R)); %Vector para el 1ºmultitrayecto de los 0
base1t1=zeros(1,ceil(fs/R)); %Vector para el 1ºmultitrayecto de los 1
base0t2=zeros(1,ceil(fs/R)); %Vector para el 2ºmultitrayecto de los 0
base1t2=zeros(1,ceil(fs/R)); %Vector para el 2ºmultitrayecto de los 1
deltas1=zeros(1,SpreadingFactor); %Vector para almacenar los tiempos de muestras con señal
deltas2=zeros(1,SpreadingFactor); %Vector para almacenar los tiempos de muestras con primer multitrayecto
deltas3=zeros(1,SpreadingFactor); %Vector para almacenar los tiempos de muestras con segundo multitrayecto
%Control del multitrayecto
t1=floor(retardo1*fs); %Retardo en muestras enteras
tminimo1=retardo1*fs-t1; %Parte menor de una muestra
t2=floor(retardo2*fs); %Retardo en muestras enteras
tminimo2=retardo2*fs-t2; %Parte menor de una muestra
%Referentes a la forma de onda
referencia=pulso(Tipo,Tc,fs,0); %Vector de referencia del monociclo
potencia=sum(referencia.^2)*R/fs; %Potencia de un pulso de la señal enviada sin normalizar
monociclo0=pulso(Tipo,Tc,fs,0)/sqrt(potencia)*10^(SNR/10); %Monociclo empleado en 0s, potencia 1.
monociclo1=pulso(Tipo,Tc,fs,delta)/sqrt(potencia)*10^(SNR/10); %Monociclo empleado en 1s, potencia 1.
monociclo0t1=a1*pulso(Tipo,Tc,fs,tminimo1/fs)/sqrt(potencia)*10^(SNR/10); %Monociclo empleado en 0s, potencia 1.
monociclo1t1=a1*pulso(Tipo,Tc,fs,tminimo1/fs+delta)/sqrt(potencia)*10^(SNR/10); %Monociclo empleado en 1s, potencia 1.
monociclo0t2=a2*pulso(Tipo,Tc,fs,tminimo2/fs)/sqrt(potencia)*10^(SNR/10); %Monociclo empleado en 0s, potencia 1.
monociclo1t2=a2*pulso(Tipo,Tc,fs,tminimo2/fs+delta)/sqrt(potencia)*10^(SNR/10); %Monociclo empleado en 1s, potencia 1.
longitud_monociclo=length(monociclo0); %Longitud del monociclo
%Generación del pulso receptor
pulsrecepcion=receptora(Tipo,Tc,fs,delta,jitter); %Pulso de recepción
ventana0=fliplr(conv(fliplr(pulsrecepcion),monociclo0)); %Ventana de recepción de ceros
ventana1=fliplr(conv(fliplr(pulsrecepcion),monociclo1)); %Ventana de recepción de unos
ventana0t1=fliplr(conv(fliplr(pulsrecepcion),monociclo0t1)); %Ventana de recepción de ceros
ventana1t1=fliplr(conv(fliplr(pulsrecepcion),monociclo1t1)); %Ventana de recepción de unos
ventana0t2=fliplr(conv(fliplr(pulsrecepcion),monociclo0t2)); %Ventana de recepción de ceros
ventana1t2=fliplr(conv(fliplr(pulsrecepcion),monociclo1t2)); %Ventana de recepción de unos
longitud_ventana=length(ventana0); %Longitud de la ventana de recepción
%Generación del ruido del sistema
sigma=1; %Potencia de ruido a la entrada 0 dBs
ruido=modelador_ruido(Tipo,Tc,fs,delta,SpreadingFactor,iteraciones,sigma,a1,a2);
std_ruido=std(ruido); %Desviacion de ruido en el instante de decision sin enfatizar
%APLICACIÓN MUESTREO ENFATIZADO
ruido=ruido*enfasis; %Ruido enfatizado
std_enfasis=std(ruido); %Desviación del ruido enfatizado
w=enfasis*exp(-(1/std_ruido^2 - 1/std_enfasis^2)/2*ruido.^2); %Vector de pesos
%Decision
decision=zeros(1,iteraciones); %Acumula los valores de decisión
error=zeros(1,iteraciones); %Valores de error
toc
%Control de tiempos
a=zeros(1,iteraciones); %Valores de error
b=zeros(1,iteraciones); %Valores de error
%Comprobacion del método
%almacen=zeros(1,round(ceil(fs/R)*(1.2)));
%parcial=zeros(1,SpreadingFactor);
%parcial2=zeros(1,SpreadingFactor);
%acumulacion=zeros(1,iteraciones);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%BUCLE DE SIMULACIÓN POR MUESTREO ENFATIZADO
%tic
for k=1:iteraciones
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Bucle de los Nu usuarios
tic
base0(:)=0; %Para cada vuelta de simulación
base1(:)=0; %Para cada vuelta de simulación
base0t1(:)=0; %Para cada vuelta de simulación
base1t1(:)=0; %Para cada vuelta de simulación
base0t2(:)=0; %Para cada vuelta de simulación
base1t2(:)=0; %Para cada vuelta de simulación
indice(1:Nu-1)=randperm(Nu-1); %Para cada vuelta de simulación
r=1; %Aleatoreidad de los códigos
%Generación de usuarios
Nu0=floor((Nu-2)*rand)+1; %Número de usuarios por vuelta transmitiendo 0, incluye al usuario origen
Nu1=Nu-Nu0; %Número de usuarios por vuelta transmitiendo 1
%Los unos
for i=1:Nu1
%secuenciaPN=round((Nh-1)*rand(1,SpreadingFactor)); %Genero la secuencia aleatoria
secuenciaPN=secuencias(indice(r),:);
r=r+1;
deltas1=round(tiempo+secuenciaPN*Tc*fs); %La situo en su marco temporal
base1(deltas1+longitud_monociclo)=base1(deltas1+longitud_monociclo)+1;%Se la añado al sitema
%Efectos multitrayecto
deltas2=deltas1+round(t1); %Primer rayo
base1t1(deltas2+longitud_monociclo)=base1(deltas2+longitud_monociclo)+1;
deltas3=deltas2+round((t2-t1)); %Segundo rayo
base1t2(deltas3+longitud_monociclo)=base1(deltas3+longitud_monociclo)+1;
end
%Los ceros
for i=1:Nu0
%secuenciaPN=round((Nh-1)*rand(1,SpreadingFactor)); %Genero la secuencia aleatoria
secuenciaPN=secuencias(r,:);
r=r+1;
deltas1=round(tiempo+secuenciaPN*Tc*fs); %La situo en su marco temporal(+1 por el índice del array)
base0(deltas1+longitud_monociclo)=base0(deltas1+longitud_monociclo)+1;%Se la añado al sitema
%Efectos multitrayecto
deltas2=deltas1+round(t1); %Primer rayo
base0t1(deltas2+longitud_monociclo)=base0(deltas2+longitud_monociclo)+1;
deltas3=deltas2+round((t2-t1)); %Segundo rayo
base0t2(deltas3+longitud_monociclo)=base0(deltas3+longitud_monociclo)+1;
end
a(k)=toc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Efectos de la forma de onda, RAKE, muestreo y decisión
tic
for i=1:SpreadingFactor %Indice para el receptor: Soft decoding
%COMPROBACIÖN DEL MËTODO
%parcial(i)=sum(real(base0(deltas1(i)+1:deltas1(i)+longitud_ventana).*ventana0)+...
%real(base1(deltas1(i)+1:deltas1(i)+longitud_ventana).*ve