21
Anexo I: Código de las funciones de MatLab 115 ANEXO I: CÓDIGO DE LAS FUNCIONES DE MATLAB A continuación vamos a presentar el código diseñado de todas las funciones necesarias para implementar el estudio presentado en el capítulo 6. Primero mostramos las funciones relacionadas con las modulaciones OFDM y QPSK (Moduladores, receptores y decisores) además del canal: function [s_qam]=Modulador_16QAM (b) Nsim_qam=length(b)/4; mat_qam=reshape(b,4,Nsim_qam); %codificación de los símbolos usando Gray for i=1:Nsim_qam %Parte real if mat_qam(4,i)==0 mat_real(i)=3; else mat_real(i)=1; end if mat_qam(3,i)==0 mat_real(i)=-mat_real(i); end %Parte Imaginaria if mat_qam(2,i)==0 mat_imag(i)=3; else mat_imag(i)=1; end if mat_qam(1,i)==0 mat_imag(i)=-mat_imag(i); end end s_qam=mat_real+j*mat_imag; figure(1); plot(real(s_qam),imag(s_qam),'.'); axis([-4,4,-4,4],'square') grid on; hold on; title('Constelación transmitida') xlabel('Fase') ylabel('Cuadratura') function OFDM_vector_n=Modulador_OFDM (qam16_vector_tx,Nport,Nsim_OFDM,PC) %Función que modula los símbolos 16_QAM recibidos en símbolos OFDM. qam16_matriz=reshape(qam16_vector_tx,Nport,Nsim_OFDM); %Pasa de serie a paralelo

ANEXO I: CÓDIGO DE LAS FUNCIONES DE MATLABbibing.us.es/proyectos/abreproy/11983/fichero/ANEXO+I+-+Códigos.pdf · Anexo I: Código de las funciones de MatLab 120 function y_ruido=canal(senal_tx)

  • Upload
    vukhanh

  • View
    220

  • Download
    0

Embed Size (px)

Citation preview

Anexo I: Código de las funciones de MatLab

115

ANEXO I: CÓDIGO DE LAS FUNCIONES DE MATLAB

A continuación vamos a presentar el código diseñado de todas las funciones necesarias para

implementar el estudio presentado en el capítulo 6.

Primero mostramos las funciones relacionadas con las modulaciones OFDM y QPSK

(Moduladores, receptores y decisores) además del canal:

function [s_qam]=Modulador_16QAM (b) Nsim_qam=length(b)/4; mat_qam=reshape(b,4,Nsim_qam); %codificación de los símbolos usando Gray for i=1:Nsim_qam %Parte real if mat_qam(4,i)==0 mat_real(i)=3; else mat_real(i)=1; end if mat_qam(3,i)==0 mat_real(i)=-mat_real(i); end %Parte Imaginaria if mat_qam(2,i)==0 mat_imag(i)=3; else mat_imag(i)=1; end if mat_qam(1,i)==0 mat_imag(i)=-mat_imag(i); end end s_qam=mat_real+j*mat_imag; figure(1); plot(real(s_qam),imag(s_qam), '.' ); axis([-4,4,-4,4], 'square' ) grid on; hold on; title( 'Constelación transmitida' ) xlabel( 'Fase' ) ylabel( 'Cuadratura' )

function OFDM_vector_n=Modulador_OFDM (qam16_vector_tx,Nport,Nsim_OFDM,PC) %Función que modula los símbolos 16_QAM recibidos e n símbolos OFDM. qam16_matriz=reshape(qam16_vector_tx,Nport,Nsim_OFD M); %Pasa de serie a paralelo

Anexo I: Código de las funciones de MatLab

116

