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

フェージング チャネル

フェージング チャネルの概要

Communications Toolbox™ を使用すれば、オブジェクトまたはブロックを用いてフェージング チャネルを実装できます。レイリーおよびライス フェージング チャネルは、無線通信における実際の現象の有効なモデルです。これらの現象には、マルチパス散乱効果、時間分散、送信側と受信側の間の相対的な運動が原因で起こるドップラー シフトが含まれます。この節では、フェージング チャネルの簡単な概要とツールボックスを利用した実装方法を説明します。

この図は、固定された無線送信機と移動する受信者間の直接パスと、主要な反射パスを表します。影付きの四角形は建物などの反射体を表します。

複数の主要なパスがあるため、受信側では信号が遅延して到達します。さらに、電波信号はそれぞれの主要なパスに対する "局所的な" スケールでの散乱を受けます。一般に、そのような局所的な散乱は、移動体の近くの物体による多数の反射で特徴付けられます。これらの分解できない成分は、受信側で重ね合わされ、"マルチパス フェージング" として知られる現象を起こします。この現象により、それぞれの主要なパスは、離散フェージング パスとして動作します。一般に、フェージング過程は、見通し内パスの方向に対するライス分布とそれ以外の方向に対するレイリー分布によって特徴付けられます。

送信側と受信側の相対的な移動が、ドップラー シフトを引き起こします。一般に、局所的な散乱は移動体のまわりのあらゆる方向から生じます。このシナリオでは、"ドップラー スペクトル" として知られる、ドップラー シフトの広がりを引き起こします。最大ドップラー シフトは、移動体の軌跡と逆方向の局所的な散乱成分に対応します。

チャネル フィルターは、入力信号 Signal in にパス ゲインを適用します。パス ゲインは、フェージング チャネル オブジェクトまたはブロックで選択された設定に基づいて構成されます。

以下のブロックおよびオブジェクトを使用すると、SISO または MIMO フェージング チャネルをモデル化できます。

オブジェクトを使用したフェージング チャネルの実装

オブジェクトを使用して実装するマルチパス伝播シナリオのベースバンド チャネル モデルは以下のとおりです。

  • N 離散フェージング パス。各パスにそれぞれの遅延と平均電力ゲインがあります。N = 1 のチャネルは "周波数フラットなフェージング チャネル" と呼ばれます。N > 1 のチャネルは、十分に広い帯域幅の信号によって、"周波数選択性フェージング パス" になります。

  • 各パスのレイリーまたはライス モデル。

  • 指定できる最大ドップラー シフトの Jakes ドップラー スペクトルを使用した既定のチャネル パス モデル。次のその他のタイプのドップラー スペクトルを使用できます (すべてのパスで同一または異なるタイプを使用できます)。フラット、制限 Jakes、非対称 Jakes、ガウス、二重ガウス、ラウンド、およびベル。

    チャネル オブジェクトの構築時に最大ドップラー シフトが 0 に設定されている場合、または省略されている場合、オブジェクトはチャネルを静的チャネルとしてモデル化します。この設定の場合、時間経過に伴うフェージングはなく、指定したドップラー スペクトルはフェージング処理に影響しません。

遅延とゲインの典型的な値の詳細は、Realistic チャネル プロパティ値の選択を参照してください。

ブロックを使用したフェージング チャネルの実装

Channels ブロック ライブラリには、モバイル通信で実世界の現象をシミュレートできる MIMO および SISO フェージング ブロックが含まれています。これらの現象には、マルチパス散乱効果、および送信側と受信側の間の相対的な運動が原因で起こるドップラー シフトが含まれます。

ヒント

フェージングおよび加法性ホワイト ガウス ノイズの両方を使用したチャネルのモデルを作成するには、AWGN Channel ブロックと直列に接続されたフェージング チャネル ブロックを使用します。ここでは、フェージング チャネル ブロックが最初に表示されます。

MIMO Fading Channel および SISO Fading Channel ブロックは、チャネルのレイリーまたはライス フェージング分布をモデル化するように設定できます。信号パスのタイプに基づいて、使用するフェージング分布を選択します。

信号パスフェージング分布
送信側から受信側への直接的な見通し内パスRician
送信側から受信側への 1 つまたは複数の主要な反射パスRayleigh

複数の主要な反射パスがある場合は、レイリー フェージング分布のために構成されたフェージング チャネル ブロックの単一のインスタンスはすべてを同時にモデルとして作成できます。

状況に適したブロック パラメーターを選択することは重要です。詳細は、Realistic チャネル プロパティ値の選択MIMO Fading Channel、および SISO Fading Channel ブロックのリファレンス ページを参照してください。

フェージング チャネルの可視化

チャネル可視化ツールを使用してフェージング チャネルの特性を表示できます。詳細はチャネルの可視化を参照してください。

フェージング応答のための補正

フェージング チャネルを含む通信システムは、通常、フェージング応答を補正するコンポーネントを必要とします。フェージングを補正するための一般的な方法は以下のとおりです。

  • 差分変調または 1 タップイコライザーは、周波数フラットなフェージング チャネルに対する補正に役立ちます。差分変調を実現する方法については、M-DPSK Modulator Baseband ブロックのリファレンス ページを参照してください。

  • 複数のタップをもつイコライザーは、周波数選択性フェージング チャネルの補正に役立ちます。詳細は、イコライズを参照してください。

Communications Link with Adaptive Equalization の例では、フェージング チャネルの補正が必要な理由を説明しています。

マルチパス フェージング チャネルのシミュレーションの方法論

Communications Toolbox のレイリーおよびライス マルチパス フェージング チャネル シミュレーターは、[1] の節 9.1.3.5.2 の帯域制限離散マルチパス チャネル モデルを使用します。この実装で、チャネルの遅延パワー プロファイルとドップラー スペクトルは分離可能と仮定されます [1]。したがって、マルチパス フェージング チャネルは、線形有限インパルス応答 (FIR) フィルターとしてモデルが作成されます。{si} は、チャネルの入力における一連のサンプルを示します。チャネルの出力におけるサンプル {yi}{si} との関係が次のように表されます。

