ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

QPSK 送信機および受信機

この例では、QPSK 変調を使用しているデジタル通信システムについて説明します。例では、通信 System object を使用して QPSK トランシーバーのシミュレーションを実行します。特にこの例では、搬送周波数と位相オフセット、タイミング再生とフレーム同期など、実際のワイヤレス通信の問題への対処について説明します。

この例ではハードウェアは使用しません。ただし、Universal Software Radio Peripheral (USRP) ハードウェアに接続し、MATLAB にソフトウェア定義の無線機を実装する System object が使用できます。www.mathworks.com/discovery/sdr/usrp.html にアクセスして、System object、関連する例およびドキュメンテーションをダウンロードします。

実装

この例では、QPSK トランシーバーの MATLAB 実装について説明します。

System object を使用する MATLAB スクリプト: commQPSKTransmitterReceiver.mcommQPSKTransmitterReceiver.m

ブロックを使用した Simulink の実装について確認する場合は、commqpsktxrx.mdlcommqpsktxrx.mdl をクリックしてください。

はじめに

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

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

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

  • 搬送周波数の大まかな補正および精密補正、ビット スタッフィング/スキッピングによる閉ループ タイミング再生、フレーム同期、 搬送波位相の不明瞭性解決およびメッセージのデコードなど、QPSK システム設計に使用する、主要な Communications System Toolbox™ System object の使用についての説明

  • テスト対象システムより大きなコンポーネントをモデル化するため、他の System object を含む高位の System object の作成の説明

初期化

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

prmQPSKTxRx = commqpsktxrx_init % 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 = 

                                M: 4
                       Upsampling: 4
                     Downsampling: 2
                               Fs: 200000
                               Ts: 5.0000e-06
                        FrameSize: 100
                     BarkerLength: 13
                       DataLength: 174
                    ScramblerBase: 2
              ScramblerPolynomial: [1 1 1 0 1]
       ScramblerInitialConditions: [0 0 0 0]
                             sBit: [17400x1 double]
                 RxBufferedFrames: 10
           PhaseErrorDetectorGain: 2.0000
                PhaseRecoveryGain: 1
          TimingErrorDetectorGain: 5.4000
               TimingRecoveryGain: -1
           RaisedCosineFilterSpan: 10
                    MessageLength: 105
                       FrameCount: 100
                      PhaseOffset: 47
                             EbNo: 13
                  FrequencyOffset: 5000
                        DelayType: 'Triangle'
       CoarseFrequencyCompFFTSize: 2048
       PhaseRecoveryLoopBandwidth: 0.0100
       PhaseRecoveryDampingFactor: 1
      TimingRecoveryLoopBandwidth: 0.0100
      TimingRecoveryDampingFactor: 1
                          Rolloff: 0.5000
    TransmitterFilterCoefficients: [1x41 double]
       ReceiverFilterCoefficients: [1x41 double]

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

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

1) QPSKTransmitter: ビット ストリームを生成し、それをエンコード、変調およびフィルター処理します。

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

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

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

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

個々のコンポーネントの説明

送信機

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

チャネル

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

受信機

このコンポーネントは、元の送信メッセージを再生成します。このコンポーネントは、5 つのサブコンポーネントに分かれ、System object によりモデル化されています。各サブコンポーネントは、System object を使用した他のサブコンポーネントによってモデル化されています。

1) Automatic Gain Control: Automatic Gain Control (AGC) は "Coarse Frequency Compensation" サブシステムの入力の振幅が "1/アップサンプリング係数" であるようにし、位相とタイミングの誤差検出器の等価なゲインが常に一定になります。AGC は "コサイン ロールオフ受信フィルター" の前に置かれるため、4 のオーバーサンプリング係数で信号の振幅を測定できるようになります。このプロセスによって推定の精度が向上します。

2) Coarse Frequency Compensation:非線形性および高速フーリエ変換 (FFT) を使用して、周波数オフセットを大まかに見積もり、それを補正します。サブシステムは、QPSK 変調の目的ではない信号を取得するために入力信号を 4 乗します。そして、変調に依存しない信号に FFT を実行し、トーンを周波数オフセットの 4 倍と推定します。推定値を 4 で割った後、"Phase/Frequency Offset" System object により、周波数オフセットが補正されます。

