Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MATLAB System object による QPSK と OFDM

この例では、基本的な通信システムをシミュレートします。ここでは、最初に信号を QPSK 変調してから直交周波数分割多重方式を適用します。次に、信号を加法性ホワイト ガウス ノイズ チャネルで処理してから、逆多重化および復調を行います。最後に、ビット誤り数を計算します。次の例では、MATLAB® System object™ の使い方を紹介します。

シミュレーション パラメーターを設定します。

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

シミュレーションに必要な System object を構築します。QPSK 変調器、QPSK 復調器、OFDM 変調器、OFDM 復調器、AWGN チャネルおよびエラー レート計算機。名前と値のペアを使用してオブジェクトのプロパティを設定します。

バイナリ入力を受け入れるように QPSK の変調器と復調器のペアを設定します。

qpskMod = comm.QPSKModulator('BitInput',true);
qpskDemod = comm.QPSKDemodulator('BitOutput',true);

シミュレーション パラメーターに従って OFDM の変調器と復調器のペアを設定します。

ofdmMod = comm.OFDMModulator('FFTLength',numSC,'CyclicPrefixLength',cpLen);
ofdmDemod = comm.OFDMDemodulator('FFTLength',numSC,'CyclicPrefixLength',cpLen);

AWGN チャネル オブジェクトの NoiseMethod プロパティを Variance に設定し、VarianceSource プロパティを定義してノイズ パワーを入力端子から設定できるようにします。

channel = comm.AWGNChannel('NoiseMethod','Variance', ...
    'VarianceSource','Input port');

ResetInputPort プロパティを true に設定してシミュレーション時にエラー レート計算機がリセットされるようにします。

errorRate = comm.ErrorRate('ResetInputPort',true);

ofdmMod オブジェクトの関数 info を使用して OFDM 変調器の入力と出力の次元を決定します。

ofdmDims = info(ofdmMod)
ofdmDims = struct with fields:
    DataInputSize: [117 1]
       OutputSize: [160 1]

ofdmDims 構造体変数からデータ サブキャリア数を決定します。

numDC = ofdmDims.DataInputSize(1)
numDC = 117

データ サブキャリア数から OFDM フレーム サイズ (ビット単位) およびシンボルあたりのビット数を決定します。

frameSize = [k*numDC 1];

必要な Eb/No の範囲に基づく SNR ベクトル、シンボルあたりのビット数、サブキャリアの合計数に対するデータ サブキャリア数の比率を設定します。

EbNoVec = (0:10)';
snrVec = EbNoVec + 10*log10(k) + 10*log10(numDC/numSC);

BER および誤り統計の配列を初期化します。

berVec = zeros(length(EbNoVec),3);
errorStats = zeros(1,3);

Eb/No 値の範囲にある通信リンクをシミュレーションします。Eb/No 値それぞれについて maxBitErrors が記録されるか、送信ビットの総数が 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

関数 berawgn を使用して QPSK システムの理論上の BER を決定します。

berTheory = berawgn(EbNoVec,'psk',M,'nondiff');

同じグラフに理論上のデータとシミュレートされたデータをプロットし結果を比較します。

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 with xlabel Eb/No (dB), ylabel Bit Error Rate contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Simulation, Theory.

シミュレートされたデータと理論上のデータが十分一致していることを確認します。