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

データ リンク層でパケット化されたモデム

この例では、MATLAB® および Communications Toolbox™ を使用してデータ リンク層 [1] でパケット化されたモデムを実装する方法について説明します。このモデムは、パケットベースの物理層と ALOHA ベースのデータ リンク層を特徴としています。Communications Toolbox Support Package for USRP® Radio を使用して、無線機でシステムをシミュレートまたは実行できます。

必要なソフトウェアとハードウェア

システム パフォーマンスをシミュレートするには、次のソフトウェアが必要です。

無線機でシステム パフォーマンスを測定するには、次のハードウェアも必要です。

  • USRP® 無線機 (B2xx、N2xx、または X3xx)

さらに次のソフトウェアも必要になります。

Communications Toolbox でサポートされる SDR プラットフォームのすべてのリストについては、ソフトウェア無線機 (SDR) 情報ページのサポートされているハードウェアの節を参照してください。

はじめに

パケット化されたワイヤレス モデムは、ワイヤレス チャネルを介してパケットと呼ばれる情報をバーストで送信する通信システムです。各モデム (ノードとも呼ばれます) は、パケットが共有周波数帯域で変調、送信、および受信され、復調される物理層を特徴としています。すべてのノードで同じ周波数帯域が使用されているため、競合 (同時送信) によるパケット損失を減らすには、メディア アクセス制御 (MAC) アルゴリズムが必要です。データ リンク層には、MAC サブ層と論理リンク制御サブ層が含まれ、同じチャネルを共有し、2 つのノード間にエラーのないリンクを提供します。データ リンク層は第 2 層とも呼ばれ、ネットワーク層 (第 3 層) と物理層 (第 1 層) の間に位置します。

例の実行

例を実行するには、MATLAB コマンド ウィンドウで PacketizedModemNetworkExample と入力するか、リンクをクリックします。コード例では、3 つのパケット化されたモデム ノード オブジェクトを作成し、それらをチャネル オブジェクトを介して接続します。各ノードは他の 2 つのノードにパケットを送信できます。ACKTimeout は、ノードが DATA パケット送信が失敗したと判断するまでのタイムアウト期間を決定します。ACKTimeout は、DATA-ACK 交換のラウンド トリップ期間 (この例では、0.21 秒) よりも大きくなければなりません。このシミュレーションは時間ベースで、すべての物理層処理をデータ リンク層と共にシミュレートします。

% Set simulation parameters
runDuration = 10;         % Seconds
numPayloadBits = 19530;   % Bits
packetArrivalRate = 0.2;  % Packets per second
ackTimeOut = 0.25;        % ACK time out in seconds
maxBackoffTime = 10;      % Maximum backoff time in ackTimeOut durations
mMaxDataRetries = 5;      % Maximum DATA retries
queueSize = 10;           % Data Link Layer queue size in packets
samplesPerFrame = 2000;   % Number of samples processed every iteration
verbose = true;           % Print packet activity to command line
sampleRate = 200e3;

% Create packetized modem nodes
node1 = helperPacketizedModemNode(...
  'Address', 1, ...
  'DestinationList', [2, 3], ...
  'NumPayloadBits', numPayloadBits, ...
  'PacketArrivalRate', packetArrivalRate, ...
  'ACKTimeOut', ackTimeOut, ...
  'MaxBackoffTime', maxBackoffTime, ...
  'MaxDataRetries', mMaxDataRetries, ...
  'QueueSize', queueSize, ...
  'CarrierDetectorThreshold', 1e-5, ...
  'AGCMaxPowerGain', 65, ...
  'SamplesPerFrame', samplesPerFrame, ...
  'Verbose', verbose, ...
  'SampleRate', sampleRate);
