Main Content

QPSK 送信機および受信機

この例では、MATLAB® での QPSK の送信機と受信機の実装について示します。特にこの例では、搬送周波数と位相オフセット、タイミング再生とフレーム同期など、実際のワイヤレス通信の問題への対処について説明します。同じシステムの Simulink® 実装については、Simulink での QPSK 送信機および受信機の例を参照してください。

はじめに

送信された QPSK データは、加法性ホワイト ガウス ノイズ (AWGN) の付加、搬送周波数と位相オフセットの導入およびタイミングのずれなど、無線送信の影響をシミュレートした減損を被っています。この例では、これらの損失に対処するための実用的なデジタル受信機のリファレンス設計を示します。受信機には、相関ベースの大まかな周波数補正、PLL ベースの細かな周波数補正、PLL ベースのシンボル タイミング再生、フレーム同期、位相不確定性の解決が含まれます。

この例は、以下の 2 つの目的にかないます。

  • シミュレーションされたさまざまなチャネル障害によって破損したメッセージを復元できる、一般的な無線通信システムのモデル化

  • 搬送周波数の大まかな補正および精密補正、ビット スタッフィング/ストリッピングによる閉ループ タイミング再生、フレーム同期および搬送波位相不確定性の解決などを含む、主要な Communications Toolbox™ 同期コンポーネントの使用についての説明

初期化

commqpsktxrx_init.m スクリプトはシミュレーション パラメーターを初期化し、構造体 prmQPSKTxRx を生成します。

prmQPSKTxRx = commqpsktxrx_init %#ok<*NOPTS> % QPSK system parameters

useScopes = true;   % true if scopes are to be used
printReceivedData = false; %true if the received data is to be printed
compileIt = false;  % true if code is to be compiled
useCodegen = false; % true to run the generated mex file
prmQPSKTxRx = 

  struct with fields:

                ModulationOrder: 4
                  Interpolation: 2
                     Decimation: 1
                           Rsym: 50000
                           Tsym: 2.0000e-05
                             Fs: 100000
                     TotalFrame: 1000
                     BarkerCode: [1 1 1 1 1 -1 -1 1 1 -1 1 -1 1]
                   BarkerLength: 13
                   HeaderLength: 26
                        Message: 'Hello world'
                  MessageLength: 16
                NumberOfMessage: 20
                  PayloadLength: 2240
                      FrameSize: 1133
                      FrameTime: 0.0227
                  RolloffFactor: 0.5000
                  ScramblerBase: 2
            ScramblerPolynomial: [1 1 1 0 1]
     ScramblerInitialConditions: [0 0 0 0]
         RaisedCosineFilterSpan: 10
                    PhaseOffset: 47
                           EbNo: 13
                FrequencyOffset: 5000
                      DelayType: 'Triangle'
                   DesiredPower: 2
                AveragingLength: 50
                   MaxPowerGain: 20
         MaximumFrequencyOffset: 6000
     PhaseRecoveryLoopBandwidth: 0.0100
     PhaseRecoveryDampingFactor: 1
    TimingRecoveryLoopBandwidth: 0.0100
    TimingRecoveryDampingFactor: 1
        TimingErrorDetectorGain: 5.4000
      PreambleDetectorThreshold: 20
                    MessageBits: [11200x1 double]
                        BerMask: [1540x1 double]

テスト対象システムのコード アーキテクチャ

この例では、QPSK 変調を使用しているデジタル通信システムをモデル化します。関数 runQPSKSystemUnderTest.m はこの通信環境をモデル化します。このスクリプトでの QPSK トランシーバー モデルは、以下の 4 つの主要コンポーネントから構成されています。

1) QPSKTransmitter.m: ビット ストリームを生成し、それを符号化、変調およびフィルター処理します。

2) QPSKChannel.m: 搬送波オフセット、タイミング オフセットおよび AWGN のあるチャネルをモデル化します。

3) QPSKReceiver.m: 位相再生、タイミング再生、復号化、復調などのコンポーネントを含む受信機をモデル化します。

4) QPSKScopes.m: 時間スコープ、周波数スコープおよびコンスタレーション ダイアグラムを使用している信号を可視化します (オプション)。

