Contenu principal

QPSK et OFDM avec MATLAB

Cet exemple montre comment simuler un système de communications de base qui soumet un signal à une modulation par déplacement de phase en quadrature (QPSK) puis à un multiplexage par répartition orthogonale de la fréquence (OFDM). Il fait ensuite passer le signal par un canal de bruit blanc gaussien additif avant de le démultiplexer et le démoduler. Enfin, le système calcule le nombre d’erreurs sur les bits. Pour la modélisation du système, cet exemple présente l’utilisation du System object™ MATLAB®.

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 : un modulateur OFDM, un démodulateur OFDM et un calculateur de taux d’erreur. Utilisez des arguments nom-valeur pour configurer les propriétés des objets.

Configurez la paire modulateur et démodulateur OFDM selon les paramètres de la simulation. Vous devez utiliser un System object pour le fenêtrage OFDM car l’application de la technique à un symbole nécessite les informations relatives aux échantillons du symbole précédent. Le System object enregistre ces informations en tant qu’état interne. Pour plus d’informations, veuillez consulter OFDM Raised Cosine Windowing.

ofdmMod = comm.OFDMModulator( ...
    FFTLength=numSC, ...
    CyclicPrefixLength=cpLen, ...
    Windowing=true, ...
    WindowLength=16);
ofdmDemod = comm.OFDMDemodulator( ...
    FFTLength=numSC, ...
    CyclicPrefixLength=cpLen);

Créez le calculateur de taux d’erreur. Configurez la propriété ResetInputPort à true pour qu’il puisse être réinitialisé pendant la simulation.

errorRate = comm.ErrorRate(ResetInputPort=true);

Pour déterminer les dimensions d’entrée et de sortie du modulateur OFDM, utilisez la fonction info de l’objet ofdmMod.

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’exécute jusqu’à ce que le système enregistre maxBitErrors ou jusqu’à ce que le nombre total de bits émis dépasse maxNumBits.

for m = 1:length(EbNoVec)
    snr = snrVec(m);
    
   while errorStats(2) <= maxBitErrors && errorStats(3) <= maxNumBits
       dataIn = randi([0,1],frameSize);                
       qpskTx = pskmod(dataIn,M,InputType="bit");      
       txSig = ofdmMod(qpskTx);                        
       powerDB = 10*log10(var(txSig));                 
       noiseVar = 10.^(0.1*(powerDB-snr));
       noise = sqrt(noiseVar/2)*complex(randn(size(txSig)), ...
           randn(size(txSig)));
       rxSig = txSig + noise;
       qpskRx = ofdmDemod(rxSig);                      
       dataOut = pskdemod(qpskRx,M,OutputType="bit");  
       errorStats = errorRate(dataIn,dataOut,0);       
   end
    
    berVec(m,:) = errorStats;                          
    errorStats = errorRate(dataIn,dataOut,1);          
end

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

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

Pour comparer les résultats, tracez les données théoriques et simulées sur le même graphique.

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 with xlabel Eb/No (dB), ylabel Bit Error Rate contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Simulation, Theory.