yi=n=N1N2singn

ここで、{gn} は、以下によって指定される一連のタップ重みです。

gn=k=1Kaksinc[τkTsn]N1nN2

方程式では、次のようになります。

  • Ts はチャネルへの入力サンプル周期です。

  • {τk} (ここで 1kK) は、一連のパス遅延です。K は、マルチパス フェージング チャネル内のパスの合計数です。

  • {ak} (ここで 1kK) は、マルチパス フェージング チャネルの一連の複素パス ゲインです。これらのパス ゲインは相互に相関しません。

  • N1N2 が選択されます。その結果、n が N1 よりも小さい場合または N2 よりも大きい場合、|gn| が小さくなります。

複素パス ゲイン ak の生成には、フィルター処理済みガウス ノイズと正弦波の和の 2 つの手法を使用します。

各パス ゲイン過程 ak は、以下の手順で生成されます。

フィルター処理済みガウス ノイズ手法

  1. 平均 0 と分散 1 をもつ複素数の無相関 (白色) ガウス過程が離散時間で生成されます。

  2. 複素ガウス過程が周波数応答 H(f)=S(f) のドップラー フィルターでフィルター処理されます。ここで、S(f) は目的のドップラー パワー スペクトルを示します。

  3. そのサンプル周期が入力信号のサンプル周期と一致するように、フィルター処理された複素ガウス過程が内挿されます。線形内挿とポリフェーズ内挿が組み合わされて使用されます。

正弦波加算手法

  1. お互いに無相関のレイリー フェージング波形は、[2]の説明にある方法を使用して生成されます。ここで i = 1 は同相成分に対応し、i = 2 は直交成分に対応します。

    zk(t)=μk(1)(t)+jμk(2)(t),k=1,2,,Kμk(i)(t)=2Nkn=1Nkcos(2πfk,n(i)t+θk,n(i)),i=1,2

    ここで

    • Nk は 1 つのパスをモデル化するのに使用される正弦波の数を指定します。

    • fk,n(i) は離散ドップラー周波数であり、1 つのパスに含まれる正弦波成分それぞれについて計算されます。

    • θk,n(i) は、μk(i) の n 番目の成分の位相で、区間 (0,2π] で一様分布をもつ i.i.d. 確率変数です。

    • t はフェージング処理の時間です。

    Jakes ドップラー スペクトルをモデル化する場合、最大シフト値 fmax をもつ離散ドップラー周波数の fk,n(i) は次の式で得られます。

    fk,n(i)=fmaxcos(αk,n(i))=fmaxcos[π2Nk(n12)+αk,0(i)]

    ここで、次の式が成り立ちます。

    αk,0(i)(1)i1π4NkkK+2,i=1,2andk=1,2,,K

  2. 時間どおりにフェージング処理を進めるために、初期時間パラメーターの tinit を挿入します。フェージング波形は次のようになります。

    μk(i)(t)=2Nkn=1Nkcos(2πfk,n(i)(t+tinit)+θk,n(i)),i=1,2

    tinit = 0 のとき、フェージング処理は時間ゼロで開始します。tinit が正の値の場合、継続性を維持しながら時間ゼロを基準としてフェージング処理を進めます。

  3. チャネル フェージングのサンプルは、GMEDS1 [2] アルゴリズムを使用して生成されます。

複素係数の計算

いずれかの手法がもたらす結果の複素過程 zk がスケーリングされ、正しい平均パス ゲインが取得されます。レイリー チャネルの場合、フェージング過程は、次のように取得されます。

ak=Ωkzk

ここで

Ωk=E[|ak|2]

ライス チャネルの場合、フェージング過程は、次のように取得されます。

ak=Ωk[zkKr,k+1+Kr,kKr,k+1ej(2πfd,LOS,kt+θLOS,k)]

ここでKr,k は k 番目のパスのライス K ファクター、fd,LOS,kは k 番目のパスの見通し内成分のドップラー シフト (Hz)、θLOS,kは k 番目のパスの見通し内成分の初期位相 (ラジアン) です。

帯域制限されたマルチパス チャネル モデルへの入力において、送信されたシンボルは、パルス形成によって導入された帯域幅拡張ファクター以上のファクターによってオーバーサンプリングされなければなりません。たとえば、パルス整形信号の帯域幅がシンボル レートと等しい sinc パルス整形が使用された場合、帯域幅拡張ファクターは 1 となり、チャネルへの入力に少なくともシンボルあたり 1 つのサンプルが必要です。ファクターが 1 より大きい RC (レイズド コサイン) フィルターを使用する場合、パルス整形信号の帯域幅はシンボル レートの 2 倍で、したがって帯域幅拡張ファクターは 2 となり、チャネルへの入力に少なくともシンボルあたり 2 つのサンプルが必要です。

チャネル フィルター モデルの特性

チャネル モデルでは、長さ 16 の係数および 1% に限定される遅延エラーの非整数遅延 (FD) 有限インパルス応答 (FIR) バンドパス フィルターを実装します。各離散パスについて、FIR の設計は、係数の 50 の非整数遅延 (0.02、0.04、…、0.98) 候補集合の中から係数の最適セットを選択することによって選択されます。

各離散パスは、その選択された非整数遅延へ丸められます。80% を超える群遅延帯域幅および 90% を超える振幅帯域幅を達成するには、アルゴリズムで非整数遅延の各 FIR 係数値を選択し、同時に次の基準を満たします。

  • 群遅延リップル ≤ 10%

  • 振幅リップル ≤ 2 dB

  • 振幅バンドエッジ減衰 = 3 dB

プロットは、群遅延リップル、振幅リップル、および振幅バンドエッジ減衰の設計基準を満たす帯域幅を示します。

詳細は、MATLAB Central の記事 A Matlab-based Object-Oriented Approach to Multipath Fading Channel Simulation を参照してください。