各コンポーネントは、System object を使用してモデル化されます。System object の 4 つの主要コンポーネントの構造を確認するには、runQPSKSystemUnderTest.m を参照してください。

各コンポーネントの説明

送信機

このコンポーネントは、ASCII 文字を使用してメッセージを生成し、文字をビットに変換し、その先頭に受信機のフレーム同期用のバーカー符号を付加します。このデータはその後、QPSK を使用して変調され、ルート レイズド コサイン フィルターでフィルター処理されます。

チャネル

このコンポーネントは、無線伝送の様々な影響をシミュレートします。これにより、位相と周波数の両方のオフセット、送信機と受信機との間のクロック スキュー再現用時変遅延および AWGN をもつ送信信号が劣化させられます。

受信機

このコンポーネントは、元の送信メッセージを再生成します。これは 7 つのサブコンポーネントに分割されます。

1) 自動ゲイン コントロール: 位相とタイミングの誤差検出器の等価なゲインが常に一定になるレベルに出力パワーを設定します。AGC はレイズド コサイン受信フィルターの前に置かれるため、2 のオーバーサンプリング係数で信号の振幅を測定できるようになります。このプロセスによって推定の精度が向上します。

2) 大まかな周波数補正: 相関ベースのアルゴリズムを使用して周波数オフセットを大まかに推定し、それを補正します。推定された大まかな周波数オフセットは、きめ細かい周波数補正のロック/収束が可能になるように平均化されます。そのため、大まかな周波数オフセットの推定は comm.CoarseFrequencyCompensator System object と平均化式を、補正は comm.PhaseFrequencyOffset System object を使用して行われます。

3) タイミング再生: comm.SymbolSynchronizer System object を使用して、閉ループのスカラー処理によるタイミング再生を実行し、チャネルによる遅延の影響を解決します。オブジェクトは、受信した信号のシンボル タイミング誤差の補正用に PLL を実装します。この例のオブジェクト用にはガードナー法による回転不変タイミング誤差検出器が選択されます。そのため、タイミング再生はきめ細かい周波数補正よりも先に行うことができます。オブジェクトへの入力は、固定長のサンプル フレームです。オブジェクトの出力は、ビット スタッフィングとストリッピングによって長さが変わるシンボル フレームで、実際のチャネル遅延に依存します。

4) 細かな周波数補正: comm.CarrierSynchronizer System object を使用して、閉ループのスカラー処理を実行し、周波数オフセットを正確に補正します。オブジェクトは、位相同期回路 (PLL) を実装し、入力信号の残留周波数オフセットと位相オフセットを追跡します。

5) プリアンブル検出: comm.PreambleDetector System object を使用して、入力の既知のバーカー符号の位置を検出します。オブジェクトは、相互相関ベースのアルゴリズムを実装し、入力のシンボルの既知のシーケンスを検出します。

6) フレーム同期: FrameSynchronizer System object を使用して、フレーム同期を実行し、さらに同時に可変長シンボル入力を固定長出力に変換します。このオブジェクトには boolean スカラーである 2 番目の出力があり、これによって 1 番目のフレーム出力が有効かどうかを示します。

7) データ復号化器: 位相不確定性の解決および復調を実行します。また、データ復号化器は再生成されたメッセージを送信されたものと比較して、BER を計算します。

スコープ

このコンポーネントでは、以下をプロットするための可視化オプションが提供されています。

  • ルート レイズド コサイン フィルターの処理前後の受信信号を示すスペクトル スコープ

  • 受信機側のフィルター処理後、タイミング再生後、さらにきめ細かい周波数補正後の受信信号を示すコンスタレーション ダイアグラム

システム コンポーネントの詳細については、Simulink での QPSK 送信機および受信機の Simulink 例を参照してください。

テスト対象システム

テスト対象システムのスクリプトにあるメイン ループでは、データがフレームごとに処理されます。コードを生成するには、MATLAB 変数 compileIt を true に設定します。これは、MATLAB Coder™ 製品によって提供される codegen コマンドを使用して設定できます。codegen コマンドは、MATLAB® 関数を MEX ファイルに変換してコードを生成し、実行を高速化します。生成された C コードの実行速度は、元の MATLAB コードよりも数倍高速です。この例では、useCodegen を true に設定し、MATLAB コードの代わりに codegen で生成されたコードを使用します。

