無線通信エンジニアの備忘録

無線通信だったり、ITだったり、仕事で覚えた専門知識の備忘録

MATLAB/SimulinkでQPSK変調のBER測定をシミュレーションしてみる

こんにちは。

前回、MATLABによるQPSK変調のBER測定のシミュレーションを行いました。

taekwongineer.hatenablog.jp


今回もMATLABですが、mファイルのスクリプトではなく、SimulinkによるモデルベースでのQPSK変調のBER測定のシミュレーションをやってみようと思います。


●この記事の目次

1.シミュレーションに用いるライブラリ

この記事で説明するSimulinkのシミュレーションでは、

Communications Toolbox

のライブラリを使用しています。

0,1のデータ生成、各種変復調、フィルタ処理、BER測定、スペクトラム解析などなど、通信システムの解析に必要な機能が盛りだくさんで大変便利なライブラリです。
オプション扱いなので、MATLABSimulinkの本体に加えてHome版では4,490円かかりますが、Proffessional版と比べたら1/50くらいなので破格のお値段かと思います(;^_^A
(何だかMathWorksの回し者みたいだな・・・(;^_^A)



2.QPSK変調のBER測定のSimulinkモデルとシミュレーション実行のmファイルスクリプト

QPSK変調のBER測定のSimulinkモデルを図2-1に示します。



図2-1 QPSK変調のBER測定のSimulinkモデル

今回のシミュレーションでは、前回のmファイルのスクリプトによるシミュレーションの処理内容に合わせて、QPSK変調後のRaised Cosineフィルタによる帯域制限の処理は省略しているので、とてもシンプルな構成のモデルとなっています。
Raised Cosineフィルタも含めたシミュレーションについては、また別の機会に掲載したいと思います。

次に、図2-1のモデルによるBER測定のシミュレーションをSNRを変化させながら実施し、結果をグラフ表示するためのmファイルスクリプトを以下に示します。

close
clc

% 初期パラメータの定義
SNdBvec = 0:0.5:15;
BER_sim = zeros(1, length(SNdB));
BER_theory = zeros(1, length(SNdB));


for index = 1:length(SNdBvec)

    % Simulinkモデルの実行
    SNdB = SNdBvec(index);
    sim("QPSKsim");

    % Simulinkモデルの実行結果の取り出し
    BER_sim(index) = BER(1);

    % BER理論値の計算
    SN = 10^(SNdB/10);
    BER_theory(index) = erfc(sqrt(SN/2))/2;

    % 計算結果の表示
    disp("SNdB=" + SNdB + " BER=" + BER_sim(index));
    disp("SNdB=" + SNdB + " BER_theory=" + BER_theory(index));

end

%%%%% グラフにプロット %%%%%
semilogy(SNdBvec, BER_sim,"o", SNdBvec, BER_theory); % 片対数表示
legend("シミュレーション", "理論値"); % 凡例の表示
xlabel("SNR[dB]"); % 横軸ラベルの表示
ylabel("BER"); % 縦軸ラベルの表示
grid on;

QPSKの変復調処理やBERの計算等は、全てSimulinkのモデル内で実行されるため、mファイル側で実施するのは、はSNRを変化させるforループと、BERのシミュレーション結果のグラフへのプロットのみとなります。

シミュレーション結果のグラフを図2-2に示します。



図2-2 BER測定のシミュレーション結果

以後、Simulinkのモデルの内容の詳細について説明していきます。

3.Simulinkモデルの内容について

本章では、図2-1に示したSimulinkモデルの各ブロックの設定内容や簡単な使い方について触れていきます。

MathWorksのドキュメントを読んでも英語を日本語に直訳しただけで、なかなか意味が分かりづらいことが多いので、やっぱり自分で触ってみてあれこれ試行錯誤しながら使い方を覚えていく必要があるなと思います。

(1)0,1のランダムデータの生成

0,1のデータ生成には、Communications Toolboxに含まれる「Bernoulli Binary Generator」ブロックを使用します。



図3-1 Bernoulli Binary Generatorブロック

今回のシミュレーションで使用したBernoulli Binary Generatorブロックのブロックパラメーターの設定を図3-2に示します。



図3-2 Bernoulli Binary Generatorブロックパラメーター
デフォルトの設定値から変更を行ったのは「Sample per frame」で、今回のシミュレーションでは、10^7を設定しました。

この「Sample per frame」は、Bernoulli Binary Generatorブロックが、0,1のランダム数値列をベクトルとして一度に出力するサンプル数を示しています。
無線フレームを構成するようなシミュレーションでは、この値が数十~数百、大きければ数千といったオーダーの値になるかと思いますが、ここでは単純なBERの懸賞であるため、シミュレーション時間短縮のため、10^7と大きな値を設定しています。
MATLABでは繰り返し処理をforループを使わずに、できるだけ行列演算の形式で記述する方が処理時間が早くなるのと同じです。)

Sample timeは、1サンプルあたりの時間(単位:秒)を示しており、デフォルト値は1秒に設定されています。

つまり「1bps」です。

これは近年の5GのようなGbps級の無線通信システムに比べると猛烈に遅い値ですが、今回のシミュレーションではスペクトラム解析を行うわけではないので、1秒のままで特に支障はありません。

(2)QPSKの変復調処理

QPSKの変調、変復調の処理には「QPSK Modulator Baseband」ブロック、「QPSK Demodulator Baseband」ブロックをそれぞれ使用します。



図3-3 QPSK Modulator Basebandブロック/QPSK Demodulator Basebandブロック


QPSK Modulator Basebandブロックのブロックパラメーター設定を図3-4に示します。



図3-4 QPSK Modulator Basebandブロックパラメーター

Input typeはデフォルトでは「Integer」に設定されていますが、これを「Bit」に変更します。
Integerの場合は、「0~3」の整数値を入力として使用する場合に設定しますが、今回のシミュレーションでは、Bernoulli Binary Generatorの出力をそのまま入力するため、「0,1」のビット列を入力する場合の「Bit」を設定します。

「View Constellation」をクリックすると、図3-5のように入力ビット列に対するシンボルマッピングを確認することができます。



図3-5 QPSKシンボルマッピング

00が入力された場合は、(+1+i)/√2
01が入力された場合は、(-1+i)/√2
10が入力された場合は、(+1-i)/√2
11が入力された場合は、(-1-i)/√2

がそれぞれ出力されます。

1ビット目が虚部、2ビット目が実部の符号を決定していることが分かりますね。


次に、QPSK Demodulator Basebandブロックのブロックパラメーター設定を図3-6に示します。



図3-6 QPSK Demodulator Basebandブロックパラメーター

こちらもQPSK Modulator Basebandブロックと同様で、Output typeがデフォルトでは「Integer」に設定されていますが、これを「bit」に変更します。

その他のパラメーターについてはデフォルト値のままにしておきます。
(Decision typeトカヨクワカリマセン・・・(T_T))

(3)AWGN雑音の生成

AWGN雑音の生成には「AWGN Channel」ブロックを使用します。



図3-7 AWGN Channelブロック


AWGN Channelブロックのブロックパラメーター設定を図3-8に示します。



図3-8 AWGN Channelブロックパラメーター設定

「Mode」はデフォルトでは、「Signal to noise ratio(Eb/No)」が設定されていますが、今回は「Signal to noise ratio(SNR)」を選択します。

そして、「SNR(dB)」はデフォルトでは「10」が設定されていますが、ワークスペースから読み込む変数として、「SNdB」を入力します。

「input signal power, referenced to 1ohm(watts)」はデフォルトの「1」のままにしておきます。
(QPSK Modulator Basebandの出力の平均電力が「1」なので、デフォルト値のままで問題ありません。)

(4)BER(Bit Error Rate)の算出

BERの測定には「Error Rate Calculation」ブロックを使用します。



図3-9 Error Rate Calculationブロック

TxのポートにはBernoulli Binary Generatiorブロックの出力を、RxのポートにはQPSK Demodulator Basebandブロックの出力をそれぞれ接続します。

Error Rate Calculationブロックのブロックパラメーター設定を図3-10に示します。



図3-10 Error Rate Calculationブロックパラメーター設定

「Output data」を「Workspace」に設定することで、BERの計算結果をワークスペースに出力することができます。
(デフォルトで選択済)

「Variable name」にはワークスペースにBERの計算結果を出力する際の変数名を入力します。
デフォルトでは、「ErrorVec」と入力されていますが、今回は「BER」と入力します。
(特に意味はありません、ただの好みです(;^_^A)

BERには、ビット誤り率、ビット誤り数、送信シンボル数の3つの値がベクトルとして格納されます。

そして、「Stop Simulation」にチェックを入れ、シミュレーションの停止条件となる「Target number of errors」(エラービットの上限数)及び「Maximum number of symbols」(送信シンボル数の上限)をそれぞれ入力します。
今回は、Target number of errorsに1000、Maxinum number of symbolsに10^7をそれぞれ入力します。

Bernoulli Binary Generatorから一度に出力される0,1のランダムビットの系列長が10^7なので、Bernoulli Binary GeneratorからQPSK Demodulator Basebandまでの処理が一巡すると、そこでシミュレーションが終了します。

シミュレーションの終了時間に「inf」を設定した状態で、Stop simulationにチェックを入れずにシミュレーションを実行すると、永久に終わらなくなってしまうので要注意です(;^_^A

また、「Receive delay」には今回はデフォルト値の0を設定しますが、QPSK Modulator Basebandブロックの出力の後に、レイズドコサインフィルタ等の帯域制限処理を加えると、フィルタ処理の遅延が発生してくるため、発生した遅延分をここに入力する必要があります。

フィルタ処理の遅延時間の確認方法については、また別の機会に開設したいと思います。

(5)ワークスペースからのSimulinkモデルの実行

Simulinkで作成したモデルは、ワークスペースから

sim("Simulinkモデル名")

で実行することができます。

今回は上記のサンプルコードの14行目にて

sim("QPSKsim");

と記述しています。

Simulinkモデルの拡張子「.slx」は書いても、書かなくても大丈夫です。

そしてSimulinkモデルがワークスペースに出力したシミュレーション結果であるBERから、

BER_sim(index) = BER(1);

と記述し、BERの値を取り出します。

BER(2)、BER(3)にはそれぞれビット誤り数、送信シンボル数が格納されていますが、今回のシミュレーションでは特に使用しません。

forループ毎にSNdBの値が更新され、各SNdBの値の条件のもとで「sim("QPSKsim");」が実行されます。

(6)まとめ

今回の記事では、SimulinkによるQPSK変調のBER測定シミュレーションについて説明しました。

今回のシミュレーションでは、mファイルによるforループのスクリプトでBER曲線を描いていますが、Communications Toolboxの一機能である「bertool」を使用することで、mファイルのスクリプトの記述一切なしでBER曲線を描くことも可能です。

ただ、bertoolを使用した場合のグラフは横軸はEb/Noに限定されてしまうため、今回はmファイルのスクリプトを用いたシミュレーションを行いました。

次回は、レイズドコサインフィルタによる帯域制限も含めたシミュレーションを実施したいと思います。