参考文献

[1] Jeruchim, M. C., Balaban, P., and Shanmugan, K. S., Simulation of Communication Systems, Second Edition, New York, Kluwer Academic/Plenum, 2000.

[2] Pätzold, Matthias, Cheng-Xiang Wang, and Bjorn Olav Hogstand. “Two New Sum-of-Sinusoids-Based Methods for the Efficient Generation of Multiple Uncorrelated Rayleigh Fading Waveforms.” IEEE Transactions on Wireless Communications. Vol. 8, Number 6, 2009, pp. 3122–3131.

フェージング チャネルの指定

Communications Toolbox は、線形 FIR フィルターとしてフェージング チャネルのモデルを作成します。フェージング チャネルを使用した信号のフィルター処理の手順は次のとおりです。

  1. 使用するチャネルを記述するチャネル オブジェクトを作成します。チャネル オブジェクトは、チャネルについての情報 (最大ドップラー シフトなど) を含む MATLAB 変数の一種です。

  2. 必要に応じて、チャネル オブジェクトのプロパティを調整します。たとえば、パス遅延や平均パス ゲインを変更できます。

  3. オブジェクトの呼び出しを利用してチャネル オブジェクトを信号に適用します。

この節では、チャネル オブジェクトの定義、調査、操作方法を説明します。トピックは、以下のとおりです。

チャネル オブジェクトの作成

モデル化の状況に適切なフェージング チャネル オブジェクトを作成するには、以下の System object からいずれかを選択します。

関数オブジェクトモデルを作成する状況

comm.RayleighChannel

レイリー フェージング チャネル オブジェクト1 つまたは複数の主要な反射パス

comm.RicianChannel

ライス フェージング チャネル オブジェクト1 つの直接的な見通し内パス (1 つまたは複数の主要な反射パスとの組み合わせもあり)

たとえば、このコマンドは、100,000 Hz でサンプリングされた信号に作用するレイリー フェージング チャネルを表すチャネル オブジェクトを作成します。チャネルの最大ドップラー シフトは、130 Hz です。

rayChan1 = comm.RayleighChannel('SampleRate',1e5,...
               'MaximumDopplerShift',130); % Rayleigh fading channel object

rayChan1 フェージング チャネル オブジェクトを呼び出し、チャネルを介して送信される信号をフィルター処理するには、フェージング チャネルの利用を参照してください。

オブジェクトの複製とコピー

既存のオブジェクトを複製してから、必要に応じて新しいオブジェクトのプロパティを調整することで、別のオブジェクトを作成することもできます。オブジェクトを複製するには、常に以下のように関数 copy を使用します。

rayChan2 = copy(rayChan1); % Copy rayChan1 to create an independent rayChan2.

rayChan2 = rayChan1 は使用しません。copy コマンドは、rayChan1 に依存しない rayChan1 のコピーを作成します。一方、コマンド rayChan2 = rayChan1 は、rayChan1 への単なる参照として rayChan2 を作成するので、rayChan1rayChan2 の内容は区別できません。

オブジェクト プロパティの表示と変更

チャネル オブジェクトには、チャネル モデル、既に信号をフィルター処理したチャネルの状態、将来の信号へのチャネル操作などに関する情報を記録する多数のプロパティがあります。

次の方法で、プロパティを表示できます。

  • チャネル オブジェクトのすべてのプロパティを表示するには、コマンド ウィンドウでオブジェクトの名前を入力します。

  • オブジェクトの名前、ドット (ピリオド)、プロパティの名前の順に入力することで、チャネル オブジェクトのプロパティを表示する、または変数に値を割り当てることができます。

チャネル オブジェクトの書き換え可能なプロパティは、次の方法で変更できます。

  • チャネル オブジェクト プロパティの既定値を変更するには、オブジェクト作成の構文で目的の値を入力します。

  • チャネル オブジェクトの書き込み可能なプロパティの値を変更するには、ドット表記を使用する代入ステートメントをチャネル オブジェクトで実行します。ドット表記とは、具体的には、オブジェクトの名前、ドット、プロパティの名前の順に構成する表現です。

レイリー チャネル オブジェクト プロパティの表示

レイリー チャネル オブジェクトを作成します。オブジェクトを表示して、既定で初期化されたプロパティと、オブジェクトの作成時に指定されたプロパティを確認します。rayChan を入力すると、チャネル オブジェクトのすべてのプロパティが表示されます。一部のプロパティ値はオブジェクトの作成時に割り当てられ、他のプロパティは既定値をもちます。特定のチャネル プロパティの詳細は、comm.RayleighChannelオブジェクトのリファレンス ページを参照してください。

rayChan = comm.RayleighChannel('SampleRate',1e5,'MaximumDopplerShift',130);
rayChan % View all the properties
rayChan = 
  comm.RayleighChannel with properties:

             SampleRate: 100000
             PathDelays: 0
       AveragePathGains: 0
     NormalizePathGains: true
    MaximumDopplerShift: 130
        DopplerSpectrum: [1x1 struct]

  Show all properties

g = rayChan.AveragePathGains % Retrieve the AveragePathGains property of rayChan
g = 0

ライス チャネル オブジェクト プロパティの調整

ライス フェージング チャネル オブジェクトには、レイリー フェージング チャネル オブジェクトに対しては表示されない、上記以外の追加プロパティとしてスカラーの KFactor プロパティがあります。ライス チャネル プロパティの詳細は、comm.RicianChannelオブジェクトのリファレンス ページを参照してください。

ライス チャネル オブジェクト プロパティの変更

ライス チャネル オブジェクトを作成します。Visualization プロパティの既定の設定は 'Off' です。既定の設定を 'Impulse response' に変更すると、オブジェクトの呼び出し時に出力信号のインパルス応答プロットが生成されます。