node2 = helperPacketizedModemNode(...
  'Address', 2, ...
  'DestinationList', [1 3], ...
  'NumPayloadBits', numPayloadBits, ...
  'PacketArrivalRate', packetArrivalRate, ...
  'ACKTimeOut', ackTimeOut, ...
  'MaxBackoffTime', maxBackoffTime, ...
  'MaxDataRetries', mMaxDataRetries, ...
  'QueueSize', queueSize, ...
  'CarrierDetectorThreshold', 1e-5, ...
  'AGCMaxPowerGain', 65, ...
  'SamplesPerFrame', samplesPerFrame, ...
  'Verbose', verbose, ...
  'SampleRate', sampleRate);
node3 = helperPacketizedModemNode(...
  'Address', 3, ...
  'DestinationList', [1 2], ...
  'NumPayloadBits', numPayloadBits, ...
  'PacketArrivalRate', packetArrivalRate, ...
  'ACKTimeOut', ackTimeOut, ...
  'MaxBackoffTime', maxBackoffTime, ...
  'MaxDataRetries', mMaxDataRetries, ...
  'QueueSize', queueSize, ...
  'CarrierDetectorThreshold', 1e-5, ...
  'AGCMaxPowerGain', 65, ...
  'SamplesPerFrame', samplesPerFrame, ...
  'Verbose', verbose, ...
  'SampleRate', sampleRate);

% Setup channel
channel = helperMultiUserChannel(...
  'NumNodes', 3, ...
  'EnableTimingSkew', true, ...
  'DelayType', 'Triangle', ...
  'TimingError', 20, ...
  'EnableFrequencyOffset', true, ...
	'PhaseOffset', 47, ...
  'FrequencyOffset', 2000, ...
  'EnableAWGN', true, ...
  'EbNo', 25, ...
  'BitsPerSymbol', 2, ...
  'SamplesPerSymbol', 4, ...
  'EnableRicianMultipath', true, ...
  'PathDelays', [0 node1.SamplesPerSymbol/node1.SampleRate], ...
  'AveragePathGains', [15 0], ...
  'KFactor', 15, ...
	'MaximumDopplerShift', 10, ...
  'SampleRate', node1.SampleRate);

% Main loop
radioTime = 0;
nodeInfo = info(node1);
frameDuration = node1.SamplesPerFrame/node1.SampleRate;
[rcvd1,rcvd2,rcvd3] = deal(complex(zeros(node1.SamplesPerFrame,1)));
while radioTime < runDuration
  trans1 = node1(rcvd1, radioTime);
  trans2 = node2(rcvd2, radioTime);
  trans3 = node3(rcvd3, radioTime);

  % Multi-user channel
  [rcvd1,rcvd2,rcvd3] = channel(trans1,trans2,trans3);

  % Update radio time.
  radioTime = radioTime + frameDuration;
end
|   Time    |     Link    |   Action   |  Seq #  | Backoff 
-----------------------------------------------------------
| 4.76000 s |   2 ->>   1 |       DATA | #     0 |
| 4.97000 s |   1 <<-   2 |       DATA | #     0 |
| 4.97000 s |   1 ->>   2 |        ACK | #     0 |
| 4.99000 s |   2 <<-   1 |        ACK | #     0 |
| 5.04000 s |   1 ->>   2 |       DATA | #     0 |
| 5.10000 s |   3 ->>   1 |       DATA | #     0 |
| 5.30000 s |   1 ->>   2 |   Back Off | #     0 | 1.75000 s |
| 5.36000 s |   3 ->>   1 |   Back Off | #     0 | 2.00000 s |
| 7.06000 s |   1 ->>   2 |       DATA | #     0 |
| 7.27000 s |   2 <<-   1 |       DATA | #     0 |
| 7.27000 s |   2 ->>   1 |        ACK | #     0 |
| 7.29000 s |   1 <<-   2 |        ACK | #     0 |
| 7.37000 s |   3 ->>   1 |       DATA | #     0 |
| 7.58000 s |   1 <<-   3 |       DATA | #     0 |
| 7.58000 s |   1 ->>   3 |        ACK | #     0 |
| 7.60000 s |   3 <<-   1 |        ACK | #     0 |
| 9.73000 s |   2 ->>   1 |       DATA | #     1 |
| 9.77000 s |   3 ->>   1 |       DATA | #     1 |
| 9.99000 s |   2 ->>   1 |   Back Off | #     1 | 2.25000 s |

