Interconexión Entre Sistemas Móviles de 3ª Generación VI

Anuncio
Interconexión Entre Sistemas Móviles de 3ª Generación
VI. ANEXOS
VI-1. Códigos Matlab
En este segundo anexo se incluye todos los códigos Matlab que han sido utilizados
para obtener las simulaciones mostradas en este proyecto. Estos códigos son casos
particulares de algunas de esas simulaciones, ya que los valores que vienen indicados en
los mismos han sido variados en sucesivas ejecuciones de los ficheros de Matlab, con
objeto de obtener las distintas simulaciones (distintos números de usuarios, valores de
K, número de subportadoras,…) que son comentadas en este proyecto.
En las simulaciones hemos usado dos tipos de códigos ortogonales, los de
Hadamard y los OVSF, por tanto separaremos los distintos archivos de Matlab que usan
cada uno de estos códigos. Finalmente mostraremos el archivo de Matlab donde se
realizan las simulaciones para las fórmulas teóricas que nos proporciona el artículo de
investigación y que han sido usadas para su comparación con las curvas prácticas.
Antes de empezar con los códigos mencionados anteriormente mostraremos la
función Matlab rician_generator, la cual nos genera N valores aleatorios que siguen
dicha distribución, que usamos para representar el canal de desvanecimiento Rician y
que es usada por la mayoría de las funciones Matlab que se verán más adelante.
Debemos decir que esta función también nos genera la distribución Rayleigh cuando
damos al factor de Rician (K) el valor cero.
%=========================================================
% Generador de la distribución Rician
% K= Factor de Rician
%=========================================================
function rician=rician_generator(N_samples,K)
Noise=randn(2,N_samples);
mean_y=sqrt(2*K);
Noise(2,:)=Noise(2,:)+mean_y;
rician_temp=sqrt(Noise(1,:).^2+Noise(2,:).^2);
rician=rician_temp;
VI. ANEXOS
87
Interconexión Entre Sistemas Móviles de 3ª Generación
VI-1.1. Códigos Hadamard
function ber_snr_egc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%% REPRESENTACION BER RESPECTO A SNR %%%%%%%%%%%%%%%
%%%%%%%%%%%% USANDO RECEPTOR EGC %%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
close all
clear all
N=16;
M=1e4;
K=2;
U=2;
H=hadamard(N);
%
%
%
%
Numero de portadoras ortogonales
Numero de datos (bits) por usuario
Elegimos Factor de Rician
Elegimos Numero de usuarios
% Generamos matriz de codigos hadamard (ortogonales)
%----- Usuario 1 -----------------------------------------------------datos1=sign(randn(1,M));
cod1=H(1,:);
del usuario 1
% Generamos vector de datos del usuario 1
% Cogemos la primera fila de matriz de hadamard como codigo
fading1=rician_generator(N,K);
siguen una distribucion de Rician
% Generamos un vector de numeros aleatorios que
codyric1=cod1.*fading1;
% Multiplico cada chip del codigo por el
desvanecimiento de la rama correspondiente
datos1c=datos1';
matrix=datos1c*codyric1;
multiplicado por el codigo
vect_s1=zeros(1,(N*M));
% Ponemos los datos como vector columna
% Cada fila de esta matriz tiene un dato de usuario
% Vector con los datos transmitidos
i=1;
for k=1:M
fila=matrix(k,:);
s1=ifft(fila);
for n=1:N
% Vector s1 posee N elementos
vect_s1(i)=s1(n);
i=i+1;
end
end
VI. ANEXOS
88
Interconexión Entre Sistemas Móviles de 3ª Generación
%-----Otros Usuarios -----------------------------------------------------for u=2:1:U
datos_u=sign(randn(1,M));
% Generamos vector de datos del usuario u
cod_u=H(u,:);
% Cogemos la segunda fila de matriz de hadamard como
codigo del usuario u
fading_u=rician_generator(N,K);
que siguen una distribucion de Rician
% Generamos un vector de numeros aleatorios
codyric_u=cod_u.*fading_u;
% Multiplico cada chip del codigo por el
desvanecimiento de la rama correspondiente
datos_uc=datos_u';
% Ponemos los datos como vector columna
matrix_u=datos_uc*codyric_u;
% Cada fila de esta matriz tiene un dato de
usuario multiplicado por el codigo
vect_s_u=zeros(1,(N*M));
vect_s_int=zeros(1,(N*M));
usuarios interferentes
% Vector con los datos transmitidos por usuario u
% Vector con los datos transmitidos por todos los
i=1;
for k=1:M
fila_u=matrix_u(k,:);
s_u=ifft(fila_u);
for n=1:N
% Vector s_u posee N elementos
vect_s_u(i)=s_u(n);
i=i+1;
end
end
vect_s_int=vect_s_int+vect_s_u;
end
% Suma de los dos usuarios (lo que sale al canal)
vect_s=vect_s1+vect_s_int;
%---------------------RECEPTOR EGC (multiplico en el receptor solo por el codigo)---------------%-----------------USUARIO 1--------------------------------------------------------------------cod1=H(1,:);
% Codigo de usuario 1
recibido=zeros(1,N);
% Vector recibido a la entrada del receptor por cada simbolo
enviado (se va solapando con cada simbolo de N elementos que llega)
VI. ANEXOS
89
Interconexión Entre Sistemas Móviles de 3ª Generación
rx_sum=zeros(1,M);
receptor antes del detector
z=0;
% Vector de simbolos recibidos despues de la suma en el
% Inicilizamos indices
for k=1:M
for i=1:N
recibido(i)=vect_s(i+z);
end
rec=fft(recibido);
sum=rec*cod1';
rx_sum(k)=sum/N;
% Dividimos entre N porque estamos sumando N elementos y
queremos volver a tener potencia unidad como al principio
z=z+N;
end
%%%%%%%%%%%%%% RUIDO
for j=0:15
No=10^(-(j/10));
% Valores de Eb/No en dB (siendo Eb=1)
% Distintos valores para No en unidades naturales
ruido=sqrt(N*No/2)*randn(1,N*M);
señal de informacion(ver articulo))
% Ruido que llega al receptor (lo separamos de la
cod1=H(1,:);
% Codigo de usuario 1
ruido_simb=zeros(1,N);
% Vector de ruido recibido a la entrada del
receptor por cada simbolo enviado (se va solapando)
rx_ruido_sum=zeros(1,M);
receptor y antes del detector
z=0;
% Vector de ruido despues de la suma en el
% Inicilizamos indices
for k=1:M
for i=1:N
ruido_simb(i)=ruido(i+z);
end
rec_ruido=fft(ruido_simb);
sum_ruido=rec_ruido*cod1';
rx_ruido_sum(k)=sum_ruido/N;
% Dividimos entre N porque estamos sumando N
elementos y queremos volver a tener potencia No/2 como al principio
z=z+N;
VI. ANEXOS
90
Interconexión Entre Sistemas Móviles de 3ª Generación
end
%%%%%%%%%%%% DETECTOR
rec_total=rx_sum+real(rx_ruido_sum);
del ruido
det=sign(rec_total);
error=0;
% Sumamos informacion (es real) y parte real
% Vector detectado
% Contador de errores
for i=1:M
if datos1(i)~=det(i);
error=error+1;
% Hallamos el numero de errores
end
end
ber(j+1)=error/M;
% Promediamos el numero de errores
end
figure
EbNo=0:15;
semilogy(EbNo,ber);
% Dibujamos el eje ‘y’ en escala logaritmica
xlabel('Eb/No(dB)'),ylabel('BER');
grid
function ber_snr_mrc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%% REPRESENTACION BER RESPECTO A SNR %%%%%%%%%%%%%%%
%%%%%%%%%%%% USANDO RECEPTOR MRC %%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
close all
clear all
N=16;
M=1e4;
K=2;
U=16;
H=hadamard(N);
% Numero de portadoras ortogonales
% Numero de datos (bits) por usuario
% Factor de Rician
% Numero de usuarios
% Generamos matriz de codigos hadamard (ortogonales)
%----- Usuario 1 ------------------------------------------------------
VI. ANEXOS
91
Interconexión Entre Sistemas Móviles de 3ª Generación
datos1=sign(randn(1,M));
cod1=H(1,:);
del usuario 1
% Generamos vector de datos del usuario 1
% Cogemos la primera fila de matriz de hadamard como codigo
fading1=rician_generator(N,K);
siguen una distribucion de Rician
% Generamos un vector de numeros aleatorios que
codyric1=cod1.*fading1;
% Multiplico cada chip del codigo por el
desvanecimiento de la rama correspondiente
datos1c=datos1';
% Ponemos los datos como vector columna
matrix=datos1c*codyric1;
multiplicado por el codigo
% Cada fila de esta matriz tiene un dato de usuario
vect_s1=zeros(1,(N*M));
% Vector con los datos transmitidos
i=1;
for k=1:M
fila=matrix(k,:);
s1=ifft(fila);
for n=1:N
% Vector s1 posee N elementos
vect_s1(i)=s1(n);
i=i+1;
end
end
%-----Otros Usuarios -----------------------------------------------------for u=2:1:U
datos_u=sign(randn(1,M));
cod_u=H(u,:);
como codigo de usuario u
% Generamos vector de datos del usuario u
% Cogemos la segunda fila de matriz de hadamard
fading_u=rician_generator(N,K);
que siguen una distribucion de Rician
% Generamos un vector de numeros aleatorios
codyric_u=cod_u.*fading_u;
desvanecimiento de la rama correspondiente
% Multiplico cada chip del codigo por el
datos_uc=datos_u';
matrix_u=datos_uc*codyric_u;
usuario multiplicado por el codigo
vect_s_u=zeros(1,(N*M));
vect_s_int=zeros(1,(N*M));
los usuarios interferentes
VI. ANEXOS
% Ponemos los datos como vector columna
% Cada fila de esta matriz tiene un dato de
% Vector con los datos transmitidos por usuario
% Vector con los datos transmitidos por todos
92
Interconexión Entre Sistemas Móviles de 3ª Generación
i=1;
for k=1:M
fila_u=matrix_u(k,:);
s_u=ifft(fila_u);
for n=1:N
% Vector s_u posee N elementos
vect_s_u(i)=s_u(n);
i=i+1;
end
end
vect_s_int=vect_s_int+vect_s_u;
end
% Suma de los dos usuarios (lo que sale al canal)
vect_s=vect_s1+vect_s_int;
%---------------------RECEPTOR MRC (multiplico en el receptor por el codigo y por el
desvanecimiento correspondiente de cada rama)
%-----------------USUARIO 1--------------------------------------------------------------------%cod1=H(1,:);
% Codigo de usario 1
recibido=zeros(1,N);
% Vector recibido a la entrada del receptor por cada
simbolo enviado (se va solapando con cada simbolo de N elementos que llega)
rx_sum=zeros(1,M);
el receptor antes del detector
z=0;
% Vector de simbolos recibidos despues de la suma en
% Inicilizamos indices
for k=1:M
for i=1:N
recibido(i)=vect_s(i+z);
end
rec=fft(recibido);
sum=rec*codyric1';
rx_sum(k)=sum/N;
% Dividimos entre N porque estamos sumando N
elementos y queremos volver a tener potencia unidad como al principio
z=z+N;
VI. ANEXOS
93
Interconexión Entre Sistemas Móviles de 3ª Generación
end
%%%%%%%%%%%%% RUIDO
for j=0:15
No=10^(-(j/10));
% Valores de Eb/No en dB (siendo Eb=1)
% Distintos valores para No en unidades naturales
ruido=sqrt(N*No/2)*randn(1,N*M);
señal de informacion(ver articulo))
cod1=H(1,:);
% Ruido que llega al receptor (lo separamos de la
% Codigo de usuario 1
ruido_simb=zeros(1,N);
% Vector de ruido recibido a la entrada del receptor
por cada simbolo enviado (se va solapando)
rx_ruido_sum=zeros(1,M);
receptor y antes del detector
z=0;
% Vector de ruido despues de la suma en el
% Inicilizamos indices
for k=1:M
for i=1:N
ruido_simb(i)=ruido(i+z);
end
rec_ruido=fft(ruido_simb);
sum_ruido=rec_ruido*codyric1';
rx_ruido_sum(k)=sum_ruido/N;
% Dividimos entre N porque estamos sumando N
elementos y queremos volver a tener potencia No/2 como al principio
z=z+N;
end
%%%%%%%%%%%% DETECTOR
rec_total=rx_sum+real(rx_ruido_sum);
del ruido
% Sumamos informacion (es real) y parte real
det=sign(rec_total);
% Vector detectado
error=0;
% Contador de errores
for i=1:M
if datos1(i)~=det(i);
error=error+1;
VI. ANEXOS
%Hallamos el numero de errores
94
Interconexión Entre Sistemas Móviles de 3ª Generación
end
end
ber(j+1)=error/M;
% Promediamos el numero de errores
end
figure
EbNo=0:15;
semilogy(EbNo,ber);
% Dibujamos el eje ‘y’ en escala logaritmica
xlabel('Eb/No(dB)'),ylabel('BER');
grid
Como podemos observar estas dos últimas funciones (function ber_snr_egc y
function ber_snr_mrc) son muy parecidas y solo varían en la parte del receptor. A
continuación se representará la función Matlab ber_us_egc_k_reg donde representamos
la variación de la BER a medida que aumentamos el número de usuarios, para una SNR
fija y para distintos valores del factor de Rician K, usando un receptor EGC. La función
ber_us_mrc_k_reg representa lo mismo para un receptor MRC y no la mostraremos ya
que es similar a la anterior variando simplemente en el receptor de la misma forma que
vimos que variaba en function ber_snr_mrc respecto a function ber_snr_egc.
function ber_us_egc_k_reg
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%% MULTIPLES USUARIOS %%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%% MULTIPLES FACTORES K %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%% RECEPTOR EGC %%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
close all
clear all
N=16;
U=16;
numero de subportadoras)
% Numero de subportadoras ortogonales
% Numero de usuarios (tiene que ser menor o igual que el
M=1e4;
c=['b','g','r','c','k'];
% Numero de datos (bits) por usuario
% Vector de colores
H=hadamard(N);
para cada usuario
% Generamos matriz de codigos hadamard (ortogonales), uno
VI. ANEXOS
95
Interconexión Entre Sistemas Móviles de 3ª Generación
y=1;
% Indice del vector de colores
figure
for K=0:2:8
% Factor K de la distribucion de Rician
vect_s=zeros(1,(N*M));
susarios)
% Vector con los datos transmitidos totales (los U
%----- Usuarios desde 1 a U -----------------------------------------------------for u=1:U
datos=sign(randn(1,M));
% Generamos vector de datos del usuario u
cod=H(u,:);
codigo de usuario u
% Cogemos la fila u de la matriz de hadamard como
fading=rician_generator(N,K);
siguen una distribucion de Rician
% Generamos un vector de numeros aleatorios que
codyric=cod.*fading;
% Multiplico cada chip del codigo por el
desvanecimiento de la rama correspondiente
datosc=datos';
% Ponemos los datos como vector columna
matrix=datosc*codyric;
multiplicado por el codigo
% Cada fila de esta matriz tiene un dato de usuario
vect_s_u=zeros(1,(N*M));
% Vector con los datos transmitidos de cada usuario
i=1;
for k=1:M
fila=matrix(k,:);
s_u=ifft(fila);
for n=1:N
% Vector s_u posee N elementos
vect_s_u(i)=s_u(n);
i=i+1;
end
end
if u==1
datos1=datos;
detector
cod1=cod;
% Guardo los datos del usuario 1 para luego usarlo en el
% Guardo el codigo del usuario 1 para el receptor EGC
end
% Suma de los usuarios (lo que sale al canal)
VI. ANEXOS
96
Interconexión Entre Sistemas Móviles de 3ª Generación
vect_s=vect_s+vect_s_u;
%---------------------RECEPTOR EGC (multiplico en el receptor por el codigo)
%-----------------USUARIO 1--------------------------------------------------------------------recibido=zeros(1,N);
% Vector recibido a la entrada del receptor por cada simbolo
enviado (se va solapando con cada simbolo de N elementos que llega)
rx_sum=zeros(1,M);
receptor antes del detector
z=0;
% Vector de simbolos recibidos despues de la suma en el
% Inicilizamos indices
for k=1:M
for i=1:N
recibido(i)=vect_s(i+z);
end
rec=fft(recibido);
sum=rec*cod1';
receptor)
% Uso codigo del usuario 1 (guardado en cod1 para usarlo en
rx_sum(k)=sum/N;
% Dividimos entre N porque estamos sumando N elementos y
queremos volver a tener potencia unidad como al principio
z=z+N;
end
%%%%%%%%%%%%%%%%%%%%%%%%% RUIDO
EbNo=10;
% Eb/No=10dB, como Eb=1 tenemos 1/No=10dB
No=10^(-(EbNo/10));
% Valor de No en unidades naturales
ruido=sqrt(N*No/2)*randn(1,N*M);
señal de informacion(ver articulo))
% Ruido que llega al receptor (lo separamos de la
ruido_simb=zeros(1,N);
% Vector de ruido recibido a la entrada del receptor
por cada simbolo enviado (se va solapando)
rx_ruido_sum=zeros(1,M);
antes del detector
z=0;
% Vector de ruido despues de la suma en el receptor y
% Inicilizamos indices
for k=1:M
for i=1:N
ruido_simb(i)=ruido(i+z);
VI. ANEXOS
97
Interconexión Entre Sistemas Móviles de 3ª Generación
end
rec_ruido=fft(ruido_simb);
sum_ruido=rec_ruido*cod1';
rx_ruido_sum(k)=sum_ruido/N;
% Dividimos entre N porque estamos sumando N
elementos y queremos volver a tener potencia No/2 como al principio
z=z+N;
end
%%%%%%%%%%%% DETECTOR
rec_total=rx_sum+real(rx_ruido_sum);
del ruido
% Sumamos informacion (es real) y parte real
det=sign(rec_total);
% Vector detectado
error=0;
% Contador de errores
for i=1:M
if datos1(i)~=det(i);
error=error+1;
% Hallamos el numero de errores
end
end
ber(u)=error/M;
% Promediamos el numero de errores
end
usu=1:U;
p = polyfit(usu,ber,3);
xg = linspace(1,U);
yg = polyval(p,xg);
semilogy(xg,yg,c(y))
% Ajuste polinomico (curva de regresion)
% Representamos en escala logaritmica
hold on
clear ber
legend('K=0, Rayleigh','K=2','K=4','K=6','K=8');
xlabel('NUMERO DE USUARIOS Caso EGC'),ylabel('BER');
y=y+1;
end
grid
VI. ANEXOS
98
Interconexión Entre Sistemas Móviles de 3ª Generación
VI-1.2. Códigos OVSF
Ahora vamos a representar las mismas funciones que en el apartado anterior, pero
ahora utilizando códigos ortogonales OVSF, los cuales vimos en la memoria. En primer
lugar mostraremos la función spread, la cual genera estos códigos OVSF, donde S
indica el factor de ensanchado y L la rama. Por tanto spread hace las labores que la
función hadamard hacía para los códigos anteriores.
Esta función spread será utilizada por el resto de funciones de este apartado:
•
ber_snr_egc_ovsf, en la cual representamos BER respecto a SNR para un
número fijo de usuarios y receptor EGC.
•
ber_snr_mrc_ovsf, idéntica a la anterior pero para receptor MRC.
•
ber_us_egc_ovsf, en la cual representamos la variación BER respecto al
número de usuarios para una SNR fija, distintas K y receptor EGC.
•
ber_us_mrc_ovsf, idéntica a la anterior pero para receptor MRC.
Estas cuatro funciones son muy similares a las vistas en el caso de los códigos de
Hadamard, con la diferencia de que debemos usar la función spread en vez de
hadamard, por tanto solamente mostraremos dos de ellas, que serán ber_snr_egc_ovsf
y ber_us_mrc_ovsf (ya que la representación de la BER respecto al número de
usuarios para receptor MRC fue la que no mostramos en el apartado anterior la
mostraremos en este).
function output=spread(S,L)
output=ones(1,S);
exp2=log(S)/log(2);
for(I=1:exp2)
a=power(2,(exp2-I));
exp1=floor(((L-1)/a));
for(j=1:floor(2^(I-1)))
output(floor(2^(I-1))+j)=output(j)*(-1).^exp1;
VI. ANEXOS
99
Interconexión Entre Sistemas Móviles de 3ª Generación
end
end
function ber_snr_mrc_ovsf
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%% RECEPTOR EGC %%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%% BER RESPECTO A SNR %%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%% CODIGOS OVSF %%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
close all
clear all
N=16;
M=1e4;
K=2;
U=16;
% Numero de portadoras ortogonales y factor de ensanchado SF
% Numero de datos (bits) por usuario
% Factor de Rician
% Numero de usuarios
%----- Usuario 1 -----------------------------------------------------datos1=sign(randn(1,M));
% Generamos vector de datos del usuario 1
cod1=spread(N,1);
% Cogemos primera rama de los codigos OVSF para
factor de ensanchado N como codigo del usuario 1
fading1=rician_generator(N,K);
siguen una distribucion de Rician
% Generamos un vector de numeros aleatorios que
codyric1=cod1.*fading1;
% Multiplico cada chip del codigo por el
desvanecimiento de la rama correspondiente
datos1c=datos1';
% Ponemos los datos como vector columna
matrix=datos1c*codyric1;
multiplicado por el codigo
% Cada fila de esta matriz tiene un dato de usu
vect_s1=zeros(1,(N*M));
% Vector con los datos transmitidos
i=1;
for k=1:M
fila=matrix(k,:);
s1=ifft(fila);
for n=1:N
% Vector s1 posee N elementos
vect_s1(i)=s1(n);
i=i+1;
end
VI. ANEXOS
100
Interconexión Entre Sistemas Móviles de 3ª Generación
end
%-----Otros Usuarios -----------------------------------------------------for u=2:1:U
datos_u=sign(randn(1,M));
% Generamos vector de datos del usuario u
cod_u=spread(N,u);
% Cogemos rama u como codigo de usuario u
fading_u=rician_generator(N,K);
que siguen una distribucion de Rician
% Generamos un vector de numeros aleatorios
codyric_u=cod_u.*fading_u;
desvanecimiento de la rama correspondiente
% Multiplico cada chip del codigo por el
datos_uc=datos_u';
matrix_u=datos_uc*codyric_u;
usuario multiplicado por el codigo
vect_s_u=zeros(1,(N*M));
vect_s_int=zeros(1,(N*M));
los usuarios interferentes
% Ponemos los datos como vector columna
% Cada fila de esta matriz tiene un dato de
% Vector con los datos transmitidos por usuario
% Vector con los datos transmitidos por todos
i=1;
for k=1:M
fila_u=matrix_u(k,:);
s_u=ifft(fila_u);
for n=1:N
% Vector s_u posee N elementos
vect_s_u(i)=s_u(n);
i=i+1;
end
end
vect_s_int=vect_s_int+vect_s_u;
end
% Suma de los dos usuarios (lo que sale al canal)
vect_s=vect_s1+vect_s_int;
%---------------------RECEPTOR EGC (multiplico en el receptor solo por el codigo)---------------%-----------------USUARIO 1--------------------------------------------------------------------cod1=spread(N,1);
VI. ANEXOS
% Codigo de usuario 1
101
Interconexión Entre Sistemas Móviles de 3ª Generación
recibido=zeros(1,N);
% Vector recibido a la entrada del receptor por cada
simbolo enviado (se va solapando con cada simbolo de N elementos que llega)
rx_sum=zeros(1,M);
el receptor antes del detector
z=0;
% Vector de simbolos recibidos despues de la suma en
% Inicilizamos indices
for k=1:M
for i=1:N
recibido(i)=vect_s(i+z);
end
rec=fft(recibido);
sum=rec*cod1';
rx_sum(k)=sum/N;
% Dividimos entre N porque estamos sumando N
elementos y queremos volver a tener potencia unidad como al principio
z=z+N;
end
%%%%%%%%%%%%%%%%% RUIDO
for j=0:15
% Valores de Eb/No en dB (siendo Eb=1)
No=10^(-(j/10));
naturales
% Distintos valores para No en unidades
ruido=sqrt(N*No/2)*randn(1,N*M);
la señal de informacion(ver articulo))
% Ruido que llega al receptor (lo separamos de
cod1=spread(N,1);
% Codigo de usuario 1
ruido_simb=zeros(1,N);
% Vector de ruido recibido a la entrada del
receptor por cada simbolo enviado (se va solapando)
rx_ruido_sum=zeros(1,M);
receptor y antes del detector
z=0;
% Vector de ruido despues de la suma en el
% Inicilizamos indices
for k=1:M
for i=1:N
ruido_simb(i)=ruido(i+z);
end
VI. ANEXOS
102
Interconexión Entre Sistemas Móviles de 3ª Generación
rec_ruido=fft(ruido_simb);
sum_ruido=rec_ruido*cod1';
rx_ruido_sum(k)=sum_ruido/N;
% Dividimos entre N porque estamos sumando
N elementos y queremos volver a tener potencia No/2 como al principio
z=z+N;
end
%%%%%%%%%%%% DETECTOR
rec_total=rx_sum+real(rx_ruido_sum);
del ruido
% Sumamos informacion (es real) y parte real
det=sign(rec_total);
% Vector detectado
error=0;
% Contador de errores
for i=1:M
if datos1(i)~=det(i);
error=error+1;
% Hallamos el numero de errores
end
end
ber(j+1)=error/M;
% Promediamos el numero de errores
end
figure
EbNo=0:15;
semilogy(EbNo,ber);
% Dibujamos el eje ‘y’ en escala logaritmica
xlabel('Eb/No(dB)'),ylabel('BER');
grid
function ber_us_mrc_ovsf
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%% MULTIPLES USUARIOS %%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%% MULTIPLES FACTORES K %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%% RECEPTOR MRC %%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%% CODIGOS OVSF %%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
VI. ANEXOS
103
Interconexión Entre Sistemas Móviles de 3ª Generación
close all
clear all
N=16;
U=16;
numero de subportadoras)
% Numero de subportadoras ortogonales
% Numero de usuarios (tiene que ser menor o igual que el
M=1e4;
c=['b','g','r','c','k'];
% Numero de datos (bits) por usuario
% Vector de colores
y=1;
% Indice del vector de colores
figure
for K=0:2:8
% Factor K de la distribucion de Rician
vect_s=zeros(1,(N*M));
susarios)
% Vector con los datos transmitidos totales (los U
%----- Usuarios desde 1 a U -----------------------------------------------------for u=1:U
datos=sign(randn(1,M));
% Generamos vector de datos del usuario u
cod=spread(N,u);
usuario u
% Cogemos la rama u del codigo OVSF como codigo de
fading=rician_generator(N,K);
siguen una distribucion de Rician
codyric=cod.*fading;
rama correspondiente
datosc=datos';
% Generamos un vector de numeros aleatorios que
% Multiplico cada chip del codigo por el desvanecimiento de la
% Ponemos los datos como vector columna
matrix=datosc*codyric;
por el codigo
vect_s_u=zeros(1,(N*M));
% Cada fila de esta matriz tiene un dato de usu multiplicado
% Vector con los datos transmitidos de cada usuario
i=1;
for k=1:M
fila=matrix(k,:);
s_u=ifft(fila);
for n=1:N
% Vector s_u posee N elementos
vect_s_u(i)=s_u(n);
i=i+1;
end
end
VI. ANEXOS
104
Interconexión Entre Sistemas Móviles de 3ª Generación
if u==1
detector
receptor
datos1=datos;
% Guardo los datos del usuario 1 para luego usarlo en el
codyric1=codyric;
% Guardo el codigo y el canal Rician del usuario 1 para el
end
% Suma de los usuarios (lo que sale al canal)
vect_s=vect_s+vect_s_u;
%---------------------RECEPTOR MRC (multiplico en el receptor por el codigo y por el
desvanecimiento correspondiente de cada rama)
%-----------------USUARIO 1--------------------------------------------------------------------recibido=zeros(1,N);
% Vector recibido a la entrada del receptor por cada
simbolo enviado (se va solapando con cada simbolo de N elementos que llega)
rx_sum=zeros(1,M);
el receptor antes del detector
z=0;
% Vector de simbolos recibidos despues de la suma en
% Inicilizamos indices
for k=1:M
for i=1:N
recibido(i)=vect_s(i+z);
end
rec=fft(recibido);
sum=rec*codyric1';
% Uso codigo y desvanecimiento Rician del usuario 1
(guardado en codyric1 para usarlo en receptor)
rx_sum(k)=sum/N;
% Dividimos entre N porque estamos sumando N
elementos y queremos volver a tener potencia unidad como al principio
z=z+N;
end
%%%%%%%%%%%%%%%%% RUIDO
EbNo=10;
No=10^(-(EbNo/10));
ruido=sqrt(N*No/2)*randn(1,N*M);
señal de informacion(ver articulo))
VI. ANEXOS
% Eb/No=10dB, como Eb=1 tenemos 1/No=10dB
% Valor de No en unidades naturales
% Ruido que llega al receptor (lo separamos de la
105
Interconexión Entre Sistemas Móviles de 3ª Generación
ruido_simb=zeros(1,N);
% Vector de ruido recibido a la entrada del receptor por
cada simbolo enviado (se va solapando)
rx_ruido_sum=zeros(1,M);
antes del detector
z=0;
% Vector de ruido despues de la suma en el receptor y
% Inicilizamos indices
for k=1:M
for i=1:N
ruido_simb(i)=ruido(i+z);
end
rec_ruido=fft(ruido_simb);
sum_ruido=rec_ruido*codyric1';
rx_ruido_sum(k)=sum_ruido/N;
% Dividimos entre N porque estamos sumando N
elementos y queremos volver a tener potencia No/2 como al principio
z=z+N;
end
%%%%%%%%%%%% DETECTOR
rec_total=rx_sum+real(rx_ruido_sum);
del ruido
% Sumamos informacion (es real) y parte real
det=sign(rec_total);
% Vector detectado
error=0;
% Contador de errores
for i=1:M
if datos1(i)~=det(i);
error=error+1;
% Hallamos el numero de errores
end
end
ber(u)=error/M;
% Promediamos el numero de errores
end
usu=1:U;
p = polyfit(usu,ber,3);
xg = linspace(1,U);
yg = polyval(p,xg);
semilogy(xg,yg,c(y))
VI. ANEXOS
% Ajuste polinomico (curva de regresion)
% Representamos logaritmicamente
106
Interconexión Entre Sistemas Móviles de 3ª Generación
hold on
clear ber
legend('K=0, Rayleigh','K=2','K=4','K=6','K=8');
xlabel('NUMERO DE USUARIOS Caso MRC'),ylabel('BER');
y=y+1;
end
grid
VI-1.3. Teórica
En esta función representamos gráficamente la variación de la BER respecto al
número de usuarios, para distintos valores del factor de Rician K (si K = 0 estaremos en
el caso de desvanecimiento Rayleigh) y para los receptores MRC y EGC, partiendo de
las fórmulas teóricas simplificadas que nos proporciona el artículo del cual hemos
partido.
%=========================================================
%=========================================================
% Curvas Teoricas
% Rician y Rayleigh (K=0)
%=========================================================
%=========================================================
function teoricas
clear all
close all
c=['b','g','r','c','k'];
y=1;
M=16;
N=16;
Tb=1;
% Vector de colores
% Numero total de usuarios
% Numero de subportadoras
% Tiempo de bit
EbNo=10;
No=10^(-(EbNo/10));
% Tomamos Eb/No=10dB, como Eb=1 tenemos 1/No=10dB
% Valor de No en unidades naturales
%%%%%%%%%%%%%%%%%%% BER respecto a numero de usuarios para distintas K
%%%%%%%%%%%%%%%%%%%%
VI. ANEXOS
107
Interconexión Entre Sistemas Móviles de 3ª Generación
%%%%%%%%% EGC
figure
for K=0:2:8
% Factor de Rician
ganma=(pi/4)*((exp(-K))/(K+1))*(((1+K)*besseli(0,K/2)+K*besseli(1,K/2))^2);
fading= rician_generator(N,K);
p_i=((mean(fading))^2)/2;
p=N*p_i;
for u=1:M
% Aproxiamndo mediante aplicacion del teorema del limite central
Pe(u)=erfc(sqrt((ganma*p*Tb)/((2*(u/N)*(1-ganma)*p*Tb)+No)))/2;
end
usu=1:M;
semilogy(usu,Pe,c(y));
% Dibujamos en escala logaritmica
hold on
clear Pe
legend('K=0, Rayleigh','K=2','K=4','K=6','K=8');
xlabel('NUMERO DE USUARIOS'),ylabel('BER Caso EGC');
y=y+1;
end
grid
figure
%%%%%%%% MRC
y=1;
for K=0:2:8
ganma=(pi/4)*((exp(-K))/(K+1))*(((1+K)*besseli(0,K/2)+K*besseli(1,K/2))^2);
fading= rician_generator(N,K);
p_i=((mean(fading))^2)/2;
p=N*p_i;
for u=1:M
VI. ANEXOS
108
Interconexión Entre Sistemas Móviles de 3ª Generación
% Aproxiamndo mediante aplicacion del teorema del limite central
Pe(u)=erfc(sqrt((p*Tb)/(((u/N)*((4*K+2)/((K+1)^2))*p*Tb)+No)))/2;
end
usu=1:M;
semilogy(usu,Pe,c(y));
% Dibujamos en escala logaritmica
hold on
clear Pe
legend('K=0, Rayleigh','K=2','K=4','K=6','K=8');
xlabel('NUMERO DE USUARIOS'),ylabel('BER caso MRC');
y=y+1;
end
grid
VI. ANEXOS
109
Descargar