QPSK e OFDM con MATLAB System Object
Questo esempio mostra come simulare un sistema di comunicazione di base in cui il segnale viene prima modulato QPSK e quindi sottoposto a modulazione multiportante a divisione di frequenza ortogonale. Il segnale viene quindi fatto passare attraverso un canale di rumore gaussiano bianco additivo prima di essere decodificato tramite demultiplexer e demodulato. Infine, viene calcolato il numero di errori di bit. L’esempio mostra l’utilizzo di MATLAB® System objects™.
Impostare i parametri di simulazione.
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
Costruire i System object necessari per la simulazione: modulatore QPSK, demodulatore QPSK, modulatore OFDM, demodulatore OFDM, canale AWGN e calcolatore del tasso di errore. Utilizzare le coppie nome-valore per impostare le proprietà dell’oggetto.
Impostare il modulatore e il demodulatore QPSK in modo che accettino ingressi binari.
qpskMod = comm.QPSKModulator('BitInput',true); qpskDemod = comm.QPSKDemodulator('BitOutput',true);
Impostare la coppia modulatore e demodulatore OFDM in base ai parametri di simulazione.
ofdmMod = comm.OFDMModulator('FFTLength',numSC,'CyclicPrefixLength',cpLen); ofdmDemod = comm.OFDMDemodulator('FFTLength',numSC,'CyclicPrefixLength',cpLen);
Impostare la proprietà NoiseMethod
dell’oggetto canale AWGN su Variance
e definire la proprietà VarianceSource
in modo che la potenza del rumore possa essere impostata da una porta in entrata.
channel = comm.AWGNChannel('NoiseMethod','Variance', ... 'VarianceSource','Input port');
Impostare la proprietà ResetInputPort
su true
per abilitare il ripristino del calcolatore del tasso di errore durante la simulazione.
errorRate = comm.ErrorRate('ResetInputPort',true);
Utilizzare la funzione info
dell’oggetto ofdmMod
per determinare le dimensioni in entrata e in uscita del modulatore OFDM.
ofdmDims = info(ofdmMod)
ofdmDims = struct with fields:
DataInputSize: [117 1]
OutputSize: [160 1]
Determinare il numero di sottoportanti dei dati dalla variabile di struttura ofdmDims
.
numDC = ofdmDims.DataInputSize(1)
numDC = 117
Determinare la dimensione (in bit) della struttura OFDM dal numero di sottoportanti dei dati e dal numero di bit per simbolo.
frameSize = [k*numDC 1];
Impostare il vettore SNR in base all’intervallo Eb/No desiderato, il numero di bit per simbolo e il rapporto tra il numero di sottoportanti dei dati e il numero totale di sottoportanti.
EbNoVec = (0:10)'; snrVec = EbNoVec + 10*log10(k) + 10*log10(numDC/numSC);
Inizializzare le matrici del BER e delle statistiche di errore.
berVec = zeros(length(EbNoVec),3); errorStats = zeros(1,3);
Simulare il collegamento di comunicazione nell'intervallo di valori Eb/No. Per ogni valore Eb/No, la simulazione viene eseguita fino a quando non si registra maxBitErrors
o il numero totale di bit trasmessi supera maxNumBits
.
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
Utilizzare la funzione berawgn
per determinare il BER teorico per un sistema QPSK.
berTheory = berawgn(EbNoVec,'psk',M,'nondiff');
Tracciare i dati teorici e simulati sullo stesso grafico per confrontare i risultati.
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
Si noti che c'è un buon accordo tra i dati simulati e quelli teorici.