メインコンテンツ

MATLAB での QPSK と OFDM

この例では、直交位相偏移変調 (QPSK) を使用して信号を変調し、直交周波数分割多重 (OFDM) を適用する基本的な通信システムをシミュレートする方法を示します。次に、信号を逆多重化して復調する前に、信号を加法性ホワイト ガウス ノイズ チャネルに渡します。最後に、システムはビット エラー数を計算します。この例では、システムをモデル化するために、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 (OFDM 変調器、OFDM 復調器、およびエラー レート計算機) を構成します。名前と値の引数を使用してオブジェクトのプロパティを設定します。

シミュレーション パラメーターに従って OFDM の変調器と復調器のペアを設定します。1 つのシンボルにこの手法を適用するには、前のシンボルのサンプルに関する情報が必要になるため、OFDM ウィンドウ処理のために System object を使用しなければなりません。System object はこの情報を内部状態として保存します。詳細については、OFDM レイズド コサイン ウィンドウ処理を参照してください。

ofdmMod = comm.OFDMModulator( ...
    FFTLength=numSC, ...
    CyclicPrefixLength=cpLen, ...
    Windowing=true, ...
    WindowLength=16);
ofdmDemod = comm.OFDMDemodulator( ...
    FFTLength=numSC, ...
    CyclicPrefixLength=cpLen);

エラー レート計算機を作成します。ResetInputPort プロパティを true に設定して、シミュレーション中にリセットできるようにします。

errorRate = comm.ErrorRate(ResetInputPort=true);

OFDM 変調器の入力と出力の次元を求めるには、ofdmMod オブジェクトの関数 info を使用します。

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);                
       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

QPSK システムの理論上の BER を求めるには、関数 berawgn を使用します。

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.