結果

ノード オブジェクトは、データ リンク層アルゴリズムのパフォーマンスの統計を収集します。これらの統計にアクセスするには、ノード オブジェクトの info メソッドを呼び出します。0.2 パケット/秒のパケット到着率で、10 秒間のシミュレート時間のサンプル結果を以下に示します。各データ パケットは 200 msec 長です。

% Display statistics
nodeInfo(1) = info(node1);
nodeInfo(2) = info(node2);
nodeInfo(3) = info(node3);

for p=1:length(nodeInfo)
  fprintf('\nNode %d:\n', p);
  fprintf('\tNumGeneratedPackets: %d\n', nodeInfo(p).NumGeneratedPackets)
  fprintf('\tNumReceivedPackets: %d\n', nodeInfo(p).NumReceivedPackets)
  fprintf('\tAverageRetries: %f\n', nodeInfo(p).Layer2.AverageRetries)
  fprintf('\tAverageRoundTripTime: %f\n', nodeInfo(p).Layer2.AverageRoundTripTime)
  fprintf('\tNumDroppedPackets: %d\n', nodeInfo(p).Layer2.NumDroppedPackets)
  fprintf('\tNumDroppedPackets (Max retries): %d\n', nodeInfo(p).Layer2.NumDroppedPacketsDueToRetries)
  fprintf('\tThroughput: %d\n', numPayloadBits / nodeInfo(p).Layer2.AverageRoundTripTime)
  fprintf('\tLatency: %d\n', nodeInfo(p).Layer2.AverageLatency)
end
Node 1:
	NumGeneratedPackets: 1
	NumReceivedPackets: 2
	AverageRetries: 1.000000
	AverageRoundTripTime: 2.249961
	NumDroppedPackets: 0
	NumDroppedPackets (Max retries): 0
	Throughput: 8.680151e+03
	Latency: 2.690625e+00

Node 2:
	NumGeneratedPackets: 2
	NumReceivedPackets: 1
	AverageRetries: 0.000000
	AverageRoundTripTime: 0.230234
	NumDroppedPackets: 0
	NumDroppedPackets (Max retries): 0
	Throughput: 8.482660e+04
	Latency: 2.229961e+00

Node 3:
	NumGeneratedPackets: 2
	NumReceivedPackets: 0
	AverageRetries: 1.000000
	AverageRoundTripTime: 2.500391
	NumDroppedPackets: 0
	NumDroppedPackets (Max retries): 0
	Throughput: 7.810780e+03
	Latency: 0

データ リンク層 (第 2 層)

この例では、ALOHA ランダム アクセス プロトコル [ 2 ] に基づいて、データ リンク層を実装します。次の流れ図は、ALOHA プロトコルがデータ パケットを送受信する方法を示しています。

データ リンク層は送信する第 3 層パケットがある場合、新しいセッションを開始して、DATA パケットを使用してパケットをすぐに送信します。アルゴリズムは肯定応答 (ACK) パケットを待機します。タイムアウト期間までに ACK が受信されない場合、ランダムな時間の間待機して、DATA パケットを再度送信します。数回の再試行後に ACK の受信に失敗すると、パケットを破棄します。このセッション中に新しい第 3 層パケットを受信すると、第 3 層パケットは先入れ先出し (FIFO) キューに入れられます。FIFO キューがいっぱいの場合、パケットは破棄されます。

アルゴリズムは helperPacketizedModemDataLinkLayer System object™ に実装されます。helperPacketizedModemDataLinkLayer System object は、IDLE、ACK_WAIT、および BACKOFF の 3 つの状態でステート マシンを定義します。次のステート マシンは、データ リンク層アルゴリズムがどのようにこのオブジェクトに実装されるかを示しています。かっこ内 [...] と中かっこ内 {...} のステートメントは、それぞれ条件とアクションです。小さな円は、複数の条件を表すために使用されるパススルー ステートです。