ricChan= comm.RicianChannel; % Create object
ricChan.Visualization = 'Impulse response' % Enables the impulse response channel visualization
ricChan = 
  comm.RicianChannel with properties:

                SampleRate: 1
                PathDelays: 0
          AveragePathGains: 0
        NormalizePathGains: true
                   KFactor: 3
    DirectPathDopplerShift: 0
    DirectPathInitialPhase: 0
       MaximumDopplerShift: 1.0000e-03
           DopplerSpectrum: [1x1 struct]

  Show all properties

出力には、チャネル オブジェクトのすべてのプロパティのサブセットが表示されます。ricChan の完全なプロパティのセットを表示するには、all properties を選択します。

チャネル オブジェクト プロパティ間の関係

チャネル オブジェクトのプロパティには互いに関連しているものがあり、あるプロパティの値が変更されると、チャネル オブジェクトの整合性を維持するため、他のプロパティの値も何らかの適切な方法で変更しなければなりません。たとえば、PathDelays のベクトル長を変更する場合は、AveragePathGains の値を変更して、そのベクトル長が PathDelays の新しい値に等しくなるようにしなければなりません。これは、2 つのベクトルそれぞれの長さがチャネルの離散的なパスの数に等しいためです。リンクされたプロパティと例の詳細は、comm.RayleighChannel または comm.RicianChannel を参照してください。

フェージング チャネルのドップラー スペクトルの指定

チャネル オブジェクトのドップラー スペクトルは、その DopplerSpectrum プロパティを介して指定します。このプロパティの値は、次のいずれかでなければなりません。

  • ドップラー オブジェクト。この場合、同じドップラー スペクトルがチャネル オブジェクトの各パスに適用されます。

  • PathDelays ベクトル プロパティと同じ長さのドップラー オブジェクトのセル配列。この場合、各パスのドップラー スペクトルは、ベクトル内の対応するドップラー オブジェクトによって提供されます。

    • PathDelays プロパティのベクトルの長さが大きくなると、Jakes ドップラー オブジェクトが付加されて PathDelays の長さに一致するように DopplerSpectrum の長さが自動的に大きくなります。

    • PathDelays ベクトル プロパティの長さが小さくなると、最後のドップラー オブジェクトが削除されて PathDelays の長さに一致するように DopplerSpectrum の長さが自動的に小さくなります。

ドップラー オブジェクトは、最大ドップラー シフトを除き、チャネル オブジェクトのプロパティであるドップラー スペクトルを特徴付けるために使用されるすべてのプロパティを含みます。この節では、ドップラー オブジェクトを作成および操作する方法と、ドップラー オブジェクトをチャネル オブジェクトの DopplerSpectrum プロパティに割り当てる方法について説明します。

ドップラー オブジェクトの作成

ドップラー オブジェクトを作成するには、関数 doppler を使用します。関数 doppler は、チャネル オブジェクトの DopplerSpectrum プロパティの値を指定するために使用するドップラー オブジェクトを作成するためのものです。以下から選択します。

  • doppler('Jakes')

  • doppler('Flat')

  • doppler('Rounded', ...)

  • doppler('Bell', ...)

  • doppler('Asymmetric Jakes', ...)

  • doppler('Restricted Jakes', ...)

  • doppler('Gaussian', ...)

  • doppler('BiGaussian', ...)

たとえば、チャネルの最大ドップラー シフトによって正規化標準偏差 0.1 をもつガウス スペクトルは次のように作成できます。

dopp1 = doppler('Gaussian',0.1);

メモ

ドップラー オブジェクトの作成時には、次の依存関係を考慮します。

  • DopplerSpectrum に単一のドップラー スペクトル構造体を割り当てると、すべてのパスは同じ指定されたドップラー スペクトルをもちます。

  • FadingTechnique プロパティが 'Sum of sinusoids' の場合、DopplerSpectrumdoppler('Jakes') でなければなりません。

  • 別の (前述のリストから選択できる) ドップラー スペクトル構造体の行セル配列を DopplerSpectrum に代入すると、各パスは、セル配列の対応する構造体により指定されるドップラー スペクトルをもちます。この場合、DopplerSpectrum の長さは PathDelays の長さと同じでなければなりません。

  • C コードを生成するには、DopplerSpectrum を単一のドップラー スペクトル構造体に指定します。

ドップラー オブジェクトの複製

チャネル オブジェクトの場合と同様に、ドップラー オブジェクトは関数 copy を使用して複製できます。コマンドは次のとおりです。

dopp2 = copy(dopp1);

上記のコマンドは、dopp1 と同じプロパティをもつドップラー オブジェクト dopp2 を作成します。dopp1dopp2 はドップラー オブジェクトの別々のインスタンスなので、一方を変更しても、もう一方には影響しません。代わりに dopp1 = dopp2 を使用すると、dopp1dopp2 の両方がドップラー オブジェクトの同じインスタンスを参照するので、一方を変更すると、もう一方も変更されます。

ドップラー オブジェクト プロパティの表示と変更

ドップラー オブジェクト プロパティを表示および変更する構文は、チャネル オブジェクトの場合と同じです (オブジェクト プロパティの表示と変更を参照してください)。

doppler オブジェクトの作成、変更、および表示

既定のプロパティでラウンド型ドップラー オブジェクトを作成して表示し、その Polynomial プロパティの 3 番目の要素を変更します。

doppRound = doppler('Rounded')
doppRound = struct with fields:
    SpectrumType: 'Rounded'
      Polynomial: [1 -1.7200 0.7850]

多項式の 3 番目の係数を調整します。

doppRound.Polynomial(3) = 0.825
doppRound = struct with fields:
    SpectrumType: 'Rounded'
      Polynomial: [1 -1.7200 0.8250]

すべてのドップラー オブジェクトに共通するプロパティ SpectrumType は読み取り専用です。このプロパティはオブジェクトの構築時に自動的に指定され、変更することはできません。別のドップラー スペクトル タイプを使用する場合は、目的のタイプの新しいドップラー オブジェクトを作成する必要があります。

チャネル オブジェクト内でのドップラー オブジェクトの使用

