Main Content

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

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Simulation, Theory.

Wie Sie sehen, besteht eine deutliche Übereinstimmung zwischen den simulierten und den theoretischen Daten.