Main Content

Die Übersetzung dieser Seite ist veraltet. Klicken Sie hier, um die neueste Version auf Englisch zu sehen.

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.