チャネル オブジェクトの DopplerSpectrum プロパティは、それをドップラー オブジェクト、またはドップラー オブジェクトのベクトルに割り当てることによって変更できます。

フラット型ドップラー スペクトルをもつレイリー チャネルの作成

次の例は、構築されたレイリー チャネル オブジェクトの既定の Jakes ドップラー スペクトルをフラット型ドップラー スペクトルに変更する方法を示します。

レイリー チャネル オブジェクトの作成

サンプルレートを 9600 Hz に、最大ドップラー シフトを 100 Hz に設定します。

rayChan = comm.RayleighChannel('SampleRate',9600, 'MaximumDopplerShift',100)
rayChan = 
  comm.RayleighChannel with properties:

             SampleRate: 9600
             PathDelays: 0
       AveragePathGains: 0
     NormalizePathGains: true
    MaximumDopplerShift: 100
        DopplerSpectrum: [1x1 struct]

  Show all properties

rayChan.DopplerSpectrum
ans = struct with fields:
    SpectrumType: 'Jakes'

ドップラー スペクトルの変更

フラット型ドップラー オブジェクトを作成して rayChan オブジェクトに割り当てます。

doppFlat = doppler('Flat')
doppFlat = struct with fields:
    SpectrumType: 'Flat'

rayChan.DopplerSpectrum = doppFlat
rayChan = 
  comm.RayleighChannel with properties:

             SampleRate: 9600
             PathDelays: 0
       AveragePathGains: 0
     NormalizePathGains: true
    MaximumDopplerShift: 100
        DopplerSpectrum: [1x1 struct]

  Show all properties

rayChan.DopplerSpectrum
ans = struct with fields:
    SpectrumType: 'Flat'

ガウス ドップラー スペクトルをもつライス チャネルの作成

次の例は、構築されたライス チャネル オブジェクトの既定の Jakes ドップラー スペクトルを正規化標準偏差 0.3 をもつガウス ドップラー スペクトルに変更して、DopplerSpectrum プロパティを表示し、正規化標準偏差の値を 1.1 に変更する方法を示します。

ライス チャネル オブジェクトの作成

サンプルレートを 9600 Hz に、最大ドップラー シフトを 100 Hz に、K ファクターを 2 に設定します。

ricChan = comm.RicianChannel('SampleRate',9600, 'MaximumDopplerShift',100, 'KFactor',2)
ricChan = 
  comm.RicianChannel with properties:

                SampleRate: 9600
                PathDelays: 0
          AveragePathGains: 0
        NormalizePathGains: true
                   KFactor: 2
    DirectPathDopplerShift: 0
    DirectPathInitialPhase: 0
       MaximumDopplerShift: 100
           DopplerSpectrum: [1x1 struct]

  Show all properties

ricChan.DopplerSpectrum
ans = struct with fields:
    SpectrumType: 'Jakes'

ドップラー スペクトルの変更

正規化された標準偏差 0.3 をもつガウス ドップラー オブジェクトを作成し、ricChan オブジェクトに割り当てます。

doppGaus = doppler('Gaussian',0.3)
doppGaus = struct with fields:
                   SpectrumType: 'Gaussian'
    NormalizedStandardDeviation: 0.3000

ricChan.DopplerSpectrum = doppGaus
ricChan = 
  comm.RicianChannel with properties:

                SampleRate: 9600
                PathDelays: 0
          AveragePathGains: 0
        NormalizePathGains: true
                   KFactor: 2
    DirectPathDopplerShift: 0
    DirectPathInitialPhase: 0
       MaximumDopplerShift: 100
           DopplerSpectrum: [1x1 struct]

  Show all properties

ricChan.DopplerSpectrum
ans = struct with fields:
                   SpectrumType: 'Gaussian'
    NormalizedStandardDeviation: 0.3000

ricChan.DopplerSpectrum.NormalizedStandardDeviation = 1.1;
ricChan.DopplerSpectrum
ans = struct with fields:
                   SpectrumType: 'Gaussian'
    NormalizedStandardDeviation: 1.1000

独立したドップラー スペクトルを使用したレイリー チャネルの作成

次の例は、構築された 3 パス レイリー チャネル オブジェクトの既定の Jakes ドップラー スペクトルを別のドップラー スペクトルの cell 配列に変更し、3 番目のパスのドップラー スペクトルのプロパティを変更する方法を示します。

レイリー チャネル オブジェクトの作成

サンプルレートを 9600 Hz に、最大ドップラー シフトを 100 Hz に設定します。また、01e-4、および 2.1e-4 seconds のパス遅延を指定します。

rayChan = comm.RayleighChannel('SampleRate',9600, 'MaximumDopplerShift',100, 'PathDelays',[0 1e-4 2.1e-4])
rayChan = 
  comm.RayleighChannel with properties:

             SampleRate: 9600
             PathDelays: [0 1.0000e-04 2.1000e-04]
       AveragePathGains: 0
     NormalizePathGains: true
    MaximumDopplerShift: 100
        DopplerSpectrum: [1x1 struct]

  Show all properties

rayChan.DopplerSpectrum
ans = struct with fields:
    SpectrumType: 'Jakes'

ドップラー スペクトルの変更

各パスに対して独立したドップラー スペクトルをもつ DopplerSpectrum プロパティをセル配列として指定します。

rayChan.DopplerSpectrum = {doppler('Flat') doppler('Flat') doppler('Rounded')}
rayChan = 
  comm.RayleighChannel with properties:

             SampleRate: 9600
             PathDelays: [0 1.0000e-04 2.1000e-04]
       AveragePathGains: 0
     NormalizePathGains: true
    MaximumDopplerShift: 100
        DopplerSpectrum: {[1x1 struct]  [1x1 struct]  [1x1 struct]}

  Show all properties

rayChan.DopplerSpectrum{:}
ans = struct with fields:
    SpectrumType: 'Flat'

ans = struct with fields:
    SpectrumType: 'Flat'

