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