元の ALOHA プロトコルは、ハブ/スター トポロジを使用します。アップリンクとダウンリンクは、2 つの異なる周波数帯域を使用します。次の例では、ノードが同じ周波数帯域を使用して送受信するメッシュ ネットワーク トポロジを使用しています。

モデム構造

以下は、モデム コードの構造を表しています。処理は主に 6 つの部分で構成され、次の順番で実行されます。

  1. ソース コントローラー

  2. メッセージ発生器

  3. PHY 復号化器

  4. データ リンク層

  5. メッセージ パーサー

  6. PHY 符号化器

データ リンク層は、メッセージ発生器と PHY 復号化器の出力を処理するため、これら 2 つの操作の後に実行しなければなりません。メッセージ パーサーと PHY 符号化器は、データ リンク層の出力を処理します。このシーケンスは、モデムが同じ時間間隔でパケットを受信してそれらに応答できるようにします。helperPacketizedModemNode オブジェクトはモデムを実装します。

ソース コントローラー

ソース コントローラーは、ユーザーが選択したパケットの到着分布に基づいて、イネーブル信号とランダムな宛先アドレスを生成します。

メッセージ発生器

メッセージ発生器は、ソース コントローラーによって有効化されると、第 3 層のデータ パケットの作成を開始します。パケットには、デジタル化されたテキスト メッセージが含まれます。メッセージが 1 つのパケットに収まらない場合、発生器は複数のパケットを生成します。パケット構造は次のとおりです。

  • 送信先アドレス: 8 ビット

  • 送信元アドレス: 8 ビット

  • パケット数: 16 ビット

  • ペイロード: M ビット

PHY 復号化器

PHY 復号化器は、ベースバンド I/Q サンプルを受信し、第 2 層のパケットを作成します。PHY 復号化器は、AGC、周波数オフセット推定器と補償器による周波数オフセット、および分数間隔の判定フィードバック イコライザー (DFE) を使用するタイミング スキューとマルチパスを使用して振幅の変化を補正できます。物理層 (第 1 層) 受信機のブロック線図を以下に示します。

データ ペイロード サイズが 19530 ビットに設定されている場合、モデムの合計パケット長は 39956 サンプルです。各反復でモデムはこの例の 2000 サンプルにあたる SamplesPerFrame サンプルを処理します。SamplesPerFrame を小さくするとレイテンシは小さくなりますが、モデム アルゴリズムのオーバーヘッドは大きくなります。オーバーヘッドが大きくなると、モデムはリアルタイムで動作しなくなり、処理時間が長くなります。

データ リンク層

データ リンク層は、2 つの隣接ノード間のリンクを提供します。これは、Data Link Layer (Layer 2) の節で説明した ALOHA ベースのプロトコルを使用します。パケット構造は次のとおりです。

  • タイプ: 4 ビット

  • バージョン: 2 ビット

  • 予約済み: 2 ビット

  • 送信先アドレス: 8 ビット

  • 送信元アドレス: 8 ビット

  • シーケンス番号: 8 ビット

  • タイム スタンプ: 32 ビット

  • ペイロード: N ( = M+32) ビット

データ リンク層は次の統計も収集します。

  • 成功したパケット送信の数。これは受信に成功した ACK パケットの数によって定義されます。

  • 再試行の平均

  • 平均ラウンド トリップ時間 (秒)

  • 第 3 層パケット キューがいっぱいのため破棄されたパケットの数

  • 再試行により破棄されたパケットの数

  • 成功したデータ配布速度として定義されたスループット (ビット/秒)

  • 第 3 層データ パケットの生成と送信先ノードでのその受信との間の時間として定義された平均レイテンシ (秒)

メッセージ パーサー

メッセージ パーサーは、受信した第 2 層ペイロードを解析し、第 3 層パケットを作成します。これは次の統計も収集します。

  • 受信したパケット数

  • 受信した重複パケット数