OFDM_matriz=ifft(qam16_matriz); %Hace la IFFT del los datos. %Introduce Prefijo cíclico mat_aux(1:PC,:)=OFDM_matriz(Nport-PC+1:Nport,:); mat_aux(PC+1:Nport+PC,:)=OFDM_matriz; OFDM_matriz_PC=mat_aux; %Pasamos de paralelo a serie OFDM_vector=paralelo_serie(OFDM_matriz_PC,Nport+PC, Nsim_OFDM); %Normalizamos para que la energía por símbolo sea u no k=sqrt(length(OFDM_vector)/(OFDM_vector*OFDM_vector ')); OFDM_vector_n=k*OFDM_vector; function [OFDM_vector]=paralelo_serie(OFDM_matriz,Nport,Nsi m_OFDM) %Función que pasa un vector columna a un vector fil a. Es llamada en la %función que realiza la modulación OFDM k=1; for j=1:Nsim_OFDM for i=1:Nport OFDM_vector(k)=OFDM_matriz(i,j); k=k+1; end end

function s_qpsk=mod_qpsk(bits) %Función que modula los bits recibidos en símbolos de una QPSK Nsim_qpsk=length(bits)/2; mat_qpsk=reshape(bits,2,Nsim_qpsk); %codificación de los símbolos usando Gray for i=1:Nsim_qpsk %Parte real if mat_qpsk(2,i)==0 mat_real(i)=1; else mat_real(i)=-1; end %Parte Imaginaria if mat_qpsk(1,i)==0 mat_imag(i)=1; else mat_imag(i)=-1; end end s_qpsk=mat_real+j*mat_imag; figure(1);

Anexo I: Código de las funciones de MatLab

117

plot(real(s_qpsk),imag(s_qpsk), '.' ); %Gráfica de la constelación transmitida axis([-2,2,-2,2], 'square' ) grid on; hold on; title( 'Constelación transmitida' ) xlabel( 'Fase' ) ylabel( 'Cuadratura' )

function s_rx=receptor_OFDM(senal_tx,frca,qam16_vector_tx,Np ort,PC,Nsim_OFDM) %En esta función vamos a realizar todo lo que compr ende la parte del %receptor del sistema de comunicación OFDM. Primero pasamos por el filtro %raiz de coseno alzado, después muestreamos la seña l que nos viene %sobremuestreada. Lo siguiente que se hace es, quit ar el Prefijo Cíclico, %hacer la FFT, pasar de paralelo a serie y al final escalar. delay=48; Fs=16; Fd=1; OFDM_vector_rx_ex = [senal_tx(end-delay*16+1:end),senal_tx,senal_tx(1:delay*16)]; OFDM_vector_rx=conv(OFDM_vector_rx_ex,frca); OFDM_vector_rx_truncado= OFDM_vector_rx(:,2*delay . * Fs/Fd + 1:end-(2*delay .*Fs/Fd)); %Muestreamos OFDM_matriz_det=reshape(OFDM_vector_rx_truncado,16, length(OFDM_vector_rx_truncado)/16); OFDM_vector_det=OFDM_matriz_det(1,:); OFDM_vector_det=OFDM_vector_det(1:(Nport+PC)*Nsim_O FDM); matriz_aux=reshape(OFDM_vector_det,Nport+PC,Nsim_OF DM); %En este momento pasamos de serie a paralelo para luego real izar la FFT matriz_rx_OFDM_sinPC=matriz_aux(PC+1:end,:); %Quitamos el Prefijo Cíclico matriz_QAM16_rx=fft(matriz_rx_OFDM_sinPC); %FFT para demodular por fin y obtener los símbolos 16-QAM vector_QAM16_rx=paralelo_serie(matriz_QAM16_rx,Npor t,Nsim_OFDM); %Normalizamos para que la energía por símbolo sea u no vector_QAM16_rx=sqrt(length(vector_QAM16_rx)/(vecto r_QAM16_rx*vector_QAM16_rx'))*vector_QAM16_rx; %Se tiene que escalar la señal para que la constela ción nos salga %encuadrada en los mismos puntos que en la transmis ión s_rx_phi = abs(vector_QAM16_rx).*exp(j*(angle(vecto r_QAM16_rx) - mean(angle(vector_QAM16_rx) - angle(qam16_vector_tx )))); s_rx = (norm(qam16_vector_tx)/norm(s_rx_phi))*s_rx_ phi;

Anexo I: Código de las funciones de MatLab

118

function s_rx=receptor_qpsk(out_canal,frca,vector_qpsk_tx) %En esta función vamos a realizar todo lo que compr ende la parte del %receptor del sistema de comunicación QPSK. Primero pasamos por el filtro %raiz de coseno alzado, después muestreamos la seña l que nos viene %sobremuestreada y ya tendríamos los símbolos QPSK, sólo tendríamos que %escalarlos. delay=48; Fs=16; Fd=1; vector_qpsk_rx_ex = [out_canal(end-delay*16+1:end),out_canal,out_canal(1:delay*16)]; vector_qpsk_rx=conv(vector_qpsk_rx_ex,frca); vector_qpsk_rx_truncado= vector_qpsk_rx(:,2*delay . * Fs/Fd + 1:end-(2*delay .*Fs/Fd)); %Muestreamos matriz_qpsk_det=reshape(vector_qpsk_rx_truncado,16, length(vector_qpsk_rx_truncado)/16); vector_QPSK_rx=matriz_qpsk_det(1,:); %Se tiene que escalar la señal para que la constela ción nos salga %encuadrada en los mismos puntos que en la transmis ión s_rx_phi = abs(vector_QPSK_rx).*exp(j*(angle(vector _QPSK_rx) - mean(angle(vector_QPSK_rx) - angle(vector_qpsk_tx)) )); s_rx = (norm(vector_qpsk_tx)/norm(s_rx_phi))*s_rx_p hi;

function decisor_16qam(senal_rx) %Función que va a decidir que símbolo es el que hem os recibido de los 16 %posibles. Nsim=length(senal_rx); %Nº de símbolos 16-QAM for j=1:Nsim %Parte real if real(senal_rx(j))<2 && real(senal_rx(j))>=0 decisor_r(j)=1; else if real(senal_rx(j))>=2 decisor_r(j)=3; else if -2<=real(senal_rx(j)) && real(senal_rx(j))<0 decisor_r(j)=-1; else decisor_r(j)=-3; end end end %Parte Imaginaria if imag(senal_rx(j))<2 && imag(senal_rx(j))>=0 decisor_i(j)=1; else if imag(senal_rx(j))>=2

Anexo I: Código de las funciones de MatLab

119

decisor_i(j)=3; else if -2<=imag(senal_rx(j)) && imag(senal_rx(j))<0 decisor_i(j)=-1; else decisor_i(j)=-3; end end end end senal_detec_qam=decisor_r+i*decisor_i; %Vector decidido figure(11) plot(real(senal_detec_qam),imag(senal_detec_qam), '.' ); %Gráfica de la constelación decidida. axis([-4,4,-4,4]) grid on;hold on; title( 'Constelación decidida' ) xlabel( 'Fase' ) ylabel( 'Cuadratura' )

function decisor_qpsk(senal_rx) %Función que va a decidir que símbolo es el que hem os recibido de los 4 %posibles. Nsim=length(senal_rx); %Nº de símbolos QPSK for j=1:Nsim %Parte real if real(senal_rx(j))>=0 decisor_r(j)=1; else decisor_r(j)=-1; end %Parte Imaginaria if imag(senal_rx(j))>=0 decisor_i(j)=1; else decisor_i(j)=-1; end end senal_detec_qpsk=decisor_r+i*decisor_i; %Vector decidido figure(11) plot(real(senal_detec_qpsk),imag(senal_detec_qpsk), '.' ); %Gráfica de la constelación decidida. axis([-2,2,-2,2]) grid on;hold on; title( 'Constelación decidida' ) xlabel( 'Fase' ) ylabel( 'Cuadratura' )

Anexo I: Código de las funciones de MatLab

120

function y_ruido=canal(senal_tx) %función que introduce un ruido blanco aditivo y ga ussiano a la señal %transmitida potencia_db=10*log10(var(senal_tx)); y_ruido=awgn(senal_tx,30,potencia_db);

En segundo lugar están las funciones relacionadas con el cálculo de los coeficientes de la serie

de Volterra:

function h=calcula_coef_mp (y,x,Q,ord) %Función que calcula el kernel de Volterra de un Si stema No Lineal, se %utiliza tanto para el PA como para el DPD. Sólo ba sta con cambiar el orden %de los parámetros de entrada a la función. P = (ord-1)/2; if Q > 0, xmed=[x(end-Q+1:end); x(1:end)]; ymed=y; else xmed=x; ymed=y; end L = length(xmed); N = L-Q; % Tamaño del vector de salida xmed_mat=matriz_mp(xmed,Q,P); %Se llama a esta función para implementar la ecuación (4.52) del Capítulo 4 h=pinv(xmed_mat)*(ymed); %Coeficientes del kernel de Volterra, ecuación (4.54) del Capítulo 4 function [Ymat]=matriz_mp(x,Q,P) %Función que implementa la ecuación (4.52) del Capí tulo 4. Como en MatLab no %podemos trabajar con componentes en el tiempo disc reto iguales o menores %de 0, un truco que se puede usar es el que realiza mos en esta función. La %señal recibida está extendida al principio con las últimas muestras de la %señal. La longitud de esta extensión nos la da la variable Q. Como la %ecuación nos pide que cogamos muestras en componen tes en -1, -2 hasta la %-Q, le decimos a la función que coja las muestras 1 hasta Q para esas %componentes. Cuando nos pida la componente 1, le d ecimos que coja la de %Q+1, y así sucesivamente. L = length(x); N = L-Q; %Longitud final del vector x. d = 0:Q; p1 = repmat(Q-d, N, 1); p2 = repmat((1:N)', 1, Q+1); p = p1 + p2; %variable para elegir las componentes que deseamos del vector x para la matriz Y1

Anexo I: Código de las funciones de MatLab

121

Y1 = x(p); %Matriz con la que después obtendremos el resultado final deseado de la ecuación (4.52) Ymat = []; for k = 0:P Ymat = [Ymat, (abs(Y1).^(2*k)).*Y1]; end Por último mostramos las funciones que montan todo el sistema de comunicación tanto en el

caso de OFDM como en el de QPSK:

function Simulacion_OFDM(xmed,ymed) %%%Función que diseña un sistema de comunicación qu e trabaja con %%%una modulación OFDM. Dicha señal OFDM la vamos h acer que tenga una Tasa de %%%Símbolo=3.84e6 y 16 muestras por símbolo. El PA y el DPD van a ser %%%diseñados a partir de las señales medidas en el laboratorio para %%%caracterizar el Amplificador Real, que es un ZHL 42W y un transistor que %%%es el que introduce las No Linealidades. Las señ ales medidas en el %%%Laboratorio son WCDMA, con Ts=3.84e6 y 16 muestr as por símbolo. delay=48; %Retraso del filtro raiz de coseno alzado Nsps=16; %Número de muestras por símbolo Bits_x_simQAM=4; %Número de bits por símbolo QAM Nport=1024; %Número de portadoras Nsim_OFDM=1; %Número de símbolos OFDM PC=32; %Prefijo cíclico bits=randsrc(1,Bits_x_simQAM*Nport*Nsim_OFDM,[1,0]) ; %Vector que contiene un número de bits aleatorios, 1's y 0's %%%%Transmisor%%%% [qam16_vector_tx]=Modulador_16QAM(bits); OFDM_vector=Modulador_OFDM(qam16_vector_tx,Nport,Ns im_OFDM,PC); %Ajustamos la señal OFDM para que no nos afecten lo s transitorios al %pasar por el filtro raiz de coseno alzado. OFDM_vector_ex = [OFDM_vector(end-delay+1:end),OFDM_vector,OFDM_vector(1:delay)]; %Primero extendemos la señal Fd = 1; Fs = 16; frca=rcosine(Fd,Fs, 'sqrt' ,0.22,delay); % Filtro raiz de coseno alzado OFDM_vector_sob=upsample(OFDM_vector_ex,Nsps); %Sobremuestreamos la señal a 16 muestras por símbolo senal_OFDM=conv(OFDM_vector_sob,frca); %Pasamos la señal OFDM por el filtro raiz de coseno alzado senal_OFDM_truncada= senal_OFDM(:,2*delay .* Fs/Fd + 1:end-(2*delay .*Fs/Fd)); %Al final recortamos la señal y nos quedamos con la s muestras que nos interesan senal_OFDM_truncada=senal_OFDM_truncada.'; t=[2.5,2.8,3.1,3.4,3.7,4,4.75,5.5,6.25,7]; %Este es un vector que nos sirve para ajustar la potencia de la señal OFDM

Anexo I: Código de las funciones de MatLab

122

r=2; %Índice para moverse por el vector t l=2; %Índice para elegir la Potencia de las señales medi das en el laboratorio %Caracterización del PA y el DPD Q=3; %Longitud de la memoria ord=9; %Orden de la No Linealidad P = (ord-1)/2; %Índice para el orden de la No Linealidad ymed2=ymed(:,l); %ymed2 es una columna de la matriz ymed. Cada colum na de ymed es la misma señal pero ajustada a una poten cia que va desde -10 dBm hasta -40 dBm xmed2=xmed(:,l); %Con xmed2 pasa lo mismo que con ymed2. %Coeficientes del amplificador de potencia h_ampl=calcula_coef_mp(ymed2,xmed2,Q,ord); %Cálculo de los coeficientes del Predistorsionador Go=max(abs(ymed2))/max(abs(xmed2)); %Esta es la ganancia esperada. Ecuación (5.8) del capítulo 5 ymed2_n=ymed2./Go; %Aquí ajustamos la salida real de amplificador a la ganancia esperada, como se explica en el Capítulo 5 . h_pred=calcula_coef_mp(xmed2,ymed2_n,Q,ord); %Coeficientes del predistorsinador %Ajustamos la potencia de entrada de la señal OFDM según corresponda p_senal=(senal_OFDM_truncada'*senal_OFDM_truncada)/ length(senal_OFDM_truncada); senal_OFDM_truncada=sqrt((10^(-t(r)))/p_senal)*sena l_OFDM_truncada; p_senal=(senal_OFDM_truncada'*senal_OFDM_truncada)/ length(senal_OFDM_truncada); P_senal_dBm=10*log10(p_senal)+10; PAPR=20*log10(max(abs(senal_OFDM_truncada))/mean(ab s(senal_OFDM_truncada))); %Ahora pasamos la señal OFDM por el Predistorsionad or senal_OFDM_truncada_ex=[senal_OFDM_truncada(end-Q+1 :end); senal_OFDM_truncada(1:end)]; % Introducimos las últimas muestras de la señal al principio para realizar después la Ecuació n 5.5 Xmat=matriz_mp(senal_OFDM_truncada_ex,Q,P); %Llama a la función que implementa la ecuación (4.52) Xpred=Xmat*h_pred; %Señal OFDM después de pasar por el Predistosionador %Ahora pasamos la señal predistorsionada por el Amp lificador de Potencia

Anexo I: Código de las funciones de MatLab

123

Xpred_ex=[Xpred(end-Q+1:end); Xpred(1:end)]; %Lo mismo que hemos hecho antes, extendemos para luego pasar la señal por la función que implementa la ecuación 5.5 Xpred_mat=matriz_mp(Xpred_ex,Q,P); %Función que implementa la ecuación 5.5 Salida_pa_pred=Xpred_mat*h_ampl; %Señal OFDM predistorsionada y amplificada Salida_pa_sin_pred=Xmat*h_ampl; %señal de salida del amplificador de potencia sin pasar por el Predistorsionador figure(2); plot(abs(senal_OFDM_truncada),abs(Salida_pa_pred), 'r.' ) %Relación AM/AM del conjunto DPD-PA grid on;hold on; plot(abs(senal_OFDM_truncada),abs(Salida_pa_sin_pre d), 'b.' ) %Relación AM/AM del sistema sin DPD legend( 'Con Pred' , 'Sin Pred' ) title( 'Relación AM/AM del sistema DPD-PA' ) xlabel( 'Potencia de entrada' ) ylabel( 'Potencia de salida' ) % Cálculo del espectro Rs = 3.84e6; %Tasa de símbolo fs = Rs*16; %Frecuencia de muestreo en Hz hs = spectrum.mtm(10); xpsd = psd(hs, senal_OFDM_truncada, 'Fs' , fs, 'CenterDC' , 1); ypsd = psd(hs, Salida_pa_sin_pred, 'Fs' , fs, 'CenterDC' , 1); zpsd = psd(hs, Salida_pa_pred, 'Fs' , fs, 'CenterDC' , 1); %Gráfica del espectro de las señales OFDM con predi storsión y sin predistorsión figure(3) plot(ypsd) % Espectro señal sin predistorsión hold on plot(zpsd) % Espectro señal predistorsionada hold on legend( 'Sin Predis' , 'Con Predis' ) title( 'Espectro de la señal OFDM. Q=3, K=9 Pin=-18 dBm' ) xlabel( 'Frecuencia (MHz)' ) ylabel( 'PSD (dB)' ) figure(4), plot(xpsd) %Gráfica del espectro de la señal OFDM antes del DP D y el PA. %Cálculo del ACPR de la señal con predistorsión y s in predistorsión alpha = 0.3; Ycc = 10*log10(avgpower(ypsd, [-0.5*Rs, 0.5*Rs]))+1 0; Zcc = 10*log10(avgpower(zpsd, [-0.5*Rs, 0.5*Rs]))+1 0; Yacn = 10*log10(avgpower(ypsd, [-0.5*(3+alpha)*Rs, -0.5*(1+alpha)*Rs]))+10; Zacn = 10*log10(avgpower(zpsd, [-0.5*(3+alpha)*Rs, -0.5*(1+alpha)*Rs]))+10;

Anexo I: Código de las funciones de MatLab

124

Yacp = 10*log10(avgpower(ypsd, [0.5*(1+alpha)*Rs, 0.5*(3+alpha)*Rs]))+10; Zacp = 10*log10(avgpower(zpsd, [0.5*(1+alpha)*Rs, 0.5*(3+alpha)*Rs]))+10; ACPRy = max(Yacn, Yacp) - Ycc; %ACPR señal sin predistorsión ACPRz = max(Zacn, Zacp) - Zcc; %ACPR señal con predistorsión Salida_pa_pred=Salida_pa_pred.'; Salida_pa_sin_pred=Salida_pa_sin_pred.'; %%%%Canal%%%% %Si queremos incluir un canal que introduzca un rui do blanco, aditivo y %gaussiano quitamos los comentarios siguientes. % Salida_canal_pred=canal(Salida_pa_pred); % Salida_canal_sin_pred=canal(Salida_pa_sin_pred); %%%%Receptor%%%% senal_rx_pred=receptor_OFDM(Salida_pa_pred,frca,qam 16_vector_tx,Nport,PC,Nsim_OFDM); %Le pasamos la señal predistorsionada al receptor d e OFDM senal_rx_sin_pred=receptor_OFDM(Salida_pa_sin_pred, frca,qam16_vector_tx,Nport,PC,Nsim_OFDM); %Le pasamos la señal no predistorsionada al receptor de OFDM evm_rms_pred = norm(senal_rx_pred - qam16_vector_tx)/norm(qam16_vector_tx)*100; %Calcula el evm de la señal predistorsionada evm_rms_sin_pred = norm(senal_rx_sin_pred - qam16_vector_tx)/norm(qam16_vector_tx)*100; % Calcula el evm de la señal no predistorsionada figure(5); plot(real(senal_rx_sin_pred),imag(senal_rx_sin_pred ), '.r' , 'MarkerSize',12); %Gráfica de la constelación recibida de la señal si n predistosión axis([-4,4,-4,4], 'square' ) grid on; hold on; title( 'Constelación recibida. Sin Predistorsión. Q=3, K=9 Pin=-18 dBm' ) xlabel( 'Fase' ) ylabel( 'Cuadratura' ) figure(6); plot(real(senal_rx_pred),imag(senal_rx_pred), '.r' , 'MarkerSize' ,12); %Gráfica de la constelación recibida de la señal co n predistosión axis([-4,4,-4,4], 'square' ) grid on; hold on; title( 'Constelación recibida. Con Predistorsión. Q=3, K=9 Pin=-18 dBm' ) xlabel( 'Fase' ) ylabel( 'Cuadratura' ) %Si queremos ver la señal decidida predistorsionada y sin predistorsionada

Anexo I: Código de las funciones de MatLab

125

%quitamos los comentarios siguientes % decisor_16qam(senal_rx_pred); % decisor_16qam(senal_rx_sin_pred);

function Simulacion_OFDM_bucle(xmed,ymed) %%%Esta función va a utilizar el sistema de comunic ación que trabaja con %%%una modulación OFDM y vamos hacer que tenga una Tasa de %%%Símbolo=3.84e6 y 16 muestras por símbolo. El AP y el DPD van a ser %%%diseñados a partir de las señales pasadas como p arámetros de entrada, xmed e ymed, medidas en el laboratorio par a %%%caracterizar el Amplificador Real, que es un ZHL 42W y un transistor que %%%es el que introduce las No Linealidades. Las señ ales medidas en el %%%Laboratorio son WCDMA, con Ts=3.84e6 y 16 muestr as por símbolo. En esta %%%función vamos a realizar varias simulaciones cam biando la Potencia de %%%entrada para hacer un estudio del EVM y ACPR. delay=48; %Retraso del filtro raiz de coseno alzado Nsps=16; %Número de muestras por segundo Bits_x_simQAM=4; %Número de bits por símbolo QAM Nport=1024; %Número de portadoras Nsim_OFDM=1; %Número de símbolos OFDM PC=32; %Prefijo cíclico bits=randsrc(1,Bits_x_simQAM*Nport*Nsim_OFDM,[1,0]) ; %Vector que contiene un número de bits aleatorios, 1's y 0's %%%%Transmisor%%%% [qam16_vector_tx]=Modulador_16QAM(bits); OFDM_vector=Modulador_OFDM(qam16_vector_tx,Nport,Ns im_OFDM,PC); %Ajustamos la señal OFDM para que no nos afecten lo s transitorios al %pasar por el filtro raiz de coseno alzado. OFDM_vector_ex = [OFDM_vector(end-delay+1:end),OFDM_vector,OFDM_vector(1:delay)]; %Primero extendemos la señal Fd = 1; Fs = 16; frca=rcosine(Fd,Fs, 'sqrt' ,0.22,delay); % Filtro raiz de coseno alzado OFDM_vector_sob=upsample(OFDM_vector_ex,Nsps); %Sobremuestreamos la señal a 16 muestras por símbolo senal_OFDM=conv(OFDM_vector_sob,frca); %Pasamos la señal OFDM por el filtro raiz de coseno alzado senal_OFDM_truncada= senal_OFDM(:,2*delay .* Fs/Fd + 1:end-(2*delay .*Fs/Fd)); %Al final recortamos la señal y nos quedamos con la s muestras que nos interesan senal_OFDM_truncada=senal_OFDM_truncada.'; t=[2.5,2.8,3.1,3.4,3.7,4,4.75,5.5,6.25,7]; %Este es un vector que nos sirve para ajustar la potencia de la señal OFDM

Anexo I: Código de las funciones de MatLab

126

r=1; %Índice para moverse por el vector t l=1; %Índice para elegir la Potencia de las señales medi das en el laboratorio y el índice de los vectores EVM y ACPR %Aquí empieza el bucle que me va calcular los difer entes valores del EVM y %el ACPR en función de la potencia. while (r<11 && l<11) %Caracterización del PA y el DPD Q=3; %Longitud de la memoria ord=9; %Orden de la No Linealidad P = (ord-1)/2; %Índice para el orden de la No Linealidad ymed2=ymed(:,l); %ymed2 es una columna de la matriz ymed. Cada colum na de ymed es la misma señal pero ajustada a una poten cia que va desde -10 dBm hasta -40 dBm xmed2=xmed(:,l); %Con xmed2 pasa lo mismo que con ymed2. %Coeficientes del amplificador de potencia h_ampl=calcula_coef_mp(ymed2,xmed2,Q,ord); %Cálculo de los coeficientes del Predistorsionador Go=max(abs(ymed2))/max(abs(xmed2)); %Esta es la ganancia esperada. Ecuación 5.8 ymed2_n=ymed2./Go; %Aquí ajustamos la salida real de amplificador a la ganancia esperada, como se explica en el Capítulo 5 . h_pred=calcula_coef_mp(xmed2,ymed2_n,Q,ord); %Coeficientes del predistorsinador %Ajustamos la potencia de entrada de la señal OFDM según corresponda p_senal=(senal_OFDM_truncada'*senal_OFDM_truncada)/ length(senal_OFDM_truncada); senal_OFDM_truncada=sqrt((10^(-t(r)))/p_senal)*sena l_OFDM_truncada; p_senal=(senal_OFDM_truncada'*senal_OFDM_truncada)/ length(senal_OFDM_truncada); P_senal_dBm=10*log10(p_senal)+10; PAPR=20*log10(max(abs(senal_OFDM_truncada))/mean(ab s(senal_OFDM_truncada))); %Ahora pasamos la señal OFDM por el predistorsionad or senal_OFDM_truncada_ex=[senal_OFDM_truncada(end-Q+1 :end); senal_OFDM_truncada(1:end)]; % Introducimos las últimas muestras de la señal al principio para realizar después la Ecuació n (4.52) Xmat=matriz_mp(senal_OFDM_truncada_ex,Q,P); %Llama a la función que implementa la ecuación (4.52) Xpred=Xmat*h_pred; %Señal OFDM después de pasar por el Predistosionador %Ahora pasamos la señal predistorsionada por el amp lificador de potencia

Anexo I: Código de las funciones de MatLab

127

Xpred_ex=[Xpred(end-Q+1:end); Xpred(1:end)]; %Lo mismo que hemos hecho antes, extendemos para luego pasar la señal por la función que implementa la ecuación (4.52) Xpred_mat=matriz_mp(Xpred_ex,Q,P); %Función que implementa la ecuación (4.52) Salida_pa_pred=Xpred_mat*h_ampl; %Señal OFDM predistorsionada y amplificada Salida_pa_sin_pred=Xmat*h_ampl; %señal de salida del amplificador de potencia sin pasar por el Predistorsionador % Calculamos ahora el ACPR de la señal con predisto rsión y sin % predistorsión Rs = 3.84e6; %Tasa de símbolo fs = Rs*16; % Frecuencia de muestreo en Hz hs = spectrum.mtm(10); %xpsd = psd(hs, senal_OFDM_truncada, 'Fs', fs, 'Cen terDC', 1); ypsd = psd(hs, Salida_pa_sin_pred, 'Fs' , fs, 'CenterDC' , 1); zpsd = psd(hs, Salida_pa_pred, 'Fs' , fs, 'CenterDC' , 1); alpha = 0.3; Ycc = 10*log10(avgpower(ypsd, [-0.5*Rs, 0.5*Rs]))+1 0; Zcc = 10*log10(avgpower(zpsd, [-0.5*Rs, 0.5*Rs]))+1 0; Yacn = 10*log10(avgpower(ypsd, [-0.5*(3+alpha)*Rs, -0.5*(1+alpha)*Rs]))+10; Zacn = 10*log10(avgpower(zpsd, [-0.5*(3+alpha)*Rs, -0.5*(1+alpha)*Rs]))+10; Yacp = 10*log10(avgpower(ypsd, [0.5*(1+alpha)*Rs, 0.5*(3+alpha)*Rs]))+10; Zacp = 10*log10(avgpower(zpsd, [0.5*(1+alpha)*Rs, 0.5*(3+alpha)*Rs]))+10; ACPRy(l) = max(Yacn, Yacp) - Ycc; %ACPR señal sin predistorsión ACPRz(l) = max(Zacn, Zacp) - Zcc; %ACPR señal con predistorsión Salida_pa_pred=Salida_pa_pred.'; Salida_pa_sin_pred=Salida_pa_sin_pred.'; %%%%Canal%%%% %Si queremos incluir un canal que introduzca un rui do blanco, aditivo y %gaussiano quitamos los comentarios siguientes. % Salida_canal_pred=canal(Salida_pa_pred); % Salida_canal_sin_pred=canal(Salida_PA_sin_pred); %%%%Receptor%%%% senal_rx_pred=receptor_OFDM(Salida_pa_pred,frca,qam 16_vector_tx,Nport,PC,Nsim_OFDM); %Le pasamos la señal predistorsionada al receptor d e OFDM senal_rx_sin_pred=receptor_OFDM(Salida_pa_sin_pred, frca,qam16_vector_tx,Nport,PC,Nsim_OFDM); %Le pasamos la señal no predistorsionada al receptor de OFDM

Anexo I: Código de las funciones de MatLab

128

evm_rms_pred (l)= norm(senal_rx_pred - qam16_vector_tx)/norm(qam16_vector_tx)*100; %Calcula el evm de la señal predistorsionada evm_rms_sin_pred (l)= norm(senal_rx_sin_pred - qam16_vector_tx)/norm(qam16_vector_tx)*100; % Calcula el evm de la señal no predistorsionada l=l+1; r=r+1; end %Una vez terminado el bucle, ya tenemos los datos d el EVM y ACPR en vectores. Pasamos a %representarlos en gráficas. pin_senal_med=[-10,-12,-14,-16,-18,-20,-25,-30,-35, -40]; figure(2) plot(pin_senal_med,evm_rms_sin_pred, '--rs' , 'MarkerEdgeColor' , 'k' , 'MarkerFaceColor' , 'g' , 'MarkerSize' ,10) hold on; grid on; plot(pin_senal_med,evm_rms_pred, '--bs' , 'MarkerEdgeColor' , 'k' , 'MarkerFaceColor' , 'm' , 'MarkerSize' ,10) legend( 'Sin Pred' , 'Con Pred' ) title( 'EVM en función de la potencia de entrada. K=9 y Q= 3' ) xlabel( 'Potencia de entrada (dBm)' ) ylabel( 'EVM (%)' ) figure(3) plot(pin_senal_med,ACPRy, '--rs' , 'MarkerEdgeColor' , 'k' , 'MarkerFaceColor' , 'g' , 'MarkerSize' ,10) hold on; grid on; plot(pin_senal_med,ACPRz, '--bs' , 'MarkerEdgeColor' , 'k' , 'MarkerFaceColor' , 'm' , 'MarkerSize' ,10) hold on; legend( 'Sin Pred' , 'Con Pred' ) title( 'ACPR del sistema en función de la potencia de entr ada. K=9 y Q=3' ) xlabel( 'Potencia de entrada (dBm)' ) ylabel( 'ACPR sin Predistorsión (dB)' )

function Simulacion_QPSK(xmed,ymed) %%%Esta función va a utilizar el sistema de comunic ación que trabaja con %%%una modulación QPSK y vamos hacer que tenga una Tasa de %%%Símbolo=3.84e6 y 16 muestras por símbolo. El AP y el DPD van a ser %%%diseñados a partir de las señales medidas en el laboratorio para %%%caracterizar el Amplificador Real, que es un ZHL 42W y un transistor que %%%es el que introduce las No Linealidades. Las señ ales medidas en el %%%Laboratorio son WCDMA, con Ts=3.84e6 y 16 muestr as por símbolo. %%%%Transmisor%%%% bits=randsrc(1,5000,[1,0]); %Vector que contiene un número de bits aleatorios, 1's y 0's vector_qpsk_tx=mod_qpsk(bits);

Anexo I: Código de las funciones de MatLab

129

delay=48; %Retraso del filtro raíz de coseno alzado Nsps=16; %Número de muestras por símbolo %Ajustamos la señal QPSK para que no nos afecten lo s transitorios al %pasar por el filtro raiz de coseno alzado. vector_qpsk_ex = [vector_qpsk_tx(end-delay+1:end),vector_qpsk_tx,vector_qpsk_tx(1:delay) ]; %Primero extendemos la señal Fd = 1; Fs = 16; frca=rcosine(Fd,Fs, 'sqrt' ,0.22,delay); %filtro raíz de coseno alzado vector_qpsk_sob=upsample(vector_qpsk_ex,Nsps); %%Sobremuestreamos la señal a 16 muestras por símbolo senal_QPSK=conv(vector_qpsk_sob,frca); %Pasamos la señal QPSK por el filtro raíz de coseno alzado senal_QPSK_truncada= senal_QPSK(:,2*delay .* Fs/Fd + 1:end-(2*delay .*Fs/Fd)); %Al final recortamos la señal y nos quedamos con la s muestras que nos interesan senal_QPSK_truncada=senal_QPSK_truncada.'; t=[2,2.2,2.4,2.6,2.8,3,3.5,4,4.5,5]; %Vector que nos sirve para ajustar la potencia de la señal QPSK r=4; %Índice para moverse por el vector t l=4; %Índice para elegir la Potencias medidas en el labo ratorio %Ajustamos la potencia de entrada de la señal QPSK según corresponda p_senal=(senal_QPSK_truncada'*senal_QPSK_truncada)/ length(senal_QPSK_truncada); senal_QPSK_truncada=sqrt((10^(-t(r)))/p_senal)*sena l_QPSK_truncada; p_senal=(senal_QPSK_truncada'*senal_QPSK_truncada)/ length(senal_QPSK_truncada); P_senal_dBm=10*log10(p_senal)+10; PAPR=20*log10(max(abs(senal_QPSK_truncada))/mean(ab s(senal_QPSK_truncada))); Q=3; %Longitud de la memoria ord=9; %Orden de la No Linealidad P = (ord-1)/2; %Índice para el orden de la No Linealidad ymed2=ymed(:,l); %ymed2 es una columna de la matriz ymed. Cada colum na de ymed es la misma señal pero ajustada a una poten cia que va desde -10 dBm hasta -40 dBm xmed2=xmed(:,l); %Con xmed2 pasa lo mismo que con ymed2. %Coeficientes del amplificador de potencia h_ampl=calcula_coef_mp(ymed2,xmed2,Q,ord); %Cálculo de los coeficientes del Predistorsionador Go=max(abs(ymed2))/max(abs(xmed2)); %Esta es la ganancia esperada. Ecuación 5.8 ymed2_n=ymed2./Go; %Aquí ajustamos la salida real de amplificador a la ganancia esperada, como se explica en el Capítulo 5 .

Anexo I: Código de las funciones de MatLab

130

h_pred=calcula_coef_mp(xmed2,ymed2_n,Q,ord); %Coeficientes del predistorsinador %Ahora pasamos la señal QPSK por el Predistorsionad or senal_QPSK_truncada_ex=[senal_QPSK_truncada(end-Q+1 :end); senal_QPSK_truncada(1:end)]; %Introducimos las últimas muestras de la señal al principio para realizar después la Ecuació n 5.5 Xmat=matriz_mp(senal_QPSK_truncada_ex,Q,P); %Llama a la función que implementa la ecuación 5.5 Xpred=Xmat*h_pred; %Señal QPSK después de pasar por el Predistosionador %Ahora pasamos la señal predistorsionada por el Amp lificador de Potencia Xpred_ex=[Xpred(end-Q+1:end); Xpred(1:end)]; %Lo mismo que hemos hecho antes, extendemos para luego pasar la señal por la función que implementa la ecuación (4.52) Xpred_mat=matriz_mp(Xpred_ex,Q,P); %Función que implementa la ecuación (4.52) Salida_PA_Pred=Xpred_mat*h_ampl; %Señal QPSK predistorsionada y amplificada Salida_PA_Sin_Pred=Xmat*h_ampl; %señal de salida del amplificador de potencia sin pasar por el DPD figure(2); plot(abs(senal_QPSK_truncada),abs(Salida_PA_Pred), 'r.' ) %Relación AM/AM del conjunto DPD-PA grid on;hold on; plot(abs(senal_QPSK_truncada),abs(Salida_PA_Sin_Pre d), 'b.' ) %Relación AM/AM del sistema sin DPD hold on; legend( 'Con DPD' , 'Sin DPD' ) title( 'Relación AM/AM del sistema' ) xlabel( 'Potencia de entrada' ) ylabel( 'Potencia de salida' ) % Cálculo del espectro Rs = 3.84e6; %Tasa de símbolo fs = Rs*16; %Frecuencia de muestreo en Hz hs = spectrum.mtm(10); xpsd = psd(hs, senal_QPSK_truncada, 'Fs' , fs, 'CenterDC' , 1); ypsd = psd(hs, Salida_PA_Sin_Pred, 'Fs' , fs, 'CenterDC' , 1); zpsd = psd(hs, Salida_PA_Pred, 'Fs' , fs, 'CenterDC' , 1); %Gráfica del espectro de las señales QPSK con predi storsión y sin %predistorsión figure(3) plot(ypsd) % Espectro señal sin predistorsión hold on plot(zpsd) % Espectro señal predistorsionada hold on legend( 'Sin Predis' , 'Con Predis' )

Anexo I: Código de las funciones de MatLab

131

title( 'Espectro de la señal QPSK. Q=3, K=9 Pin=-16 dBm' ) xlabel( 'Frecuencia (MHz)' ) ylabel( 'PSD (dB)' ) figure(4), plot(xpsd) %Gráfica del espectro de la señal QPSK antes del DP D y el PA. %Cálculo del ACPR de la señal con predistorsión y s in predistorsión alpha = 0.3; Ycc = 10*log10(avgpower(ypsd, [-0.5*Rs, 0.5*Rs]))+1 0; Zcc = 10*log10(avgpower(zpsd, [-0.5*Rs, 0.5*Rs]))+1 0; Yacn = 10*log10(avgpower(ypsd, [-0.5*(3+alpha)*Rs, -0.5*(1+alpha)*Rs]))+10; Zacn = 10*log10(avgpower(zpsd, [-0.5*(3+alpha)*Rs, -0.5*(1+alpha)*Rs]))+10; Yacp = 10*log10(avgpower(ypsd, [0.5*(1+alpha)*Rs, 0.5*(3+alpha)*Rs]))+10; Zacp = 10*log10(avgpower(zpsd, [0.5*(1+alpha)*Rs, 0.5*(3+alpha)*Rs]))+10; ACPRy = max(Yacn, Yacp) - Ycc; %ACPR señal sin predistorsión ACPRz = max(Zacn, Zacp) - Zcc; %ACPR señal con predistorsión Salida_PA_Pred=Salida_PA_Pred.'; Salida_PA_Sin_Pred=Salida_PA_Sin_Pred.'; %%%%Canal%%%% %Si queremos incluir un canal que introduzca un rui do blanco, aditivo y %gaussiano quitamos los comentarios siguientes. % Salida_canal_pred=canal(Salida_PA_Pred); % Salida_canal_sin_pred=canal(Salida_PA_Sin_Pred); %%%%Receptor%%%% senal_rx_pred=receptor_qpsk(Salida_PA_Pred,frca,vec tor_qpsk_tx); %Le pasamos la señal predistorsionada al receptor de QP SK senal_rx_sin_pred=receptor_qpsk(Salida_PA_Sin_Pred, frca,vector_qpsk_tx); %Le pasamos la señal no predistorsionada al recepto r de QPSK evm_rms_pred = norm(senal_rx_pred - vector_qpsk_tx)/norm(vector_qpsk_tx)*100; %Calcula el evm de la señal predistorsionada evm_rms_sin_pred = norm(senal_rx_sin_pred - vector_qpsk_tx)/norm(vector_qpsk_tx)*100; % Calcula el evm de la señal no predistorsionada figure(5); plot(real(senal_rx_pred),imag(senal_rx_pred), '.r' , 'MarkerSize' ,15); axis([-2,2,-2,2], 'square' ) grid on; hold on; title( 'Constelación recibida. Con Predistorsión. Q=0, K=9 Pin=-16 dBm' ) xlabel( 'Fase' ) ylabel( 'Cuadratura' )

Anexo I: Código de las funciones de MatLab

132

figure(6); plot(real(senal_rx_sin_pred),imag(senal_rx_sin_pred ), '.r' , 'MarkerSize',15); axis([-2,2,-2,2], 'square' ) grid on; hold on; title( 'Constelación recibida. Sin Predistorsión. Q=0, K=9 Pin=-16 dBm' ) xlabel( 'Fase' ) ylabel( 'Cuadratura' ) %Si queremos ver la señal decidida predistorsionada y sin predistorsionada %quitamos los comentarios siguientes % decisor_qpsk(senal_rx_pred); % decisor_qpsk(senal_rx_sin_pred);

function Simulacion_QPSK_bucle(xmed,ymed) %%%Esta función va a utilizar el esquema de la func ión "Main_qpsk" y va %%%realizar un bucle para obtener diferentes valore s de EVM y ACPR según se %%%utilice una potencia u otra. bits=randsrc(1,2500,[1,0]); %Vector que contiene un número de bits aleatorios, 1's y 0's vector_qpsk_tx=mod_qpsk(bits); delay=48; %Retraso del filtro raíz de coseno alzado Nsps=16; %Número de muestras por símbolo %Ajustamos la señal QPSK para que no nos afecten lo s transitorios al %pasar por el filtro raiz de coseno alzado. vector_qpsk_ex = [vector_qpsk_tx(end-delay+1:end),vector_qpsk_tx,vector_qpsk_tx(1:delay) ]; %Primero extendemos la señal Fd = 1; Fs = 16; frca=rcosine(Fd,Fs, 'sqrt' ,0.22,delay); %filtro raíz de coseno alzado vector_qpsk_sob=upsample(vector_qpsk_ex,Nsps); %%Sobremuestreamos la señal a 16 muestras por símbolo senal_QPSK=conv(vector_qpsk_sob,frca); %Pasamos la señal QPSK por el filtro raíz de coseno alzado senal_QPSK_truncada= senal_QPSK(:,2*delay .* Fs/Fd + 1:end-(2*delay .*Fs/Fd)); %Al final recortamos la señal y nos quedamos con la s muestras que nos interesan senal_QPSK_truncada=senal_QPSK_truncada.'; t=[2,2.2,2.4,2.6,2.8,3,3.5,4,4.5,5]; %Vector que nos sirve para ajustar la potencia de la señal QPSK r=1; %Índice para moverse por el vector t l=1; %Índice para elegir la Potencias medidas en el labo ratorio %Aquí empieza el bucle que me va calcular los difer entes valores del EVM y %el ACPR en función de la potencia.

Anexo I: Código de las funciones de MatLab

133

while (r<11 && l<11) %Ajustamos la potencia de entrada al AP de la señal OFDM según corresponda p_senal=(senal_QPSK_truncada'*senal_QPSK_truncada)/ length(senal_QPSK_truncada); senal_QPSK_truncada=sqrt((10^(-t(r)))/p_senal)*sena l_QPSK_truncada; p_senal=(senal_QPSK_truncada'*senal_QPSK_truncada)/ length(senal_QPSK_truncada); P_senal_dBm=10*log10(p_senal)+10; PAPR=20*log10(max(abs(senal_QPSK_truncada))/mean(ab s(senal_QPSK_truncada))); %Caracterización del PA y el DPD Q=3; %Longitud de la memoria ord=9; %Orden de la No Linealidad P = (ord-1)/2; %Índice para el orden de la No Linealidad ymed2=ymed(:,l); %ymed2 es una columna de la matriz ymed. Cada colum na de ymed es la misma señal pero ajustada a una poten cia que va desde -10 dBm hasta -40 dBm xmed2=xmed(:,l); %Con xmed2 pasa lo mismo que con ymed2. %Coeficientes del amplificador de potencia h_ampl=calcula_coef_mp(ymed2,xmed2,Q,ord); %Cálculo de los coeficientes del Predistorsionador Go=max(abs(ymed2))/max(abs(xmed2)); %Esta es la ganancia esperada. Ecuación 5.8 ymed2_n=ymed2./Go; %Aquí ajustamos la salida real de amplificador a la ganancia esperada, como se explica en el Capítulo 5 . h_pred=calcula_coef_mp(xmed2,ymed2_n,Q,ord); %Coeficientes del predistorsinador %Ahora pasamos la señal QPSK por el Predistorsionad or senal_QPSK_truncada_ex=[senal_QPSK_truncada(end-Q+1 :end); senal_QPSK_truncada(1:end)]; %Introducimos las últimas muestras de la señal al principio para realizar después la Ecuació n (4.52) Xmat=matriz_mp(senal_QPSK_truncada_ex,Q,P); %Llama a la función que implementa la ecuación (4.52) Xpred=Xmat*h_pred; %Señal QPSK después de pasar por el Predistosionador %Ahora pasamos la señal predistorsionada por el Amp lificador de Potencia Xpred_ex=[Xpred(end-Q+1:end); Xpred(1:end)]; %Lo mismo que hemos hecho antes, extendemos para luego pasar la señal por la función que implementa la ecuación 5.5 Xpred_mat=matriz_mp(Xpred_ex,Q,P); %Función que implementa la ecuación 5.5

Anexo I: Código de las funciones de MatLab

134

Salida_PA_Pred=Xpred_mat*h_ampl; %Señal QPSK predistorsionada y amplificada Salida_PA_Sin_Pred=Xmat*h_ampl; %señal de salida del amplificador de potencia sin pasar por el DPD %Calculamos ahora el ACPR de la señal con predistor sión y sin predistorsión Rs = 3.84e6; %Tasa de símbolo fs = Rs*16; %Frecuencia de muestreo en Hz hs = spectrum.mtm(10); xpsd = psd(hs, senal_QPSK_truncada, 'Fs' , fs, 'CenterDC' , 1); ypsd = psd(hs, Salida_PA_Sin_Pred, 'Fs' , fs, 'CenterDC' , 1); zpsd = psd(hs, Salida_PA_Pred, 'Fs' , fs, 'CenterDC' , 1); alpha = 0.3; Ycc = 10*log10(avgpower(ypsd, [-0.5*Rs, 0.5*Rs]))+1 0; Zcc = 10*log10(avgpower(zpsd, [-0.5*Rs, 0.5*Rs]))+1 0; Yacn = 10*log10(avgpower(ypsd, [-0.5*(3+alpha)*Rs, -0.5*(1+alpha)*Rs]))+10; Zacn = 10*log10(avgpower(zpsd, [-0.5*(3+alpha)*Rs, -0.5*(1+alpha)*Rs]))+10; Yacp = 10*log10(avgpower(ypsd, [0.5*(1+alpha)*Rs, 0.5*(3+alpha)*Rs]))+10; Zacp = 10*log10(avgpower(zpsd, [0.5*(1+alpha)*Rs, 0.5*(3+alpha)*Rs]))+10; ACPRy(l) = max(Yacn, Yacp) - Ycc; %ACPR señal sin predistorsión ACPRz(l) = max(Zacn, Zacp) - Zcc; %ACPR señal con predistorsión Salida_PA_Pred=Salida_PA_Pred.'; Salida_PA_Sin_Pred=Salida_PA_Sin_Pred.'; %%%%Canal%%%% %Si queremos incluir un canal que introduzca un rui do blanco, aditivo y %gaussiano quitamos los comentarios siguientes. % Salida_canal_pred=canal(Salida_PA_Pred); % Salida_canal_sin_pred=canal(Salida_PA_Sin_Pred); %%%%Receptor%%%% senal_rx_pred=receptor_qpsk(Salida_PA_Pred,frca,vec tor_qpsk_tx); %Le pasamos la señal predistorsionada al receptor de QP SK senal_rx_sin_pred=receptor_qpsk(Salida_PA_Sin_Pred, frca,vector_qpsk_tx); %Le pasamos la señal no predistorsionada al recepto r de QPSK evm_rms_pred(l) = norm(senal_rx_pred - vector_qpsk_tx)/norm(vector_qpsk_tx)*100; %Calcula el evm de la señal predistorsionada evm_rms_sin_pred(l) = norm(senal_rx_sin_pred - vector_qpsk_tx)/norm(vector_qpsk_tx)*100; %Calcula el evm de la señal no predistorsionada l=l+1;

Anexo I: Código de las funciones de MatLab

135

r=r+1; end %Una vez terminado el bucle, ya tenemos los datos d el EVM y ACPR en vectores. Pasamos a %representarlos en gráficas. pin_senal_med=[-10,-12,-14,-16,-18,-20,-25,-30,-35, -40]; figure(2) plot(pin_senal_med,evm_rms_sin_pred, '--rs' , 'MarkerEdgeColor' , 'k' , 'MarkerFaceColor' , 'g' , 'MarkerSize' ,10) hold on; grid on; plot(pin_senal_med,evm_rms_pred, '--bs' , 'MarkerEdgeColor' , 'k' , 'MarkerFaceColor' , 'm' , 'MarkerSize' ,10) hold on; axis([-41,-9,0,3.5], 'square' ) legend( 'Sin Pred' , 'Con Pred' ) title( 'EVM en función de la potencia de entrada. K=9 y Q= 0' ) xlabel( 'Potencia de entrada (dBm)' ) ylabel( 'EVM (%)' ) figure(3) plot(pin_senal_med,ACPRy, '--bs' , 'MarkerEdgeColor' , 'k' , 'MarkerFaceColor' , 'g' , 'MarkerSize' ,10) hold on; grid on; plot(pin_senal_med,ACPRz, '--bs' , 'MarkerEdgeColor' , 'k' , 'MarkerFaceColor' , 'm' , 'MarkerSize' ,10) hold on; legend( 'Sin Pred' , 'Con Pred' ) title( 'ACPR del sistema en función de la potencia de entr ada. K=9 y Q=0' ) xlabel( 'Potencia de entrada (dBm)' ) ylabel( 'ACPR sin Predistorsión (dB)' )