Está en la página 1de 4

QPSK y OFDM con objetos de sistema MATLAB

Este ejemplo muestra cómo simular un sistema de comunicación básico en el que la señal se
modula en primer lugar mediante QPSK y luego se somete a multiplexación por división de
frecuencia ortogonal. La señal se pasa luego a través de un canal de ruido gaussiano blanco
adicional antes de ser demultiplexada y demodulada. Por último, se calcula el número de errores
de bit. El ejemplo muestra el uso de objetos de sistemas de MATLAB® ™.

Se establece los parámetros de simulación.

M = 4; % Modulation alphabet
k = log2(M); % Bits/symbol
numSC = 128; % Number of OFDM subcarriers
cpLen = 32; % OFDM cyclic prefix length
maxBitErrors = 100; % Maximum number of bit errors
maxNumBits = 1e7; % Maximum number of bits transmitted

Se construye los objetos del sistema necesarios para la simulación: modulador QPSK,
demodulador QPSK, modulador OFDM, demodulador OFDM, canal AWGN y un calculador de tasa
de error. Use pares nombre-valor para establecer las propiedades del objeto.

Configure el modulador QPSK y el demodulador para que acepten entradas binarias.

qpskMod = comm.QPSKModulator('BitInput',true);
qpskDemod = comm.QPSKDemodulator('BitOutput',true);

Establecer el par modulador/demodulador de OFDM de acuerdo con los parámetros de


simulación.

ofdmMod = comm.OFDMModulator('FFTLength',numSC,'CyclicPrefixLength',cpLen);
ofdmDemod = comm.OFDMDemodulator('FFTLength',numSC,'CyclicPrefixLength',cpLen);

Establezca la propiedad 𝑵𝒐𝒊𝒔𝒆𝑴𝒆𝒕𝒉𝒐𝒅 del objeto de canal AWGN en Varianza y defina la


propiedad 𝑽𝒂𝒓𝒊𝒂𝒏𝒄𝒆𝑺𝒐𝒖𝒓𝒄𝒆 para que la potencia de ruido se pueda establecer desde un puerto
de entrada.

channel = comm.AWGNChannel('NoiseMethod','Variance', ...


'VarianceSource','Input port');

Establecer la propiedad 𝑹𝒆𝒔𝒆𝒕𝑰𝒏𝒑𝒖𝒕𝑷𝒐𝒓𝒕 en verdadero para habilitar la calculadora de tasa de


error se reiniciará durante la simulación.

errorRate = comm.ErrorRate('ResetInputPort',true);

Usar la función de información del objeto 𝒐𝒇𝒅𝒎𝑴𝒐𝒅 para determinar las dimensiones de entrada
y salida del modulador OFDM.

ofdmDims = info(ofdmMod)
ofdmDims =
struct with fields:
DataInputSize: [117 1]
OutputSize: [160 1]

Determinar el número de subportadoras de datos de la variable de estructura 𝒐𝒇𝒅𝒎𝑫𝒊𝒎𝒔.

numDC = ofdmDims.DataInputSize(1)
numDC =
117

Determinar el tamaño de trama OFDM (en bits) a partir del número de subportadoras de datos
y el número de bits por símbolo.

frameSize = [k*numDC 1];


Establecer el vector SNR en función del rango Eb / No deseado, el número de bits por símbolo y
la relación del número de bits. subportadoras de datos para el número total de subportadoras.

EbNoVec = (0:10)';
snrVec = EbNoVec + 10*log10(k) + 10*log10(numDC/numSC);

Inicializar la BER y matrices de estadísticas de error


berVec = zeros(length(EbNoVec),3);
errorStats = zeros(1,3);

Simular el enlace de comunicación sobre el rango de valores Eb/No. Para cada valor Eb/No, la
simulación se ejecuta hasta que se registran 𝒎𝒂𝒙𝑩𝒊𝒕𝑬𝒓𝒓𝒐𝒓𝒔 o el número total de bits transmitidos
excede 𝒎𝒂𝒙𝑵𝒖𝒎𝑩𝒊𝒕𝒔.

for m = 1:length(EbNoVec)
snr = snrVec(m);

while errorStats(2) <= maxBitErrors && errorStats(3) <= maxNumBits


dataIn = randi([0,1],frameSize); % Generate binary data
qpskTx = qpskMod(dataIn); % Apply QPSK modulation
txSig = ofdmMod(qpskTx); % Apply OFDM modulation
powerDB = 10*log10(var(txSig)); % Calculate Tx signal power
noiseVar = 10.^(0.1*(powerDB-snr)); % Calculate the noise variance
rxSig = channel(txSig,noiseVar); % Pass the signal through a noisy channel
qpskRx = ofdmDemod(rxSig); % Apply OFDM demodulation
dataOut = qpskDemod(qpskRx); % Apply QPSK demodulation
errorStats = errorRate(dataIn,dataOut,0); % Collect error statistics
end
berVec(m,:) = errorStats; % Save BER data
errorStats = errorRate(dataIn,dataOut,1); % Reset the error rate calculator
end

Utilice la función berawgn para determinar la BER teórica para un sistema QPSK.
berTheory = berawgn(EbNoVec,'psk',M,'nondiff');

Grafique los datos teóricos y simulados en el mismo gráfico para compare resultados.

figure
semilogy(EbNoVec,berVec(:,1),'*')
hold on
semilogy(EbNoVec,berTheory)
legend('Simulation','Theory','Location','Best')
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')
grid on
hold off

figure
subplot(211)
plot(abs(qpskTx)); grid
title('Señal de banda base QPSK de Tx/Rx')
hold on
plot(abs(qpskRx))
% title('Señal de banda base QPSK de Rx')
legend('Señal de banda base QPSK de Tx','Señal de banda base QPSK de Rx')
hold off

subplot(212)
plot(abs(txSig)); grid
title('Señal OFDM de Tx/Rx, en el tiempo'); grid
hold on
plot(abs(rxSig)); grid
legend('Señal OFDM de Tx, en el tiempo', 'Señal OFDM de Rx, en el tiempo')
hold off

Los resultados del sistema OFDM, se muestran en las figuras 1, 2 y 3

Figura 1 Señales de banda base de Tx y Rx

Figura 2 Señales de OFDM de Tx y Rx


Figura 3 Errores de bit

Observe que existe un buen acuerdo entre los datos simulados y teóricos.

También podría gustarte