ans = struct with fields:
    SpectrumType: 'Rounded'
      Polynomial: [1 -1.7200 0.7850]

3 番目のパスの Polynomial プロパティを変更します。

rayChan.DopplerSpectrum{3}.Polynomial = [1 -1.21 0.7]
rayChan = 
  comm.RayleighChannel with properties:

             SampleRate: 9600
             PathDelays: [0 1.0000e-04 2.1000e-04]
       AveragePathGains: 0
     NormalizePathGains: true
    MaximumDopplerShift: 100
        DopplerSpectrum: {[1x1 struct]  [1x1 struct]  [1x1 struct]}

  Show all properties

rayChan.DopplerSpectrum{:}
ans = struct with fields:
    SpectrumType: 'Flat'

ans = struct with fields:
    SpectrumType: 'Flat'

ans = struct with fields:
    SpectrumType: 'Rounded'
      Polynomial: [1 -1.2100 0.7000]

チャネル オブジェクトの設定

チャネル オブジェクトを使って信号をフィルター処理する前に、チャネルのプロパティがモデルを作成したい状況に対して適切な値をもつことを確かめてください。この節では、モデル作成ニーズに適した、実際的な値を選択に役立つ指針をいくつか提供します。トピックは、以下のとおりです。

チャネル オブジェクトのプロパティの値の表示と変更のための構文は、フェージング チャネルの指定で説明されています。

Realistic チャネル プロパティ値の選択

Realistic チャネルを記述するプロパティ値を選択するためのいくつかのヒントがあります。

パス遅延

  • 慣例により、最初の遅延は一般にゼロに設定されます。最初の遅延は、最初の到着経路に相当します。

  • 屋内環境では、最初のもの以降のパス遅延は、一般には 1e-9 秒から 1e-7 秒までの範囲にあります。

  • 屋外環境では、最初のもの以降のパス遅延は、一般には 1e-7 秒から 1e-5 秒までの範囲にあります。この範囲の非常に大きな遅延は、たとえば、山で囲まれている地域にあてはまります。

  • 離散的なパスを分解する信号の能力は、帯域幅に関連しています。最大と最小のパス遅延の差がシンボル周期のおよそ 1% よりも小さい場合、信号は 1 つの離散的なパスのみがあるかのようにチャネルを通ります。

平均パス ゲイン

  • チャネル オブジェクト内の平均パス ゲインは、各フェージング パスの平均電力ゲインを表します。実際には、平均パス ゲインの値は、絶対値の大きい負の dB 値です。しかし、コンピューター モデルは、一般に -20 dB と 0 dB の間の平均パス ゲインを使用します。

  • 平均パス ゲインのベクトルの dB 値は、しばしば、遅延の関数としておおよそ線形に減少しますが、特定の遅延の概要は伝播環境に依存します。

  • 結合されたパス ゲインの予想される総出力を 1 とするために、チャネル オブジェクトの NormalizePathGains プロパティによってパス ゲインを正規化できます。

最大ドップラー シフト

  • 標準 GSM (Global System for Mobile Communication) システムのような無線アプリケーションには、移動体の速度から見てドップラー シフトを指定することが望ましいです。移動体が速度 v (m/s) で移動する場合、最大ドップラー シフトは次のように計算されます。ここで、f はヘルツ単位の送信搬送周波数で、c は光速 (3e8m/s) です。

    fd=vfc

  • この式に基づき、移動体の速度から見ると、高速道路を移動している車からの信号は、およそ 80Hz の最大ドップラー シフトを起こす可能性があります。一方、移動している歩行者からの信号は、およそ 4Hz の最大ドップラー シフトを起こす可能性があります。次の図では、900MHz の送信搬送周波数を仮定します。

  • 最大ドップラー シフト 0 は、レイリー分布またはライス分布によってもたらされる静的なチャネルに相当します。

ライス フェージング チャネルに対する K ファクター

  • ライス K ファクターは、見通し内伝播路に対する反射と乱反射の強度比を指定します。比は線形に表されます。dB 単位ではありません。

  • ライス フェージングに対して、K ファクターは一般に 1 と 10 の間にあります。

  • レイリー フェージングに相当する 0 の K ファクター

ドップラー スペクトル パラメーター

  • パラメーターとその意味の説明については、対応する Doppler オブジェクトの doppler のリファレンス ページを参照してください。

シミュレーションの必要性に基づいたチャネル オブジェクトの設定

フィルター処理過程のカスタマイズのためにチャネル オブジェクトを設定するためのヒントがあります。

  • データが一連のベクトルに分割される (たとえば、ループ内で処理する) 場合、チャネル オブジェクトを複数回 (ループ内での反復ごとに) 呼び出すことができます。チャネルの状態情報は更新され、呼び出し後に毎回保存されます。チャネル出力は、データの分割方法 (ベクトル長) には関係しません。

  • チャネル出力を繰り返し可能にする場合は、チャネル オブジェクトの RandomStream プロパティのシード オプションを選択します。出力を繰り返すには、オブジェクト関数 reset を呼び出して内部フィルターと内部乱数発生器の両方をリセットします。

  • 不連続に送信されるデータをモデル化する場合、チャネル オブジェクトの FadingTechnique プロパティを 'Sum of sinusoids' に、InitialTimeSource プロパティを 'Input port' に設定します。オブジェクトの呼び出し時には、入力を使用するチャネルによって処理されるデータ ベクトル/フレームの開始時間を指定します。

  • パス ゲインの強度の総和の期待値が 1 となる (チャネルは追加の電力ゲインまたは損失に寄与しない) ようにフェージング処理を正規化したい場合は、チャネル オブジェクトの NormalizePathGains プロパティを true に設定します。

フェージング チャネルの利用

フェージング チャネルの指定で説明されているようにチャネル オブジェクトを作成した後、オブジェクトを呼び出してチャネルを介して信号を渡すことができます。チャネル オブジェクトに対して入力引数として信号を入力します。フィルター処理操作の最後で、チャネル オブジェクトはその状態を、入力引数としてオブジェクトを使用してオブジェクト関数 info を呼び出すことで、最終的なパス ゲインやチャネルが処理したサンプルの総数を調べることができるように保持します。

