Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

フェージング チャネル

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

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

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

Direct and major reflected paths between a stationary radio transmitter and a moving receiver.

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

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

チャネル フィルターは、入力信号 Signal in にパス ゲインを適用します。パス ゲインは、フェージング チャネル オブジェクトまたはブロックで選択された設定に基づいて、ガウス フィルター処理されたノイズまたは正弦波加算手法のいずれかを使用して計算されます。

Block diagram showing the addition of path gains to the input signal as it passes through the channel.

以下のブロックおよびオブジェクトを使用すると、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 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 つのサンプルが必要です。

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

チャネル フィルターでは、0、0.02、0.04、…、0.98 における各候補の非整数遅延に対して長さ 16 の係数を使用して非整数遅延 (FD) 有限インパルス応答 (FIR) バンドパス フィルターを実装します。

各離散パスは、その最も近い候補の非整数遅延へ丸められ、遅延エラー制限はサンプル時間の 1% になります。80% を超える群遅延帯域幅および 90% を超える振幅帯域幅を達成するには、アルゴリズムで各非整数遅延の最適な FIR 係数値を選択し、同時に次の基準を満たします。

  • 群遅延リップル ≤ 10%

  • 振幅リップル ≤ 2 dB

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

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

参考文献

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

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

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

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

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

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

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

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

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

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

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

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

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

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

レイリー チャネル オブジェクトを作成し、プロパティ値を表示します。一部のプロパティ値はオブジェクトの作成時に割り当てられ、他のプロパティは既定値をもちます。個々のプロパティの値を取得します。特定のチャネル プロパティの詳細については、comm.RayleighChannelオブジェクトのリファレンス ページを参照してください。

rayChan = comm.RayleighChannel( ...
    SampleRate=1e5, ...
    MaximumDopplerShift=130)
rayChan = 
  comm.RayleighChannel with properties:

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

  Use get to show all properties

g = rayChan.AveragePathGains
g = 0

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

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

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

ライス チャネル オブジェクトを作成します。Visualization プロパティの既定の設定を 'Off' から 'Impulse response' に変更して、オブジェクトの呼び出し時に出力信号のインパルス応答プロットが生成されるようにします。出力には、チャネル オブジェクトのすべてのプロパティのサブセットが表示されます。ricChan の完全なプロパティのセットを表示するには、all properties を選択します。

ricChan= comm.RicianChannel;
ricChan.Visualization = 'Impulse response'
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]
          ChannelFiltering: true
       PathGainsOutputPort: false

  Use get to show all properties

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

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

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

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

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

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

    • 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') でなければなりません。

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

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

ドップラー スペクトル構造体プロパティの表示と変更

ドップラー スペクトルのタイプを 'Rounded' に指定することによってドップラー スペクトル構造体を作成し、多項式タイプの設定を変更します。

既定のプロパティでラウンド型ドップラー スペクトル構造体を作成して表示し、その 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]

ドップラー スペクトル構造体は無効な構成に変更できることに注意してください。構造体がフェージング チャネル オブジェクトによって使用されるときに、ドップラー スペクトル構造体の設定の検証が実行されます。上記で定義した doppRound スペクトル構造体は有効です。

ricianCh = comm.RicianChannel('DopplerSpectrum',doppRound)
ricianCh = 
  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]
          ChannelFiltering: true
       PathGainsOutputPort: false

  Use get to show all properties

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

チャネル オブジェクトの 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]
       ChannelFiltering: true
    PathGainsOutputPort: false

  Use get to 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]
       ChannelFiltering: true
    PathGainsOutputPort: false

  Use get to 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]
          ChannelFiltering: true
       PathGainsOutputPort: false

  Use get to 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]
          ChannelFiltering: true
       PathGainsOutputPort: false

  Use get to 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]
       ChannelFiltering: true
    PathGainsOutputPort: false

  Use get to show all properties

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

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

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

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]}
       ChannelFiltering: true
    PathGainsOutputPort: false

  Use get to 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]}
       ChannelFiltering: true
    PathGainsOutputPort: false

  Use get to 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, 0] dB の範囲の平均パス ゲインを使用します。

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

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

最大ドップラー シフト

  • ドップラー シフトは送信機と受信機の間の相対速度で指定します。最大ドップラー シフト (Hz 単位)、fd = vf ∕ c。この式で、v は m/s 単位の相対速度、f はヘルツ単位の送信搬送波周波数、c は光速 (3×108 m/s) です。相対速度は振幅であり、方向の情報は含まれていません。

  • 900 MHz の送信搬送波周波数で、高速道路を移動している車および移動している歩行者を想定して、この最大ドップラー シフト式を適用します。高速道路を移動している車から固定受信機に送信される信号には、およそ 80 Hz の最大ドップラー シフトが発生します。移動している歩行者が持つモバイル機器から固定受信機に送信される信号には、およそ 4 Hz の最大ドップラー シフトが発生します。

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