PHY 符号化器

PHY 符号化器は、第 2 層のパケットをベースバンド I/Q サンプルに変調することで物理層のパケットを作成します。パケット構造は次のとおりです。

ダミー シンボルは、AGC を調整するためと搬送波検出のために使用されます。同期シンボルは、変調された PN シーケンスです。ヘッダーには、以下のフィールドがあります。

  • ペイロード長: 16 ビット

  • CRC: 16 ビット

物理層 (第 1 層) 送信機のブロック線図を以下に示します。

チャネル モデル

この例では、3 ノード ネットワークをシミュレートしていますが、任意の数のノードをシミュレートできます。各ノードの出力は、チャネル シミュレーターに渡されます。チャネルは、次のチャネル障害を適用した後、3 つのすべてのノードからのベースバンド信号を追加します。

  • タイミング スキュー

  • Frequency offset

  • ライス マルチパス

  • AWGN

これらの障害に加え、隣接ノードからの信号に 20 dB のパス損失が適用されますが、自己干渉は直接追加されます。

無線機を使用した実行

シミュレートされたチャネルの代わりに無線機を使用してこの例を実行することもできます。SDR ハードウェアと MATLAB セッションを実行するホスト コンピューターの組み合わせがノードを構成します。次のステップは、3 ノード ネットワークの設定方法を示しています。この例では、USRP® B200 および B210 無線機を使用します。

1) USRP® 無線機をホスト コンピューター A に接続します。これをノード 1 と呼びます。Installation and Setup (Communications Toolbox Support Package for USRP Radio)の指示に従って、ホスト コンピューターをインストールして、USRP® 無線機を使用するようにセットアップします。MATLAB セッションを開始します。

2) ノード 1 を初期化して送信機としてセットアップします。helperPacketizedModemInitializeRadio('tx', PLATFORM, ADDRESS, FC, RT) を実行します。ここで、PLATFORM は USRP® 無線機のタイプ、ADDRESS は IP アドレスのシリアル番号、FC は中心周波数、RT は実行時間 (秒) です。この例では、915 MHz の中心周波数を使用します。無線機がシリアル番号 'ABCDE' の B200 と仮定すると、関数呼び出しは helperPacketizedModemInitializeRadio('tx', 'B200', 'ABCDE', 915e6, 120) となります。この関数は送信機を 120 秒間実行します。初期化を完了するためにさらに多くの時間が必要な場合は、実行時間を長くしたコマンドを再実行します。

3) 2 番目の無線機とホスト コンピューターにステップ 1 を繰り返し、このノードをノード 2 とします。

4) ノード 2 を初期化して送信機としてセットアップします。[CDT, MAXGAIN, RXGAIN] = helperPacketizedModemInitializeRadio('rx', PLATFORM, ADDRESS, FC, RT) を実行します。無線機がシリアル番号 '12345' の B210 と仮定すると、関数呼び出しは [CDT1, MAXGAIN1, RXGAIN1] = helperPacketizedModemInitializeRadio('rx', 'B210', '12345', 915e6, 120) となります。この関数は、搬送波検出器しきい値 (CDT)、最大 AGC ゲイン (MAXGAIN)、および無線受信ゲイン (RXGAIN) の最適な値を決定するまで、または RT 秒が経過するまで実行されます。初期化アルゴリズムで適切なパラメーターを決定できない場合は、送信機の電力を増大または減少させて、初期化を再試行するように推奨される場合があります。

5) ノード 1 を受信機として、ノード 2 を送信機として使用して同じ実験を行い、ノード 1 の最適な受信機パラメーターを決定します。ほとんどの場合、チャネルはデュアルにするべきで、パラメーターは非常に近くなります。

6) 無線機の他のすべてのペア (ノード 1 と ノード 3、ノード 3 と ノード 2) にステップ 1 ~ 5 を繰り返します。各ノードの CDT、MAXGAIN、および RXGAIN の値を取得します。異なるリンクの初期化中に、同じノードに異なる値を取得する場合、MAXGAIN と RXGAIN の最大値と、CDT の最小値を選択します。

