Main Content

La traduzione di questa pagina non è aggiornata. Fai clic qui per vedere l'ultima versione in inglese.

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

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Simulation, Theory.

Si noti che c'è un buon accordo tra i dati simulati e quelli teorici.