Doppler Spectrum

  • チャネル パスに使用されるドップラー スペクトルは、関数 doppler から返される形式の出力でなければなりません。

  • スペクトル タイプのオプションは、関数 doppler への specType 入力で指定されます。

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

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

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

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

ライス フェージング チャネルに対する見通し内 (LOS) パス ドップラー シフト

  • ライス LOS パス ドップラー シフトは直接パス ドップラー シフトとも呼ばれ、送信機と受信機の間の LOS パスの相対的な移動を示します。

  • ライス LOS パス ドップラー シフト (Hz)、fd_los = (u⋅w) × f ∕ c。この式で、(u⋅w) はベクトル u と w のドット積、u は送信機から受信機への正規化 LOS パス、w は送信機相対の受信機速度、f はヘルツ単位の送信搬送波周波数、c は光速 (3×108 m/s) です。

  • 900 MHz の送信搬送波周波数、指定された相対速度でこの式を適用します。座標原点にある送信機から座標 [100 100 0] にある受信機に到達する信号の場合、送信機と受信機の間の相対速度は w = [3 -6 0.1] です。LOS パス ドップラー シフトは 4.25 Hz です。

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

  • パラメーターとその意味の説明については、対応するドップラー スペクトル構造体の 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 変調器オブジェクトを作成します。ビット ストリームを変調し、チャネル オブジェクトを呼び出して、変調した 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 = 1i*ones(2000,1); 
out = rayChan(sig);
rayChan
rayChan = 
  comm.RayleighChannel with properties:

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

  Use get to show all properties

フェージングされた信号の強度をサンプル数に対してプロットします。

plot(20*log10(abs(out)))

Figure contains an axes object. The axes object contains an object of type line.

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

次の例は、周波数フラットなレイリー フェージング チャネル オブジェクトを作成し、それを呼び出して単一ベクトルから成る DBPSK 信号を処理します。S/N 比 (SNR) の異なる値に対して、ビット エラー レート (BER) を計算します。チャネル劣化要因を適用する場合、SNR 値のループの前にフェージング チャネル フィルターを適用できます。AWGN で S/N 比 (SNR) を考慮しなければならないため、信号は後の SNR 値のループ内で AWGN チャネル フィルターを通過させます。フェージングと AWGN を組み合わせる場合は、この順序が推奨されます。

シミュレーションに使用する変調器、復調器、レイリー フェージング チャネル、AWGN チャネル、およびエラー レート計算機の System object を作成します。

mod = comm.DBPSKModulator;
demod = comm.DBPSKDemodulator;
chan = comm.RayleighChannel( ...
    SampleRate=1e4, ...
    MaximumDopplerShift=100);
awgnChan = comm.AWGNChannel( ...
    NoiseMethod='Signal to noise ratio (SNR)');
errorCalc = comm.ErrorRate;

シンボルのランダム ビット ストリームを生成し、シンボルに DBPSK 変調を適用します。DBPSK 変調データをフェージング チャネル経由で渡します。

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

dpskSig = mod(tx);
fadedSig = chan(dpskSig);

BER の結果用のベクトルを事前に割り当てます。SNR のさまざまな値に対するエラー レートを計算します。

SNR = 0:2:20;
numSNR = length(SNR);
berVec = zeros(3, numSNR);

for n = 1:numSNR
   awgnChan.SNR = SNR(n);
   rxSig = awgnChan(fadedSig);
   rx = demod(rxSig);
   reset(errorCalc)
  
   berVec(:,n) = errorCalc(tx,rx);
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');

Figure contains an axes object. The axes object with title Binary DPSK over Rayleigh Fading Channel, xlabel SNR (dB), ylabel BER contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Theoretical BER, Empirical BER.

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

入力データ セットと出力データ セットを直接比較するには、適切な丸めやパディング操作を使用して遅延を考慮しなければなりません。フェージング チャネル オブジェクトの ChannelFilterDelay プロパティ値は、チャネルの出力と入力の間の遅延のサンプル数を表します。この例では、ビット エラー レートを計算する際に遅延を考慮する方法を示します。

シミュレーションに使用する DBPSK 変調器、DBPSK 復調器、フェージング チャネル、エラー レート計算の System object を作成します。オブジェクト関数infoを使用して ChannelFilterDelay プロパティを取得します。フェージング チャネルの出力遅延を考慮するようにエラー レート計算オブジェクトを構成します。

bitRate = 50000;
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
delay = 7
errorCalc = comm.ErrorRate(ReceiveDelay=delay);