7) 関数 helperPacketizedModemRadio(P,RA,NA,DA,FC,CDT,MAXG,RGAIN,D) を実行してノード 1 を起動します。ここで、P はプラットフォーム、RA は無線アドレス、NA はノード アドレス、DA は宛先アドレス リスト、FC は中心周波数、CDT は搬送波検出器しきい値、MAXG は最大 AGC ゲイン、RGAIN は無線受信機ゲイン、D は期間です。たとえば、helperPacketizedModemRadio('B200', 'ABCDE', 1, [2 3], 915e6, CDT1, MAXGAIN1, RXGAIN1, 120) を実行します。

8) helperPacketizedModemRadio('B210', '12345', 2, [1 3], 915e6, CDT2, MAXGAIN2, RXGAIN2, 120) を実行してノード 2 を起動します。

9) helperPacketizedModemRadio('B200', 'A1B2C', 3, [1 2], 915e6, CDT3, MAXGAIN3, RXGAIN3, 120) を実行してノード 3 を起動します。

10) セッションが終了すると、ノードごとに統計が出力されます。

3 つのネットワークのセットアップを 2 時間稼働しました。各ノードは、ポアソン分布に従って、0.2 パケット/秒のレートでパケットを生成しました。ノードはほぼ等間隔に配置されました。リンクのうちの 1 つは見通し外であり、他の 2 つにはありませんでした。以下は、3 つのすべてのノードで収集された結果です。USB を介して接続される B2xx 無線機を使用した DATA-ACK 交換のラウンド トリップ時間は 800 ms までかかる可能性があるため、ネットワークの平均ラウンド トリップ時間は 3 秒より長くなります。アルゴリズムはパケット損失を最小限にし、共有チャネルへの公平なアクセスをすべてのノードに提供します。

Node 1:
 NumGeneratedPackets: 1440
 NumReceivedPackets: 1389
 AverageRetries: 0.533738
 AverageRoundTripTime: 3.725093
 NumDroppedPackets: 95
 NumDroppedPackets (Max retries): 23
 Throughput: 5.242823e+03
Node 2:
 NumGeneratedPackets: 1440
 NumReceivedPackets: 1340
 AverageRetries: 0.473157
 AverageRoundTripTime: 3.290775
 NumDroppedPackets: 31
 NumDroppedPackets (Max retries): 9
 Throughput: 5.934772e+03
Node 3:
 NumGeneratedPackets: 1440
 NumReceivedPackets: 1385
 AverageRetries: 0.516129
 AverageRoundTripTime: 3.558408
 NumDroppedPackets: 107
 NumDroppedPackets (Max retries): 29
 Throughput: 5.488410e+03

考察

前の節からのシミュレーション コードと関数 helperPacketizedModemRadio.m は、どちらも helperPacketizedModemNode.m System object を使用してモデム ノードを実装します。この例では、最初にシミュレートされたチャネル、次に SDR ハードウェアと無線チャネルを使用する同じコードを使用して、システムを評価しています。

シミュレートされたチャネルを使用するコードが時間ベースでも、モデム ノード オブジェクトを使用してイベントベースのシミュレーションを実行できます。この例では、イベントベースのシミュレーション カーネルは提供しません。

その他の調査

次のパラメーターを変えて、データ リンク層のパフォーマンスへのそれらの影響を調査できます。

  • PacketArrivalRate

  • ACKTimeOut

  • MaxBackoffTime

  • MaxDataRetries

  • QueueSize

また、アルゴリズムの実装の詳細については、次の関数も参照してください。

PacketizedModemPhysicalLayerTxRxExample スクリプトを使用して、物理層のパフォーマンスのみを調査できます。

参考文献

著作権情報

Universal Software Radio Peripheral® and USRP® are trademarks of National Instruments® Corp.