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