Tabla 8. Modelos de canal disponibles COST 207, extraído de [11].
Modelo de canal Descripción
cost207RAx4 Rural Area (RAx), 4 taps
cost207RAx6 Rural Area (RAx), 6 taps
cost207TUx6 Typical Urban (TUx), 6 taps
cost207TUx6alt Typical Urban (TUx), 6 taps, alternative
cost207TUx12 Typical Urban (TUx), 12 taps
cost207TUx12alt Typical Urban (TUx), 12 taps, alternative
cost207BUx6 Bad Urban (BUx), 6 taps
cost207BUx6alt Bad Urban (BUx), 6 taps, alternative
cost207BUx12 Bad Urban (BUx), 12 taps
cost207BUx12alt Bad Urban (BUx), 12 taps, alternative
cost207HTx6 Hilly Terrain (HTx), 6 taps
cost207HTx6alt Hilly Terrain (HTx), 6 taps, alternative
cost207HTx12 Hilly Terrain (HTx), 12 taps
cost207HTx12alt Hilly Terrain (HTx), 12 taps, alternative
Tabla 9. Modelos de canal disponibles GSM/EDGE, extraído de [11].
Modelo de canal Descripción
gsmRAx6c1 Typical case for rural area (RAx), 6 taps, case 1
Estimación de canal de radio para sistemas
MIMO-OFDM 45
gsmHTx12c1 Typical case for hilly terrain (HTx), 12 taps, case 1gsmHTx12c2 Typical case for hilly terrain (HTx), 12 taps, case 2
gsmHTx6c1 Typical case for hilly terrain (HTx), 6 taps, case 1
gsmHTx6c2 Typical case for hilly terrain (HTx), 6 taps, case 2
gsmTUx12c1 Typical case for urban area (TUx), 12 taps, case 1
gsmTUx12c1 Typical case for urban area (TUx), 12 taps, case 2
gsmTUx6c1 Typical case for urban area (TUx), 6 taps, case 1
gsmTUx6c2 Typical case for urban area (TUx), 6 taps, case 2
gsmEQx6 Profile for equalization test (EQx), 6 taps
gsmTIx2 Typical case for very small cells (TIx), 2 taps
Tabla 10. Modelos de canal disponibles 3GPP Deployment Evaluation, extraído de [11].
Modelo de canal Descripción
3gppTUx Typical Urban channel model (TUx)
3gppRAx Rural Area channel model (RAx)
3gppHTx Hilly Terrain channel model (HTx)
Tabla 11. Modelos de canal disponibles ITU-R 3G, extraído de [11].
Modelo de canal Descripción
itur3GIAx Indoor office, channel A
itur3GIBx Indoor office, channel B
itur3GPAx Outdoor to indoor and pedestrian, channel A
itur3GPBx Outdoor to indoor and pedestrian, channel B
itur3GVAx Vehicular - high antenna, channel A
itur3GVBx Vehicular - high antenna, channel B
itur3GSAxLOS Satellite, channel A, LOS
itur3GSAxNLOS Satellite, channel A, NLOS
itur3GSBxLOS Satellite, channel B, LOS
itur3GSBxNLOS Satellite, channel B, NLOS
itur3GSCxLOS Satellite, channel C, LOS
itur3GSCxNLOS Satellite, channel C, NLOS
Tabla 12. Modelos de canal disponibles ITU-R HF, extraído de [11].
Modelo de canal Descripción
iturHFLQ Low latitudes, Quiet conditions
iturHFLM Low latitudes, Moderate conditions
iturHFLD Low latitudes, Disturbed conditions
iturHFMQ Medium latitudes, Quiet conditions
iturHFMM Medium latitudes, Moderate conditions
iturHFMD Medium latitudes, Disturbed conditions
iturHFMDV Medium latitudes, Disturbed conditions near vertical incidence
iturHFHQ High latitudes, Quiet conditions
iturHFHM High latitudes, Moderate conditions
Estimación de canal de radio para sistemas
MIMO-OFDM 46
Tabla 13. Modelos de canal disponibles JTC, extraído de [11].
Modelo de canal Descripción
jtcInResA Indoor residential A
jtcInResB Indoor residential B
jtcInResC Indoor residential C
jtcInOffA Indoor office A
jtcInOffB Indoor office B
jtcInOffC Indoor office C
jtcInComA Indoor commercial A
jtcInComB Indoor commercial B
jtcInComC Indoor commercial C
jtcOutUrbHRLAA Outdoor urban high-rise areas - Low antenna A
jtcOutUrbHRLAB Outdoor urban high-rise areas - Low antenna B
jtcOutUrbHRLAC Outdoor urban high-rise areas - Low antenna C
jtcOutUrbLRLAA Outdoor urban low-rise areas - Low antenna A
jtcOutUrbLRLAB Outdoor urban low-rise areas - Low antenna B
jtcOutUrbLRLAC Outdoor urban low-rise areas - Low antenna C
jtcOutResLAA Outdoor residential areas - Low antenna A
jtcOutResLAB Outdoor residential areas - Low antenna B
jtcOutResLAC Outdoor residential areas - Low antenna C
jtcOutUrbHRHAA Outdoor urban high-rise areas - High antenna A
jtcOutUrbHRHAB Outdoor urban high-rise areas - High antenna B
jtcOutUrbHRHAC Outdoor urban high-rise areas - High antenna C
jtcOutUrbLRHAA Outdoor urban low-rise areas - High antenna A
jtcOutUrbLRHAB Outdoor urban low-rise areas - High antenna B
jtcOutUrbLRHAC Outdoor urban low-rise areas - High antenna C
jtcOutResHAA Outdoor residential areas - High antenna A
jtcOutResHAB Outdoor residential areas - High antenna B
jtcOutResHAC Outdoor residential areas - High antenna C
Tabla 14. Modelos de canal disponibles HIPERLAN/2, extraído de [11].
Channel model Profile
hiperlan2A Model A
hiperlan2B Model B
hiperlan2C Model C
hiperlan2D Model D
hiperlan2E Model E
Tabla 15. Modelos de canal disponibles 802.11 a/b/g, extraído de [11].
Channel model
802.11a 802.11b 802.11g
Estimación de canal de radio para sistemas
MIMO-OFDM 47
Tabla 16. Perfil EPA 5Hz modelo MIMO-LTE, extraído de [12].
Extended Pedestrian A (EPA)
Trayecto Doppler (Hz) Retardo [ns] Pérdida relativa [dB] 1 5 0 0.0 2 5 30 1.0 3 5 70 2.0 4 5 90 3.0 5 5 110 8.0 6 5 190 17.2 7 5 410 20.8
Tabla 17. Perfil EVA 70Hz modelo MIMO-LTE, extraído de [12].
Extended Vehicular A (EVA)
Trayecto Doppler (Hz) Retardo [ns] Pérdida relativa [dB] 1 70 0 0.0 2 70 30 1.5 3 70 150 1.4 4 70 310 3.6 5 70 370 0.6 6 70 710 9.1 7 70 1090 7.0 8 70 1730 12.0 9 70 2510 16.9
Tabla 18. Perfil ETU 300Hz modelo MIMO-LTE, extraído de [12].
Extended Typical Urban (ETU)
Trayecto Doppler (Hz) Retardo [ns] Pérdida relativa [dB] 1 300 0 1.0 2 300 50 1.0 3 300 120 1.0 4 300 200 0.0 5 300 230 0.0 6 300 500 0.0 7 300 1600 3.0 8 300 2300 5.0 9 300 5000 7.0
Simulación de estimación de canal para MIMO-OFDM
La función se encarga de realizar la simulación transmisor-canal-receptor de un sistema de comunicaciones MIMO-OFDM. Para esto, realiza la estimación de diferentes modelos de canal de radio disponibles en Matlab entre los que se encuentran Rayleigh, COST 207, GSM/EDGE, 3GPP, entre otros. Para más información escriba Help Tesis en la ventana de comandos de Maltab.
La función recibe:
* modelo: un string con el nombre del modelo de canal a utilizar (Rayleigh, Estandarizados o MIMO-LTE). * parametrosModelo: una estructura con diferentes carácteristicas del modelo a utilizar.
* tiempoSimulacion: el tiempo de simulación en slots.
* SNRoEsN0: un string indicando si el eje x de simulación corresponde a SNR o EsN0. * inicio: el valor de inicio en eje x de simulación.
* paso: el valor del paso en eje x de simulación. * fin: el valor de terminación en eje x de simulación. * tamanoConstelacion: el tamaño de la constelación QAM a usar.
* numeroRepeticiones: el número de repeticiones a realizar para el cálculo de la tasa de error de bit y error medio cuadrático de estimación. * metodosInterpolación: un cell con los string de los métodos de interpolación a usar en la estimación.
* cuadrículaEstimación: una matriz multidimensional binaria con cada página representando la distribución de símbolos piloto para cada canal
independiente de comunicaciones (para el caso de MIMO). El valor '1' indica un RE de símbolo piloto, el valor '0' indica un RE para información de usuario. Las salidas de la función son:
* SNR: un vector con el eje x de simulación para BER y error medio cuadrático. * EsN0: un vector con el eje x de simulación para BER y error medio cuadrático.
* error: una matriz con las filas representando cada uno de los valores de eje x de simulación (SNR o Es/N0) y las columnas representando el BER a partir de cada método de interpolación.
* errorTeo: un vector con el BER a partir de la función de transferencia provista por el modelo de canal de Matlab.
* SET: una matriz multidimensional con las filas representando cada uno de los valores del eje x de simulación (SNR o Es/N0), las columnas respresentando el error medio cuadrático en magnitud y fase (primera y segunda columna respectivamente) y las páginas representando cada uno de los diferentes métodos de interpolación.
* f,t: los vectores de frecuencia y tiempo para el graficado de la función de transferencia variante en el tiempo.
* CTFs: un cell de matrices en donde cada matriz corresponde a la función de transferencia estimada variante en el tiempo para una simulación completa. Las filas del cell representan canales independientes (para sistemas MIMO) y las columnas del cell representan diferentes métodos de interpolación para la estimación.
* Gs: una matriz con la función de transferencia provista por matlab variante en el tiempo. * mas: una estructura con datos adicionales acerca de la simulación.
Juan Carlos Bucheli García
Proyecto de grado para optar al título de ingeniero electrónico. Mayo de 2014
Contents
Encabezado de la función
Creado ventana tiempo restante e inicialización temporizador de simulación. Asignación de parámetros según modelo de canal seleccionado Inicialización de variables según parámetros LTE
Inicializacion de otras variables
Generación y modulación de datos de usuario y piloto Inicialización de variables de simulación
Ciclo principal - variación sobre repetición
Actualización del tiempo de iteración y actualización de barra de progreso. Creación de los modelos de canal
Ciclo secundario - variación sobre SNR actualización de barra de progreso.
Reinicialización de variables requeridas por el siguiente ciclo anidado Ciclo tercerario - variación sobre periodo de símbolo
Cálculo de tiempo restante y actualización de la barra de progreso Ciclo cuaternario - modulación para cada canal independiente Cálculo de cantidad de datos usuario y piloto
Generación de la señal para el periodo de símbolo actual Adición del prefijo cíclico
Ciclo cuaternario - el efecto del canal sobre cada canal independiente Adición de ruido AWGN
Ciclo cuaternario - diferentes métodos de interpolación Ciclo quinario - demodulación sobre cada canal independiente Selección del canal con mayor potencia
Demodulación de los símbolos transmitidos Estimación de canal
Ecualización en frecuencia
Ciclo terceario - cálculo de BER para diferentes metodos de interpolación Corrección de variables para exportación
Cálculo de detalles de la transmisión actual
function [ SNR, EsN0, error, errorTeo, SET, f, t, CTFs, Gs, mas ] = simular(modelo, parametrosModelo, tiempoSimulacion, SNRoEsN0, inicio, paso,...
fin, tamanoConstelacion, numeroRepeticiones, metodosInterpolacion, cuadriculaEstimacion )
Creado ventana tiempo restante e inicialización temporizador de simulación.
Se muestra la ventana de tiempo restante e inicializa variable tinicial para poder acceder posteriormente al tiempo de simulación total.
tinicial = tic;
Hw = waitbar(0,'Inicializando variables...','name','Simulación en proceso');
Asignación de parámetros según modelo de canal seleccionado
Se asignan diferentes parámetros requeridos por los modelos de canal de Matlab según el modelo seleccionado y a partir de parametrosModelo
if(strcmp(modelo,'MIMO-LTE')) perfil = parametrosModelo.perfil; configuracionAntenas = parametrosModelo.configuracionAntenas; correlacion = parametrosModelo.correlacion; antenasTransmision = str2double(configuracionAntenas(1)); antenasRecepcion = str2double(configuracionAntenas(3));
elseif(strcmp(modelo,'Rayleigh'))
frecuenciaDoppler = parametrosModelo.frecuenciaDoppler; atenuacionMaxima = parametrosModelo.atenuacionMaxima; tiempoTrayectoMaximo = parametrosModelo.tiempoTrayectoMaximo/100; numeroTrayectos = parametrosModelo.numeroTrayectos; antenasTransmision = 1; antenasRecepcion = 1;
elseif(strcmp(modelo,'Estandarizados'))
frecuenciaDoppler = parametrosModelo.frecuenciaDoppler; perfil = parametrosModelo.perfil; tRMS = parametrosModelo.tRMS; antenasTransmision = 1; antenasRecepcion = 1; end; canalesIndependientes = min(antenasTransmision,antenasRecepcion); numeroSlotsASimular = tiempoSimulacion; pruebas = numeroRepeticiones; if(strcmp(modelo,'Rayleigh')) retardos = longitudCP*(1/frecuenciaMuestreo)*tiempoTrayectoMaximo*rand(1,numeroTrayectos); ganancias = -1*atenuacionMaxima*retardos./(longitudCP*(1/frecuenciaMuestreo)*0.8); end;
Inicialización de variables según parámetros LTE
Se inicializan parámetros del sistema transmisor-receptor estandizados por LTE.
frecuenciaMuestreo = 30.72e6; longitudUtil = round(66.667e-6*frecuenciaMuestreo); longitudCP = round(4.7e-6*frecuenciaMuestreo); periodosDeSimbolosPorSlot = 7; slot = 0.5e-3; BW = 20e6; df = 15e3; numeroSubportadoras = ceil(BW/df); RBs = ceil(numeroSubportadoras/12); BW = RBs*12*df; numeroSubportadoras = BW/df;
Inicializacion de otras variables
Se inicializan otras variables requeridas para la simulación.
numeroPilotosPorPeriodo = sum(cuadriculaEstimacion,1)*RBs; esPeriodoEstimacion = numeroPilotosPorPeriodo>0; numeroPilotosPorRB = sum(numeroPilotosPorPeriodo,2); numeroPilotosPorRB = numeroPilotosPorRB(1); medidas = inicio:paso:fin; if(strcmp(SNRoEsN0,'SNR')) SNR = medidas; EsN0 = SNR + 10*log10(frecuenciaMuestreo/df); else EsN0 = medidas; SNR = EsN0 - 10*log10(frecuenciaMuestreo/df); end;
Generación y modulación de datos de usuario y piloto
datosPorSlot = periodosDeSimbolosPorSlot*numeroSubportadoras-numeroPilotosPorRB; datosEnviados = round(rand(datosPorSlot*numeroSlotsASimular*canalesIndependientes,log2(tamanoConstelacion))); if(~isempty(datosEnviados)) datosUsuario = qammod(bin2dec(num2str(datosEnviados)),tamanoConstelacion); else datosUsuario = []; end;
HG = comm.GoldSequence('SamplesPerFrame',numeroPilotosPorRB*numeroSlotsASimular*log2(tamanoConstelacion)*canalesIndependientes);
pilotos = qammod(bin2dec(num2str(reshape(step(HG),numeroPilotosPorRB*numeroSlotsASimular*canalesIndependientes,log2(tamanoConstelacion)))),tamanoConstel acion);
Inicialización de variables de simulación
Se inicializan variables usadas por el algorimo para no requerir modificar la dimensión de éstas a lo largo de la simulación y así mejorar el rendimiento de la misma.
senal = zeros(longitudUtil+longitudCP,antenasTransmision); senalRecibida = zeros(longitudUtil+longitudCP,antenasRecepcion); error = zeros(length(EsN0),size(metodosInterpolacion,1)); errorTeo = zeros(length(EsN0),1); SE = zeros(length(EsN0),2,size(metodosInterpolacion,1)); SET = zeros(length(EsN0),2,size(metodosInterpolacion,1)); ultimo = 0;
Ciclo principal - variación sobre repetición
Corresponde al ciclo que itera sobre el número de repetición actual.
for intento = 1:pruebas;
Actualización del tiempo de iteración y actualización de barra de progreso.
marca = tic;
progreso = (intento-1)/pruebas; waitbar(progreso,Hw);
set(Hw,'Name',['Total transcurrido: ',num2str(progreso*100,'%01.0f'),'%']);
Creación de los modelos de canal
Se crea el objeto H que representa el modelo de canal seleccionado para la simulación.
if(strcmp(modelo,'MIMO-LTE'))
H = comm.LTEMIMOChannel('SampleRate',frecuenciaMuestreo,'Profile',perfil,'AntennaConfiguration',configuracionAntenas,'CorrelationLevel',correlac ion,'NormalizePathGains',true);
if(antenasTransmision ~=1) H.AntennaSelection='Tx'; end;
elseif(strcmp(modelo,'Rayleigh'))
H = rayleighchan(1/frecuenciaMuestreo,frecuenciaDoppler,retardos,ganancias); H.ResetBeforeFiltering=0;
elseif(strcmp(modelo,'Estandarizados'))
try
H = stdchan(1/frecuenciaMuestreo,frecuenciaDoppler,perfil,tRMS); H.ResetBeforeFiltering=0;
catch ME
if(strcmp(ME.message,'STDCHAN requires three input arguments.')) H = stdchan(1/frecuenciaMuestreo,frecuenciaDoppler,perfil); H.ResetBeforeFiltering=0;
else
msgbox(ME.message,'Error','error'); end;
end; end;
Ciclo secundario - variación sobre SNR
Se encarga de iterar sobre el valor actual de relación señal a ruido.
for rel = 1:length(EsN0)
actualización de barra de progreso.
progreso =((intento-1)*length(EsN0)+rel-1)/(length(EsN0)*pruebas); waitbar(progreso,Hw);
set(Hw,'Name',['Total transcurrido: ',num2str(progreso*100,'%01.0f'),'%']);
Reinicialización de variables requeridas por el siguiente ciclo anidado
actualDatos = 0; actualPilotos = 0; limiteDatos = 0; limitePilotos = 0; CTFs = cell(canalesIndependientes,size(metodosInterpolacion,1)); pilotosTemp = cell(canalesIndependientes,1); Gs = []; datosRecibidos = cell(size(metodosInterpolacion,1),1); datosRecibidosTeo = [];
Ciclo tercerario - variación sobre periodo de símbolo
se encarga de iterar sobre cada periodo de símbolo de simulación para la repetición indicada por intento y el SNR indicado por rel
for s = 1:numeroSlotsASimular*periodosDeSimbolosPorSlot
Cálculo de tiempo restante y actualización de la barra de progreso
realizacionesRestantes = (numeroSlotsASimular*periodosDeSimbolosPorSlot-s)+(length(EsN0)-rel)*numeroSlotsASimular*periodosDeSimbolosPorSlot+ (pruebas-intento)*length(EsN0)*numeroSlotsASimular*periodosDeSimbolosPorSlot;
realizaciones = numeroSlotsASimular*periodosDeSimbolosPorSlot*length(EsN0)*pruebas - realizacionesRestantes; ultimo = (ultimo*(realizaciones-1) + toc(marca))/realizaciones;
marca = tic; tiempoRestante = (realizacionesRestantes)*ultimo; minutosRestantes = floor(tiempoRestante/60); segundosRestantes = floor((tiempoRestante/60-minutosRestantes)*60); progreso = ((intento-1)*length(EsN0)*numeroSlotsASimular*periodosDeSimbolosPorSlot+(rel-1)*numeroSlotsASimular*periodosDeSimbolosPorSlot+(s- 1))/(length(EsN0)*numeroSlotsASimular*periodosDeSimbolosPorSlot*pruebas);
set(Hw,'Name',['Total transcurrido: ',num2str(progreso*100,'%01.0f'),'%']);
waitbar(progreso,Hw,['Tiempo restante: ',num2str(minutosRestantes,'%01.0f'), ' min, ',num2str(segundosRestantes,'%01.0f'), ' seg.']);
Ciclo cuaternario - modulación para cada canal independiente
Se encarga de generar la señal de un periodo de símbolo para todos los canales independientes ( >1 para sistemas MIMO)
for ant = 1:canalesIndependientes
Cálculo de cantidad de datos usuario y piloto
Según la distribución de símbolos piloto y el periodo de símbolo actual, calcula el número de datos de usuario y/o símbolos piloto requeridos.
if(~esPeriodoEstimacion(1,mod(s-1,7)+1,ant)) if(actualDatos+numeroSubportadoras > length(datosUsuario)) limiteDatos = length(datosUsuario); else limiteDatos = actualDatos+numeroSubportadoras; end; datosTemp = datosUsuario(actualDatos+1:limiteDatos); actualDatos = limiteDatos; else if(actualDatos+numeroSubportadoras-numeroPilotosPorPeriodo(1,mod(s-1,7)+1,ant) > length(datosUsuario)) limiteDatos = length(datosUsuario); else limiteDatos = actualDatos+numeroSubportadoras-numeroPilotosPorPeriodo(1,mod(s-1,7)+1,ant); end; if(actualPilotos+numeroPilotosPorPeriodo(1,mod(s-1,7)+1,ant) > length(pilotos)) limitePilotos = length(pilotos); else limitePilotos = actualPilotos+numeroPilotosPorPeriodo(1,mod(s-1,7)+1,ant); end; pilotosTemp{ant} = pilotos(actualPilotos+1:limitePilotos); [datosTemp,~] = agregarRemoverPilotos(true,cuadriculaEstimacion(:,mod(s-1,7)+1,ant),datosUsuario(actualDatos+1:limiteDatos),pilotosT emp{ant}); actualDatos = limiteDatos; actualPilotos = limitePilotos; end;
Generación de la señal para el periodo de símbolo actual
A partir de la transformada discreta inversa de Fourier, se genera la representación temporal de los datos de usuario y/o piloto a transmitir.
senal(longitudCP+1:end,(ant-1)*antenasTransmision/canalesIndependientes+1:ant*antenasTransmision/canalesIndependientes) = ifft(DesCentra rConCeros(longitudUtil,datosTemp,'Centrar'))*ones(1,antenasTransmision/canalesIndependientes);
Adición del prefijo cíclico
senal(1:longitudCP,(ant-1)*antenasTransmision/canalesIndependientes+1:ant*antenasTransmision/canalesIndependientes) = senal(end-longitud CP+1:end,(ant-1)*antenasTransmision/canalesIndependientes+1:ant*antenasTransmision/canalesIndependientes);
end;
Ciclo cuaternario - el efecto del canal sobre cada canal independiente
Se encarga de obtener la respuesta del canal ante la señal anteriormente generada.
abcd = eye(canalesIndependientes); for ant = 1:canalesIndependientes
if(antenasTransmision>canalesIndependientes) actual(1:2:2*length(abcd))=abcd(ant,:); actual(2:2:2*length(abcd))=abcd(ant,:); else actual = abcd(ant,:); end; if(strcmp(modelo,'MIMO-LTE')) if(antenasTransmision ~=1) tempo = step(H,senal(:,(ant-1)*antenasTransmision/canalesIndependientes+1:ant*antenasTransmision/canalesIndependientes),actual); else tempo = step(H,senal(:,(ant-1)*antenasTransmision/canalesIndependientes+1:ant*antenasTransmision/canalesIndependientes)); end; senalRecibida(:,(ant-1)*antenasRecepcion/canalesIndependientes+1:ant*antenasRecepcion/canalesIndependientes)=tempo(:,(ant-1)*antenas Recepcion/canalesIndependientes+1:ant*antenasRecepcion/canalesIndependientes); else senalRecibida = filter(H,senal); end; end;
Adición de ruido AWGN
senalRecibida= awgn(senalRecibida,SNR(rel),'measured',1);
Ciclo cuaternario - diferentes métodos de interpolación
Se encarga de iterar sobre los diferentes métodos de interpolación.
for metodo = 1:size(metodosInterpolacion,1)
Ciclo quinario - demodulación sobre cada canal independiente
Se encarga de realizar la estimación de canal, interpolación y demodulación de los datos de usuario para cada canal independiente.
for ant = 1:canalesIndependientes
Selección del canal con mayor potencia
En caso de existir diversidad espacial en el receptor, se selecciona la antena que tenga una señal asociada con una potencia mayor.
datosRecibidosTemp = senalRecibida(longitudCP+1:end,(ant-1)*antenasRecepcion/canalesIndependientes+1:ant*antenasRecepcion/canalesInd ependientes); if(antenasRecepcion>antenasTransmision) [~,imaximo] = max(sum((abs(datosRecibidosTemp)).^2,1)); else imaximo = 1; end;
Demodulación de los símbolos transmitidos
A partir de la transformada discreta de Fourier, se obtiene de nuevo la representación de los símbolos luego de ser transmitidos por el canal seleccionado.
datosRecibidosTemp = fft(datosRecibidosTemp(:,imaximo));
datosRecibidosTemp = DesCentrarConCeros(numeroSubportadoras,datosRecibidosTemp,'Descentrar');
Estimación de canal
En caso de corresponder el periodo de símbolo actual a un periodo de estimación de canal, se estima a partir de los símbolos piloto transmitidos e interpola a partir del método de interpolación actual. También, se estima el error medio cuadrático de estimación.
if(esPeriodoEstimacion(1,mod(s-1,7)+1,ant)) [datosRecibidosTemp,pilotosRecibidos]=agregarRemoverPilotos(false,cuadriculaEstimacion(:,mod(s-1,7)+1,ant),datosRecibidosTemp,[] ); CTF = pilotosRecibidos./(pilotosTemp{ant}); [CTFI,~]=agregarRemoverPilotos(true,cuadriculaEstimacion(:,mod(s-1,7)+1,ant),zeros(length(datosRecibidosTemp)-length(pilotosReci bidos),1),CTF); CTFs{ant,metodo} = [CTFs{ant,metodo},DesCentrarConCeros(longitudUtil,interp1(find(CTFI~=0),CTF,1:length(CTFI),metodosInterpolaci on{metodo})','Centrar')];
CTFs{ant,metodo}(isnan(CTFs{ant,metodo}(:,end)),end)=0; if(strcmp(modelo,'MIMO-LTE')) a = []; AM = []; else a = H.pathGains; AM = H.channelFilter.alphaMatrix; if(metodo==1) g = a*AM; Gs = [Gs,fft(g,longitudUtil)']; end;
SE(rel,1,metodo) = SE(rel,1,metodo)+ sum((abs(DesCentrarConCeros(numeroSubportadoras,CTFs{ant,metodo}(:,end),'Descentrar'))- abs(DesCentrarConCeros(numeroSubportadoras,Gs(:,end),'Descentrar'))).^2)/numeroSubportadoras;
SE(rel,2,metodo) = SE(rel,2,metodo)+ sum((angle(DesCentrarConCeros(numeroSubportadoras,CTFs{ant,metodo}(:,end),'Descentrar') )-angle(DesCentrarConCeros(numeroSubportadoras,Gs(:,end),'Descentrar'))).^2)/numeroSubportadoras;
end; end;
Ecualización en frecuencia
En caso de que el primer periodo de simulación no corresponda a un periodo de estimación, el canal no se ecualiza en frecuencia. De lo contrario, se realiza el proceso de ecualización a partir de la última estimación realizada.
if(numel(CTFs{ant,metodo})==0) temp = datosRecibidosTemp; else
temp = datosRecibidosTemp./conj(DesCentrarConCeros(numeroSubportadoras,CTFs{ant,metodo}(:,end),'Descentrar')); end;
if((~strcmp(modelo,'MIMO-LTE'))&&(metodo == 1))
tempTeo = datosRecibidosTemp./conj(DesCentrarConCeros(numeroSubportadoras,Gs(:,end),'Descentrar')); tempTeo(isnan(tempTeo))=[]; datosRecibidosTeo = [datosRecibidosTeo;tempTeo]; end; temp(isnan(temp))=[]; datosRecibidos{metodo} = [datosRecibidos{metodo};temp]; end; end; end;
Ciclo terceario - cálculo de BER para diferentes metodos de interpolación
A partir de todos los datos reconstruidos por el receptor anteriormente descrito, se realiza el cálculo de la tasa de bit de error.
for metodo = 1:size(metodosInterpolacion,1) if(metodo == 1)
datosEnviados = int8(reshape(datosEnviados,numel(datosEnviados),1)); end;
datosRecibidos{metodo} = int8(reshape(dec2bin(qamdemod(datosRecibidos{metodo},tamanoConstelacion)),numel(datosRecibidos{metodo})*log2(tamano Constelacion),1))-48;
error(rel,metodo) = error(rel,metodo)+(1 - sum(datosEnviados==datosRecibidos{metodo})/length(datosEnviados)); if((~strcmp(modelo,'MIMO-LTE'))&&(metodo == 1))
datosRecibidosTeo = int8(reshape(dec2bin(qamdemod(datosRecibidosTeo,tamanoConstelacion)),numel(datosRecibidosTeo)*log2(tamanoConstelacio n),1))-48;
errorTeo(rel) = errorTeo(rel)+(1-sum(datosEnviados==datosRecibidosTeo)/length(datosEnviados));
SE(rel,:,:) =SE(rel,:,:)/(numeroSlotsASimular*sum(esPeriodoEstimacion(1,:,ant))*canalesIndependientes); %Dos estimaciones por slot
end; end;
end;
SET = SET + SE;
end;
Corrección de variables para exportación
Se corrige el tipo de dato de algunas variables para facilitar su tratamiento por otras partes del algoritmo.
CTFs = {};
for metodo = 1:size(metodosInterpolacion,1) CTFs{metodo} = cat(3,tempo{:,metodo});
end;
Cálculo de detalles de la transmisión actual
clear('tempo'); error = error/pruebas; errorTeo = errorTeo/pruebas; SET = SET/pruebas; close(Hw); f = (0:longitudUtil-1)*frecuenciaMuestreo*1e-6/longitudUtil; t = (0:(length(esPeriodoEstimacion(1,:,1))*numeroSlotsASimular)-1)*slot/(length(esPeriodoEstimacion(1,:,1)))*1e3; n = cell(numeroSlotsASimular,1); [n{:}] = deal(esPeriodoEstimacion(1,:,1)); t = t(cat(2,n{:})); mas.tasaTransmision = length(datosEnviados)/(numeroSlotsASimular*slot); mas.cantidadBitsUsuario = length(datosEnviados); mas.cantidadBitsEstimacion = numeroPilotosPorRB*numeroSlotsASimular*log2(tamanoConstelacion)*canalesIndependientes; mas.tiempoSimulado = numeroSlotsASimular*slot; mas.tiempoSimulacion = toc(tinicial); mas.numeroSubportadoras = numeroSubportadoras; mas.longitudFFT = longitudUtil; mas.anchoDeBanda = BW; mas.logitudPrefijoCiclico = longitudCP; mas.frecuenciaMuestreo = frecuenciaMuestreo; mas.eficienciaEspectral = mas.tasaTransmision/BW;