基本的な構文と状態の保持を示す例については、フェージングした信号の強度を参照してください。

チャネルの特徴を可視化するには、Visualization プロパティを 'Impulse response''Frequency response'、または 'Doppler spectrum' に設定します。詳細はチャネルの可視化を参照してください。

3 つのパスのレイリー チャネルの可視化

次の例は、チャネルのインパルス応答の可視化方法を示しています。

チャネル オブジェクトの作成

チャネル オブジェクトの作成中に、名前と値のペアを使用して Visualization プロパティを

'Impulse response' に設定します。

rayChan = comm.RayleighChannel('SampleRate',100000,'MaximumDopplerShift',130,...
    'PathDelays',[0 1.5e-5 3.2e-5],'AveragePathGains',[0, -3, -3],...
    'Visualization','Impulse response');

ビット ストリームを生成し、変調器オブジェクトを作成します。ビット ストリームを変調し、

チャネル オブジェクトを呼び出すことで、変調した DBPSK 信号をチャネル経由で渡します。

tx = randi([0 1],500,1);
dbspkMod = comm.DBPSKModulator;
dpskSig = dbspkMod(tx);
y = rayChan(dpskSig);

オブジェクトの呼び出し時に、インパルス応答がプロットされます。

レイリー フェージング チャネル

次の例では、フェージング チャネルを使用します。

フェージングした信号の強度

次の例では、フェージングされた信号の強度をサンプル数に対してプロットします。comm.RayleighChannelフェージング チャネル オブジェクトの作成および呼び出しの構文、およびチャネル オブジェクトの状態の保持を示します。

rayChan = comm.RayleighChannel('SampleRate',10000,'MaximumDopplerShift',100);
sig = j*ones(2000,1); % Signal
out = rayChan(sig); % Pass signal through channel.
rayChan % Display all properties of the channel object.
rayChan = 
  comm.RayleighChannel with properties:

             SampleRate: 10000
             PathDelays: 0
       AveragePathGains: 0
     NormalizePathGains: true
    MaximumDopplerShift: 100
        DopplerSpectrum: [1x1 struct]

  Show all properties

% Plot power of faded signal, versus sample number.
plot(20*log10(abs(out)))

フェージング条件での DBPSK の実測パフォーマンスと理論パフォーマンス

次の例は、周波数フラットなレイリー フェージング チャネル オブジェクトを作成し、それを呼び出して単一ベクトルから成る DBPSK 信号を処理します。S/N 比の異なる値に対して、ビット誤り率を計算します。AWGN の前にフェージング チャネル フィルターが適用されます。これは、フェージングを AWGN と組み合わせる場合に使用することが推奨される順序です。

レイリー フェージング チャネル、変調器、および復調器オブジェクトの作成

chan = comm.RayleighChannel('SampleRate',1e4,'MaximumDopplerShift',100);

変調次数を 2 に設定して、DBPSK 変調器および復調器オブジェクトを作成します。DBPSK 変調データを生成し、チャネルを通して渡します。

M = 2; % DBPSK modulation order
tx = randi([0 M-1],50000,1); % Generate a random bit stream

mod = comm.DBPSKModulator;
demod = comm.DBPSKDemodulator;

dpskSig = mod(tx);
fadedSig = chan(dpskSig); % Apply the channel effects

AWGN チャネル オブジェクトと誤り率計算機オブジェクトを作成します。

awgnChan = comm.AWGNChannel('NoiseMethod', 'Signal to noise ratio (SNR)');
errorCalc = comm.ErrorRate;

SNR の異なる値に対して誤り率を計算します。

SNR = 0:2:20; % Range of SNR values, in dB.
numSNR = length(SNR);
berVec = zeros(3, numSNR); % Preallocate a vector for BER results 

for n = 1:numSNR
   awgnChan.SNR = SNR(n);
   rxSig = awgnChan(fadedSig); % Add Gaussian noise
   rx = demod(rxSig);  % Demodulate
   reset(errorCalc)
  
   berVec(:,n) = errorCalc(tx,rx); % Compute error rate.
end
BER = berVec(1,:);

比較のため、理論上の性能結果を計算します。

BERtheory = berfading(SNR,'dpsk',M,1);

BER の結果をプロットします。

semilogy(SNR,BERtheory,'b-',SNR,BER,'r*');
legend('Theoretical BER','Empirical BER');
xlabel('SNR (dB)'); ylabel('BER');
title('Binary DPSK over Rayleigh Fading Channel');

チャネル フィルターの遅延の処理

ChannelFilterDelay プロパティの値は、チャネルの出力が入力より遅延するサンプル数です。入力データ セットと出力データ セットを直接比較する場合、適切な丸めやパディング操作を使うことによって遅延を考慮しなければなりません。

この例は、ビット誤り率を計算する前に遅延を考慮する 1 つの方法を示します。

変調次数を 2 に設定して、DBPSK 変調器および復調器オブジェクトを作成します。DBPSK 変調データを生成し、チャネルを通して渡します。

bitRate = 50000;
M = 2; % DQPSK modulation order

mod = comm.DBPSKModulator;
demod = comm.DBPSKDemodulator;

レイリー フェージング チャネル オブジェクトを作成します。

rayChan = comm.RayleighChannel('SampleRate',bitRate,'MaximumDopplerShift',4,...
    'PathDelays',[0 0.5/bitRate],'AveragePathGains',[0 -10]);
chInfo = info(rayChan);
delay = chInfo.ChannelFilterDelay;

ランダム ビット ストリーム データを生成します。データを変調し、フェージング チャネルを経由して渡し、復調します。

tx = randi([0 M-1],50000,1);

dpskSig = mod(tx);
fadedSig = rayChan(dpskSig);
rx = demod(fadedSig);