DBPSK 変調用のランダム データ シンボルを生成します。DBPSK 変調されたデータを生成し、変調データをフェージング チャネル経由で渡し、劣化されたチャネル データを復調します。

M = 2;                       % DBPSK modulation order
tx = randi([0 M-1],50000,1);
dpskSig = mod(tx);
fadedSig = rayChan(dpskSig);
rx = demod(fadedSig);

ビット エラー レート統計を計算して表示します。エラー レート計算オブジェクトの構成では、予想されるフェージング チャネルの出力遅延が考慮されます。

berVec = errorCalc(tx,rx);
sprintf(['%d bits were received.\nThere were %d bits ' ...
    'in error.\nThe computed BER is %1.2f.'], ...
    berVec(3), berVec(2), berVec(1))
ans = 
    '49993 bits were received.
     There were 737 bits in error.
     The computed BER is 0.01.'

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

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

パラメーターを設定します。50e3 Hz のビット レートおよび 125 のループ反復回数を指定します。QPSK 変調器、レイリー フェージング チャネル、コンスタレーション ダイアグラムの System object を作成します。

bitRate = 50000;   % Data rate is 50 kb/s
numTrials = 125;   % Number of iterations of loop
M = 4;             % QPSK modulation order
phaseoffset = pi/4 
phaseoffset = 0.7854
qpskMod = comm.QPSKModulator;
rayChan = comm.RayleighChannel( ...
    SampleRate=bitRate, ...
    MaximumDopplerShift=4, ...
    PathDelays=[0 2e-5], ...
    AveragePathGains=[0 -9]);
cd = comm.ConstellationDiagram;

関数pskmodPlotConstellation プロパティを使用して、予想される理想的なコンスタレーションをプロットします。連続性を維持しながら、ループ内でランダム シンボルを生成し、シンボルに QPSK 変調を適用し、変調信号をフェージング チャネル経由で渡します。各反復で現在のデータのみをプロットします。

pskmod([0 M-1],M,phaseoffset,PlotConstellation=true);

Figure contains an axes object. The axes object with title 4-PSK, Gray Mapping, xlabel In-phase Amplitude, ylabel Quadrature Amplitude contains 7 objects of type line, text. One or more of the lines displays its values using only markers

for n = 1:numTrials
   tx = randi([0 M-1],500,1);
   pskSig = pskmod(tx,M,phaseoffset);
   fadedSig = rayChan(pskSig);
   
   % Plot the new data for each for loop iteration.
   update(cd,fadedSig);
end

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

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

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

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

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

  3. 誤り統計量の計算

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

試行ごとのビット数、試行回数 (具体的にはパケット数)、および変調次数用のシミュレーション変数を設定します。通常、正確な減少の見込みまたはパケット エラー レートを推定するには、numTrials は大きな数になります。ここでの 20 は、単に例をより高速に実行するものとして使用します。変調器、復調器およびライス チャネルの System object を作成します。ライス チャネルの最大ドップラー シフトをゼロに設定します。

numBits = 10000; % Each trial uses 10000 bits
numTrials = 20;  % Number of BER computations
M = 4;

dpskMod = comm.DPSKModulator(ModulationOrder=M);
dpskDemod = comm.DPSKDemodulator(ModulationOrder=M);
ricianChan = comm.RicianChannel(KFactor=3,MaximumDopplerShift=0);

for ループ内で、ランダム ビット ストリームを生成し、信号を DPSK 変調し、ライス フェージングと AWGN チャネルを介して変調信号をフィルター処理し、フェージングされた信号を復調します。シンボル エラー レート (SER) については、サンプル 2 で各パケットの計算を開始し、DPSK 初期条件のために最初のサンプルを無視します。

nErrors = zeros(1,numTrials);
for n = 1:numTrials
   tx = randi([0 M-1],numBits,1);
   dpskSig = dpskMod(tx);
   fadedSig = ricianChan(dpskSig);
   rxSig = awgn(fadedSig,15,'measured');
   rx = dpskDemod(rxSig);
   nErrors(n) = symerr(tx(2:end),rx(2:end));
end

パケットごとのシンボル エラー数が格納されている nErrors ベクトルを表示します。パケット エラー レートを計算します。この例では乱数によって、結果は実行するたびに異なります。

nErrors(1:10)
ans = 1×10

     0     1     0     0     1     0     0     0     0     0

nErrors(11:20)
ans = 1×10

     0     0     0     1     0     0     0     1     0     0

per = mean(nErrors > 0) % Packet error rate
per = 0.2000

準静的な手法の詳細

準静的なチャネル モデル作成の方法で計算を保存できるかを示す例として、搬送波周波数が 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万ビットを処理します。これは、従来のモンテカルロ法に比べて、大幅に少ないビット数です。

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