QPSK und OFDM mit MATLAB System objects
Dieses Beispiel veranschaulicht, wie ein Basis-Kommunikationssystem simuliert wird, in dem das Signal zuerst mit QPSK moduliert und anschließend dem Multiplexing mit orthogonaler Frequenzteilung unterzogen wird. Danach durchläuft das Signal einen Additive-White-Gaussian-Noise-(AWGN-)Kanal (AWGN: dt. additives weißes Gaußsches Rauschen), bevor es demultiplext und demoduliert wird. Als Letztes wird die Anzahl der Bitfehler berechnet. Dieses Beispiel demonstriert die Verwendung von MATLAB® System objects™.
Legen Sie die Simulationsparameter fest.
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
Konstruieren Sie System objects, die für die Simulation benötigt werden: QPSK-Modulator, QPSK-Demodulator, OFDM-Modulator, OFDM-Demodulator, AWGN-Kanal und ein Fehlerratenrechner. Verwenden Sie Name/Wert-Paare, um die Objekteigenschaften festzulegen.
Legen Sie den QPSK-Modulator und -Demodulator so fest, dass sie binäre Eingaben akzeptieren.
qpskMod = comm.QPSKModulator('BitInput',true); qpskDemod = comm.QPSKDemodulator('BitOutput',true);
Legen Sie das Paar aus OFDM-Modulator und -Demodulator gemäß den Simulationsparametern fest.
ofdmMod = comm.OFDMModulator('FFTLength',numSC,'CyclicPrefixLength',cpLen); ofdmDemod = comm.OFDMDemodulator('FFTLength',numSC,'CyclicPrefixLength',cpLen);
Legen Sie die Eigenschaft NoiseMethod
des AWGN-Kanal-Objekts auf Variance
fest und definieren Sie die Eigenschaft VarianceSource
so, dass die Rauschleistung von einem Eingabeport festgelegt werden kann.
channel = comm.AWGNChannel('NoiseMethod','Variance', ... 'VarianceSource','Input port');
Legen Sie die Eigenschaft ResetInputPort
auf true
fest, um zu ermöglichen, dass der Fehlerratenrechner während der Simulation zurückgesetzt werden kann.
errorRate = comm.ErrorRate('ResetInputPort',true);
Verwenden Sie die Funktion info
des ofdmMod
-Objekts, um die Eingabe- und Ausgabedimensionen des OFDM-Modulators zu bestimmen.
ofdmDims = info(ofdmMod)
ofdmDims = struct with fields:
DataInputSize: [117 1]
OutputSize: [160 1]
Bestimmen Sie anhand der Strukturvariablen ofdmDims
die Anzahl der Daten-Hilfsträger.
numDC = ofdmDims.DataInputSize(1)
numDC = 117
Bestimmen Sie anhand der Anzahl der Daten-Hilfsträger und der Anzahl der Bits pro Symbol die Größe des OFDM-Rahmens (in Bit).
frameSize = [k*numDC 1];
Legen Sie den SNR-Vektor basierend auf dem gewünschten Eb/No-Bereich, der Anzahl der Bits pro Symbol und dem Verhältnis der Anzahl der Daten-Hilfsträger zur Gesamtzahl der Hilfsträger fest.
EbNoVec = (0:10)'; snrVec = EbNoVec + 10*log10(k) + 10*log10(numDC/numSC);
Initialisieren Sie die Arrays für BER und Fehlerstatistik.
berVec = zeros(length(EbNoVec),3); errorStats = zeros(1,3);
Simulieren Sie die Kommunikationsverbindung über den gesamten Bereich der Eb/No-Werte. Für jeden Eb/No-Wert wird die Simulation so lange ausgeführt, bis entweder maxBitErrors
aufgezeichnet wurden oder die Gesamtzahl der übertragenen Bits den Wert maxNumBits
überschritten hat.
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
Verwenden Sie die Funktion berawgn
, um die theoretische BER für ein QPSK-System zu bestimmen.
berTheory = berawgn(EbNoVec,'psk',M,'nondiff');
Stellen Sie die theoretischen und die simulierten Daten in demselben Diagramm dar, um die Ergebnisse zu vergleichen.
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
Wie Sie sehen, besteht eine deutliche Übereinstimmung zwischen den simulierten und den theoretischen Daten.