遅延を考慮してビット誤り率を計算します。

errorCalc = comm.ErrorRate('ReceiveDelay', delay);
berVec = step(errorCalc,tx,rx);
ber = berVec(1)
ber = 0.0147
num = berVec(2)
num = 737

for ループを使用したチャネルのフィルター処理

次の例では、forループ内のレイリー フェージング チャネルを介して入力データをフィルター処理しています。アニメーションの効果のために逐次代入法からの小さなデータ セットを使用します。レイリー フェージング チャネルは、2 つの離散的な主要パスをもっています。ある呼び出しから次の呼び出しへの連続性を維持しながら、チャネルを介してデータを複数回フィルター処理する方法についての情報は、シミュレーションの必要性に基づいたチャネル オブジェクトの設定を参照してください。

パラメーターを設定します。50e3 Hz のビット レートおよび 125 のループ反復回数を指定します。QPSK 変調器およびレイリー フェージング チャネル オブジェクトを作成します。

bitRate = 50000;    % Data rate is 50 kb/s
numTrials = 125;    % Number of iterations of loop

M = 4; % QPSK modulation order
qpskMod = comm.QPSKModulator;

rayChan = comm.RayleighChannel('SampleRate',bitRate,'MaximumDopplerShift',4,'PathDelays',[0 2e-5],'AveragePathGains',[0 -9]);

散布図を初期化します。

scatterPlot = comm.ConstellationDiagram;

ループ内でチャネルを適用して、連続性を維持します。各反復で現在のデータのみをプロットします。

for n = 1:numTrials
   tx = randi([0 M-1],500,1); % Generate random bit stream
   pskSig = qpskMod(tx); % PSK modulate signal
   fadedSig = rayChan(pskSig); % Apply channel effects

   % Plot the new data from this iteration.
   update(scatterPlot,fadedSig);
end

ライス フェージング チャネル

準静的なチャネル モデル作成

一般に、フェージング チャネルのパス ゲインは、1/(100fd) 秒の周期にわたってわずかに変化します。ここで、fd は最大ドップラー シフトです。この周期は、多くの最新の無線データ アプリケーションで非常に多くのビット数に相当するので、フェージングの統計的に重要な範囲の性能を評価するためには、膨大なデータのシミュレーションが必要になります。準静的チャネル モデルの作成は、次のステップを使って実行できる、さらに扱いが容易な方法を提供します。

  1. 最大ドップラー シフト 0 を使って、ランダムなチャネルの実現を作成

  2. 膨大なビット数の処理

  3. 誤り統計量の計算

  4. これらのステップを何度も繰り返して、性能の尺度の分布を作成

以下の例は、準静的なチャネル モデル作成の方法を示します。

変調次数を 4 に設定して、変調器および復調器 System object を作成します。

M = 4;
dpskMod = comm.DPSKModulator('ModulationOrder', M);
dpskDemod = comm.DPSKDemodulator('ModulationOrder', M);
numBits = 10000; % Each trial uses 10000 bits.
numTrials = 20;  % Number of BER computations

メモ: 実際には、正確な減少の見込みまたはパケット誤り率を推定するには、numTrials

は大きな数になる場合があります。ここでの 20 は、単に例をより高速に実行するものとして使用します。

ライス チャネル オブジェクトを作成し、最大ドップラー シフトをゼロに設定します。

ricianChan = comm.RicianChannel('KFactor',3,'MaximumDopplerShift',0);

for ループ内では、ランダム ビット ストリームを生成して、信号を DPSK 変調し、変調した

信号をライス フェージングおよび AWGN チャネルによりフィルター処理し、フェージングされた信号を復調します。

nErrors = zeros(1,numTrials);
for n = 1:numTrials
   tx = randi([0 M-1],numBits,1);  % Generate random bit stream
   dpskSig = dpskMod(tx);          % DPSK modulate signal
   fadedSig = ricianChan(dpskSig); % Apply channel effects
   rxSig = awgn(fadedSig,15,'measured'); % Add Gaussian noise.
   rx = dpskDemod(rxSig);          % Demodulate.

シンボル誤りの数を計算します。DPSK の初期条件のため、最初のサンプルは無視します。

   nErrors(n) = symerr(tx(2:end),rx(2:end))
end
nErrors = 1×20

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

nErrors = 1×20

     0     0     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

例が実行されている間、コマンド ウィンドウには、増加していくベクトル nErrors のシンボル誤り数の

リストが表示されます。さらに、最後にパケット誤り率も表示されます。下記のサンプルの

出力は、nErrors の最終的な値を示し、中間の値を省略します。例の

ランダム性のために結果は異なる場合があります。

per = mean(nErrors > 0) % Proportion of packets that had errors
per = 0.0500

準静的な手法の詳細

準静的なチャネル モデル作成の方法で計算を保存できるかを示す例として、搬送周波数が 2.4GHz、移動体の速度が 1m/s、ビット レートが 10Mb/s であるような、無線 LAN を考えます。次の式は、チャネルが 12,500 ビットに変更されることを示します。

(1100fd s)(10 Mb/s)=(c100vf s)(10 Mb/s)=3×108m/s100(1 m/s)(2.4 GHz)(10 Mb/s)=12,500 b

このシステムの誤り率を計算する従来のモンテカルロ法は、上で示すように何千回もの、おそらく数千万ビット、ビット数をシミュレートすることが必要です。一方、準静的なチャネル モデル作成の方法は、100 個の位置のそれぞれにおいて、誤り率の特定の分布に達するように、少数のパケットをシミュレートします。この分布から、たとえば、通信回線が屋内のランダムな位置に対してどれほど信頼性があるかを決定できます。各シミュレーションが 5,000 ビットを含む場合、100 シミュレーションは、全部で 50万ビットを処理します。これは、従来のモンテカルロ法に比べて、大幅に少ないビット数です。

フェージング チャネルの利用に関する追加の例

次のモデルはフェージング チャネルを使用します。