このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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
シミュレートされたデータと理論上のデータが十分一致していることを確認します。