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
Observez qu’il y a une bonne concordance entre les données simulées et théoriques.