Main Content

La traduction de cette page n'est pas à jour. Cliquez ici pour voir la dernière version en anglais.

QPSK et OFDM avec les System objects MATLAB

Cet exemple montre comment simuler un système de communication de base dans lequel le signal est d’abord modulé QPSK puis sujet à la l'OFDM. Le signal est ensuite passé à travers un canal de bruit blanc Gaussien supplémentaire avant d’être démodulé et démultiplexé. Enfin, le nombre d’erreurs bit est calculé. Cet exemple présente l’utilisation de MATLAB® System objects™.

Configurez les paramètres de simulation.

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

Construisez les System objects nécessaires à la simulation : Modulateur QPSK, démodulateur QPSK, modulateur OFDM, démodulateur OFDM, canal AWGN et un calculateur de taux d’erreur. Utilisez des couples nom-valeur pour configurer les propriétés des objets.

Configurez le modulateur QPSK et le démodulateur QPSK pour qu’ils acceptent les entrées binaires.

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

Configurez la paire modulateur et démodulateur OFDM selon les paramètres de la simulation.

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

Configurez la propriété NoiseMethod de l’objet canal AWGN sur Variance et définissez la propriété VarianceSource pour que la puissance de bruit puisse être réglée depuis un port d’entrée.

channel = comm.AWGNChannel('NoiseMethod','Variance', ...
    'VarianceSource','Input port');

Configurez la propriété ResetInputPort sur true pour permettre au calculateur de taux d’erreur d’être réinitialisé pendant la simulation.

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

Utilisez la fonction info de l’objet ofdmMod pour déterminer les dimensions de l'entrée et de la sortie du modulateur OFDM.

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

Déterminez le nombre de sous-porteuses de données à partir de la variable de la structure ofdmDims.

numDC = ofdmDims.DataInputSize(1)
numDC = 117

Déterminez la taille du champ OFDM (en bits) à partir des sous-porteuses de données et du nombre de bits par symbole.

frameSize = [k*numDC 1];

Configurez le vecteur SNR en se basant sur la plage Eb/No désirée, sur le nombre de bit par symbole et sur le rapport du nombre de sous-porteuses de données sur le nombre total de sous-porteuses.

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

Initialisez le BER et les tableaux d’erreur statistiques.

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

Simulez le lien de communication sur la plage des valeurs Eb/No. Pour chaque valeur Eb/No, la simulation s’effectue soit jusqu’à ce que maxBitErrors soient enregistrés, soit jusqu’à ce que le nombre total de bits émis excède 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

Utilisez la fonction berawgn pour déterminer le BER théorique pour un système QPSK.

berTheory = berawgn(EbNoVec,'psk',M,'nondiff');

Tracez les données théoriques et simulées sur le même graphique pour comparer les résultats.

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.

Observez qu’il y a une bonne concordance entre les données simulées et théoriques.