runQPSKSystemUnderTest.m の内部ループは、前述の 4 つの System object を使用します。このファイルには、テスト対象システムで一度に 1 フレームを処理する for ループがあります。

for count = 1:prmQPSKTxRx.FrameCount
    transmittedSignal = qpskTx(); rcvdSignal =
    qpskChan(transmittedSignal, count); [RCRxSignal, timingRecSignal,
    freqRecSignal, BER] = qpskRx(rcvdSignal); % Receiver if useScopes
      runQPSKScopes(qpskScopes, rcvdSignal, RCRxSignal, timingRecSignal,
      freqRecSignal); % Plots all the scopes
    end
end

実行と結果

テスト対象システムのスクリプトを実行して、シミュレートされた QPSK 通信の BER 値を取得するため、以下のコードが実行されます。シミュレーションを実行すると、ビット エラー レートのデータといくつかの結果のグラフが表示されます。表示されるスコープは Raised Cosine Receive Filter 出力、Symbol Synchronizer 出力、および Fine Frequency Compensation 出力のコンスタレーション ダイアグラム、および Raised Cosine Receive Filter 出力のパワー スペクトルです。

if compileIt
    codegen -report runQPSKSystemUnderTest.m -args {coder.Constant(prmQPSKTxRx),coder.Constant(useScopes),coder.Constant(printReceivedData)} %#ok
end
if useCodegen
    BER = runQPSKSystemUnderTest_mex(prmQPSKTxRx,useScopes,printReceivedData);
else
    BER = runQPSKSystemUnderTest(prmQPSKTxRx,useScopes,printReceivedData);
end
fprintf('Error rate = %f.\n',BER(1));
fprintf('Number of detected errors = %d.\n',BER(2));
fprintf('Total number of compared samples = %d.\n',BER(3));
Error rate = 0.000238.
Number of detected errors = 366.
Total number of compared samples = 1536920.

代替の実行オプション

テスト対象システムの節で既に説明したように、この例のはじめに変数を使用することによって、コードを操作して System object と符号化オプションについてさまざまな調査ができます。

既定では、変数 useScopes は true に、変数 printReceivedData は false にそれぞれ設定されています。変数 useScopes によって、この例の実行時に MATLAB のスコープを開くことができます。このスコープを使用すると、シミュレートされたサブコンポーネントがどのように動作しているかを知ることができ、また、システムがシミュレーション時間にどのように機能しているかをより深く理解できます。この変数を false に設定すると、例の実行中、このスコープは開きません。printReceivedData を true に設定すると、復号化済みの受信パケットをコマンド ウィンドウに出力して確認することもできます。他の 2 つの変数、compileIt と useCodegen は、速度パフォーマンスに関連があり、設計トレードオフの解析に使用できます。

compileIt を true に設定すると、このスクリプト例では、MATLAB Coder™ の機能が使用され、高速実行のスクリプト runQPSKSystemUnderTest がコンパイルされます。このコマンドは、MEX ファイル (runQPSKSystemUnderTest_mex) を作成し、そのファイルを現在のフォルダーに保存します。MEX ファイルを実行する useCodegen を true に設定すると、この例では MATLAB で実装されるシステムをより高速に実行できます。この機能は、リアルタイム システムの実装に欠くことができない、重要なシミュレーション ツールです。シミュレーションの速度を最大にするには、useScopes を false に設定し、useCodegen を true に設定して MEX ファイルを実行します。

他の探索オプションについては、Simulink での QPSK 送信機および受信機の例を参照してください。

まとめ

この例では、AWGN チャネル上のデジタル通信をシミュレートしています。変調、周波数および位相の再生、タイミング再生、フレーム同期など、QPSK システムの各部分をモデル化する方法が示されています。BER を計算することによって、システム パフォーマンスを測定します。生成された C コードが、元の MATLAB コードよりも数倍高速で実行されることも示しています。

付録

この例では以下のスクリプトと補助関数が使用されています。

参考文献

1.Rice, Michael.Digital Communications - A Discrete-Time Approach.1st ed. New York, NY: Prentice Hall, 2008.