3) Fine Frequency Compensation: 閉ループのスカラー処理を実行し、周波数オフセットを正確に補正します。Fine Frequency Compensation サブシステムは、位相同期回路 (PLL) を実装し、入力信号の残留周波数オフセットと位相オフセットを追跡します。詳細は、[ 1 ] の第 7 章を参照してください。PLL はダイレクト デジタル シンセサイザー (DDS) を使用して、残留周波数と位相オフセットを相殺する補正位相を生成します。DDS による位相オフセットの推定値は Loop Filter の位相誤差出力の積分です。PLL 設計の詳細は、 [ 1 ] の付録 C.2 を参照してください。

4) Timing Recovery: 閉ループのスカラー処理によるタイミング再生を実行し、チャネルによる遅延の影響を解決します。Timing Recoveryサブシステムは PLL を実装し ([ 1 ] の 8 章で説明)、受信信号のタイミングの誤差を補正します。NCO Control サブシステムは 1 を法とする減算カウンターを実装し ([ 1 ] の 8.4.3 章で説明)、Modified Buffer の制御信号を生成して Interpolation Filter の内挿を選択します。この制御信号は Timing Error Detector (TED) も有効にし、正確なタイミングの時点でタイミング誤差を計算するようにします。NCO Control サブシステムは Interpolation Filter のタイミング差を更新し、最適なサンプリングの時点で内挿を生成します。"内装フィルター" は、[ 1 ] の 8.4.2 章で説明されているように、アルファ を 0.5 に設定した Farrow 放物型フィルターです。内挿に基づき、タイミング誤差がゼロクロッシング Timing Error Detector により生成され ([ 1 ] の 8.4.1 章で説明)、調整可能な比例積分 Loop Filter でフィルター処理され ([ 1 ] の付録 C.2 で説明)、タイミング差を更新するために NCO Control に入力されます。Loop Filter では Loop Bandwidth (サンプルレートで正規化されている) と Loop Damping Factor を調整できます。既定では、正規化ループ帯域幅は 0.01 に設定され、減衰係数は 1 (臨界減衰) に設定されています。これらの設定は、PLL が適切なタイミングにすばやく同期し、位相ノイズがほとんど発生しないようにします。

5) Data Decoder:バーカー コードを使用して、フレーム同期、位相のあいまいさの解決および復調を実行します。また、データ デコーダーは再生成されたメッセージを送信されたものと比較して、BER を計算します。

スコープ

このコンポーネントでは、以下のダイアグラムのプロットによる可視化オプションが提供されています。

  • 正規化された時間遅延を示す時間スコープ

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

  • 受信機側のフィルター処理、さらに搬送波位相とシンボル タイミングの復元の後の受信信号を示すコンスタレーション ダイアグラム

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

テスト対象システム

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

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

for count = 1:prmQPSKTxRx.FrameCount
    transmittedSignal = step(hTx);
    corruptSignal = step(hChan, transmittedSignal, count);
    [RCRxSignal,coarseCompBuffer, timingRecBuffer,BER] = step(hRx,corruptSignal);
    if useScopes
        stepQPSKScopes(hScopes,RCRxSignal,coarseCompBuffer, timingRecBuffer);
    end
end

実行と結果

テスト対象システムのスクリプトを実行して、シミュレートされた QPSK 通信の BER 値を取得するため、以下のコードが実行されます。シミュレーションを実行すると、ビット誤り率のデータといくつかの結果のグラフが表示されます。表示される図はそれぞれ以下のとおりです。

1) Raised Cosine Receive Filter 出力の散布図

2) Raised Cosine Receive Filter 出力のパワー スペクトル

3) Fine Frequency Compensation サブコンポーネントの出力における散布図

4) Timing Recovery サブコンポーネントの出力における推定された (微細な) タイミング差

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.006025.
Number of detected errors = 62.
Total number of compared samples = 10290.

代替の実行オプション

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

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

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

他の探索オプションに関する詳細は、Simulink を使用した QPSK 送信機および受信機の例Simulink を使用した QPSK 送信機および受信機の例を参照してください。

まとめ

この例では、複数の System object を利用して、AWGN チャネルを介したデジタル通信のシミュレーションを実行しています。変調、周波数および位相の復元、タイミング再生、フレーム同期など、QPSK システムの各部分をモデル化する方法が示されています。誤り率測定 System object で BER を取得することでシステム性能を測定しています。生成された C コードが、元の MATLAB コードよりも数倍高速で実行されることも示しています。

付録

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

参考文献

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

この情報は役に立ちましたか?