データ リンク レイヤーでパケット化されたモデム
この例では、データ リンク レイヤー [ 1 ] でパケット化されたモデムを実装する方法について説明します。このモデムは、パケットベースの物理レイヤーと ALOHA ベースのデータ リンク レイヤーを特徴としています。ソフトウェア定義無線 (SDR) ハードウェアを使用して、システムのシミュレーションまたはシステムのパフォーマンス測定を行うことができます。
必要なソフトウェアとハードウェア
既定では、この例はシステムのパフォーマンスをシミュレートします。オプションで、次のいずれかの SDR デバイスと対応するサポート パッケージを使用して、システムのパフォーマンスを測定できます。
200 シリーズ USRP 無線機 (B2xx または N2xx) とUSRP 無線機。NI™ USRP デバイスを Ettus Research 200 シリーズ USRP デバイスにマッピングする方法については、サポートされているハードウェアと必要なソフトウェアを参照してください。
300 シリーズ USRP 無線機 (X3xx) とWireless Testbench。NI USRP デバイスを Ettus Research 300 シリーズ USRP デバイスにマッピングする方法については、Supported Radio Devices (Wireless Testbench)を参照してください。
SDR デバイスを使用して例を実行するには、無線機を使用した実行を参照してください。
はじめに
パケット化された無線モデムは、無線チャネルを介してパケットと呼ばれる情報をバーストで送信する通信システムです。各モデムまたはノードには物理レイヤーが含まれており、モデムは共有周波数帯域で変調、送信、および受信を行った後、パケットを復調します。すべてのノードが同じ周波数帯域を使用するため、競合 (同時送信) によるパケット損失を減らすには、メディア アクセス制御 (MAC) アルゴリズムが必要です。データ リンク レイヤーには、同じチャネルを共有し、2 つのノード間にエラーのないリンクを提供する MAC サブ層と論理リンク制御サブ層が含まれます。データ リンク レイヤー (第 2 層) は、ネットワーク レイヤー (第 3 層) と物理レイヤー (第 1 層) の間にあります。
例の実行
コード例では、3 つのパケット化されたモデム ノード オブジェクトを作成し、それらをチャネル オブジェクトを介して接続します。各ノードは他の 2 つのノードにパケットを送信します。ACKTimeout は、ノードが DATA パケット送信が失敗したと判断するまでのタイムアウト期間を決定します。ACKTimeout は、DATA-ACK 交換のラウンド トリップ期間 (この例では、0.21 秒) よりも大きくなければなりません。このシミュレーションは時間ベースで、すべての物理レイヤー処理をデータ リンク レイヤーと共にシミュレートします。
シミュレーション パラメーターの設定
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;
反復可能なシミュレーションのために乱数発生のシードを固定します。
rng(12345)
helperPacketizedModemNode オブジェクトを使用して、パケット化モデム ノードを作成します。
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);
helperMultiUserChannel オブジェクトを使用して伝播チャネルを構成します。
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);
主シミュレーション ループ
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 (Node 1) -----------------------------------------------------------
| Time | Link | Action | Seq # | Backoff (Node 2) -----------------------------------------------------------
| Time | Link | Action | Seq # | Backoff (Node 3) ----------------------------------------------------------- | 4.46000 s | 3 ->> 1 | DATA | # 0 |
| 4.67000 s | 1 <<- 3 | DATA | # 0 | | 4.67000 s | 1 ->> 3 | ACK | # 0 |
| 4.68000 s | 3 <<- 1 | ACK | # 0 |
| 5.04000 s | 1 ->> 3 | DATA | # 0 |
| 5.16000 s | 2 ->> 3 | DATA | # 0 |
| 5.30000 s | 1 ->> 3 | Back Off | # 0 | 1.00000 s |
| 5.42000 s | 2 ->> 3 | Back Off | # 0 | 1.00000 s |
| 6.31000 s | 1 ->> 3 | DATA | # 0 |
| 6.43000 s | 2 ->> 3 | DATA | # 0 |
| 6.57000 s | 1 ->> 3 | Back Off | # 0 | 2.25000 s |
| 6.69000 s | 2 ->> 3 | Back Off | # 0 | 1.75000 s | | 8.45000 s | 2 ->> 3 | DATA | # 0 |
| 8.66000 s | 3 <<- 2 | DATA | # 0 | | 8.66000 s | 3 ->> 2 | ACK | # 0 |
| 8.67000 s | 2 <<- 3 | ACK | # 0 |
| 8.83000 s | 1 ->> 3 | DATA | # 0 |
| 9.04000 s | 3 <<- 1 | DATA | # 0 | | 9.04000 s | 3 ->> 1 | ACK | # 0 |
| 9.05000 s | 1 <<- 3 | ACK | # 0 |
| 9.52000 s | 3 ->> 1 | DATA | # 1 |
| 9.73000 s | 1 <<- 3 | DATA | # 1 | | 9.73000 s | 1 ->> 3 | ACK | # 1 |
| 9.74000 s | 3 <<- 1 | ACK | # 1 |
| 9.99000 s | 1 ->> 2 | DATA | # 1 |
結果
パケット化モデム ノード オブジェクトは、データ リンク レイヤー アルゴリズムのパフォーマンスの統計を収集します。これらの統計にアクセスするには、ノード オブジェクトの info メソッドを呼び出します。0.2 パケット/秒のパケット到着率で、10 秒間のシミュレート時間のサンプル結果を以下に示します。各データ パケットは 200 msec 長です。
統計を表示します。
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: 2
NumReceivedPackets: 2
AverageRetries: 2.000000
AverageRoundTripTime: 4.009961
NumDroppedPackets: 0
NumDroppedPackets (Max retries): 0
Throughput: 4.870372e+03
Latency: 4.205078e-01
Node 2:
NumGeneratedPackets: 1
NumReceivedPackets: 0
AverageRetries: 2.000000
AverageRoundTripTime: 3.509844
NumDroppedPackets: 0
NumDroppedPackets (Max retries): 0
Throughput: 5.564350e+03
Latency: 0
Node 3:
NumGeneratedPackets: 2
NumReceivedPackets: 2
AverageRetries: 0.000000
AverageRoundTripTime: 0.220254
NumDroppedPackets: 0
NumDroppedPackets (Max retries): 0
Throughput: 8.867039e+04
Latency: 3.749902e+00
データ リンク レイヤー (第 2 層)
この例では、ALOHA ランダム アクセス プロトコル [ 2 ] に基づいて、データ リンク レイヤーを実装します。次の流れ図は、ALOHA プロトコルがデータ パケットを送受信する方法を示しています。

データ リンク レイヤーは送信する第 3 層パケットがある場合、新しいセッションを開始して、DATA パケットを使用してパケットをすぐに送信します。アルゴリズムは肯定応答 (ACK) パケットを待機します。タイムアウト期間までに ACK が受信されない場合、ランダムな時間の間待機して、DATA パケットを再度送信します。数回の再試行後に ACK の受信に失敗すると、パケットを破棄します。このセッション中にアルゴリズムが新しい第 3 層パケットを受信すると、第 3 層パケットは先入れ先出し (FIFO) キューに入れられます。FIFO キューがいっぱいの場合、パケットは破棄されます。
アルゴリズムは helperPacketizedModemDataLinkLayer 補助 System object™ に実装されます。helperPacketizedModemDataLinkLayer System object は、次の 3 つの状態のステート マシンを定義します。IDLE、ACK_WAIT、および BACKOFF。次のステート マシンは、データ リンク レイヤー アルゴリズムがどのようにこのオブジェクトに実装されるかを示しています。かっこ内 [...] と中かっこ内 {...} のステートメントは、それぞれ条件とアクションです。小さな円は、複数の条件を表すために使用されるパススルー ステートです。

元の ALOHA プロトコルは、ハブ/スター トポロジを使用します。アップリンクとダウンリンクは、2 つの異なる周波数帯域を使用します。次の例では、ノードが同じ周波数帯域を使用して送受信するメッシュ ネットワーク トポロジを使用しています。
モデム構造
モデム コードの構造は以下の 6 つの主要な処理部を実行します。
ソース コントローラー
メッセージ発生器
PHY 復号化器
データ リンク レイヤー
メッセージ パーサー
PHY 符号化器
データ リンク レイヤーは、メッセージ発生器と PHY 復号化器の出力を処理するため、これら 2 つの操作の後に実行しなければなりません。メッセージ パーサーと PHY 符号化器は、データ リンク レイヤーの出力を処理します。このシーケンスは、モデムが同じ時間間隔でパケットを受信してそれらに応答できるようにします。helperPacketizedModemNode オブジェクトはモデムを実装します。
ソース コントローラー
ソース コントローラーは、ユーザーが選択したパケットの到着分布に基づいて、イネーブル信号とランダムな宛先アドレスを生成します。
メッセージ発生器
メッセージ発生器は、ソース コントローラーによって有効化されると、第 3 層のデータ パケットの作成を開始します。パケットには、デジタル化されたテキスト メッセージが含まれます。メッセージが 1 つのパケットに収まらない場合、発生器は複数のパケットを生成します。パケット構造は次のとおりです。
送信先アドレス: 8 bits
送信元アドレス: 8 bits
パケット番号: 16 bits
ペイロード: M ビット
PHY 復号化器
PHY 復号化器は、ベースバンド I/Q サンプルを受信し、第 2 層のパケットを作成します。PHY 復号化器は、AGC、周波数オフセット推定器と補償器による周波数オフセット、および分数間隔の判定フィードバック イコライザー (DFE) を使用するタイミング スキューとマルチパスを使用して振幅の変化を補正します。物理レイヤー (第 1 層) 受信機のブロック線図を以下に示します。

データ ペイロード サイズが 19530 ビットに設定されている場合、モデムの合計パケット長は 39956 サンプルです。各反復でモデムはこの例の 2000 サンプルにあたる SamplesPerFrame サンプルを処理します。SamplesPerFrame を小さくするとレイテンシは小さくなりますが、モデム アルゴリズムのオーバーヘッドは大きくなります。オーバーヘッドが大きくなると、モデムはリアルタイムで動作しなくなり、処理時間が長くなります。
データ リンク レイヤー
データ リンク レイヤーは、2 つの隣接ノード間のリンクを提供します。これは、"データ リンク レイヤー (第 2 層)" の節で説明した ALOHA ベースのプロトコルを使用します。パケット構造体には次のフィールドがあります。
タイプ: 4 ビット
バージョン: 2 ビット
予約済み: 2 ビット
送信先アドレス: 8 bits
送信元アドレス: 8 bits
シーケンス番号: 8 bits
タイム スタンプ: 32 bits
ペイロード: N ( = M+32) ビット
データ リンク レイヤーは次の統計も収集します。
成功したパケット送信の数。これは受信に成功した ACK パケットの数によって定義されます。
再試行の平均
平均ラウンド トリップ時間 (秒)
第 3 層パケット キューがいっぱいのため破棄されたパケットの数
再試行により破棄されたパケットの数
成功したデータ配布速度として定義されたスループット (ビット/秒)
第 3 層データ パケットの生成と送信先ノードでのその受信との間の時間として定義された平均レイテンシ (秒)
メッセージ パーサー
メッセージ パーサーは、受信した第 2 層ペイロードを解析し、第 3 層パケットを作成します。メッセージ パーサーは次の統計を収集します。
受信したパケット数
受信した重複パケット数
PHY 符号化器
PHY 符号化器は、第 2 層のパケットをベースバンド I/Q サンプルに変調することで物理レイヤーのパケットを作成します。パケット構造を以下に示します。

ダミー シンボルは、AGC を調整するためと搬送波検出のために使用されます。同期シンボルは、変調された PN シーケンスです。ヘッダーには、以下のフィールドがあります。
ペイロード長: 16 bits
CRC: 16 bits
物理レイヤー (第 1 層) 送信機のブロック線図を以下に示します。

チャネル モデル
この例では、3 ノード ネットワークをシミュレートしていますが、任意の数のノードをシミュレートできます。各ノードの出力は、チャネル シミュレーターに渡されます。チャネルは、次のチャネル劣化要因を適用した後、3 つのすべてのノードからのベースバンド信号を追加します。
タイミング スキュー
Frequency offset
ライス マルチパス
AWGN
これらの障害に加え、隣接ノードからの信号に 20 dB のパス劣化要因が適用されますが、自己干渉は直接追加されます。

無線機を使用した実行
シミュレートされたチャネルの代わりに無線機を使用してこの例を実行することもできます。SDR ハードウェアと MATLAB セッションを実行するホスト コンピューターの組み合わせがノードを構成します。次のステップは、3 ノード ネットワークの設定方法を示しています。この例では、USRP® B200 および B210 無線機を使用します。
USRP® 無線機をホスト コンピューター A に接続します。これをノード 1 と呼びます。インストールと設定の指示に従って、ホスト コンピューターをインストールして、USRP® 無線機を使用するようにセットアップします。MATLAB セッションを開始します。
初期化のためにノード 1 を送信機としてセットアップします。
helperPacketizedModemInitializeRadioは、接続された USRP® 無線機を初期化します。helperPacketizedModemInitializeRadio('tx', PLATFORM, ADDRESS, FC, RT)を実行します。ここでPLATFORMは USRP® 無線機のタイプ、ADDRESSは IP アドレスのシリアル番号、FCは中心周波数、RTは実行時間 (秒) です。この例では、中心周波数に 915 MHz を使用します。無線機がシリアル番号 'ABCDE' の B200 と仮定すると、関数呼び出しはhelperPacketizedModemInitializeRadio('tx', 'B200', 'ABCDE', 915e6, 120)となります。この関数は送信機を 120 秒間実行します。初期化を完了するためにさらに多くの時間が必要な場合は、実行時間を長くしたコマンドを再実行します。2 番目の無線機とホスト コンピューターにステップ 1 を繰り返し、このノードをノード 2 とします。
ノード 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秒が経過するまで実行されます。初期化アルゴリズムで適切なパラメーターを決定できない場合は、送信機の電力を増大または減少させて、初期化を再試行するように推奨される場合があります。ノード 1 を受信機、ノード 2 を送信機として使用して同じ実験を行い、ノード 1 の最適な受信機パラメーターを決定します。ほとんどの場合、チャネルはデュアルにするべきで、パラメーターは非常に近くなります。
無線機の他のすべてのペア (ノード 1 とノード 3、ノード 3 とノード 2) に手順 1 ~ 5 を繰り返します。各ノードの
CDT、MAXGAIN、およびRXGAINの値を取得します。異なるリンクの初期化中に、同じノードに対して異なる値を取得する場合、MAXGAINとRXGAINの最大値とCDTの最小値を選択します。helperPacketizedModemRadio補助関数を実行してノード 1 を起動します。コマンドhelperPacketizedModemRadio(P,RA,NA,DA,FC,CDT,MAXG,RGAIN,D)を使用します。ここで、Pはプラットフォーム、RAは無線アドレス、NAはノード アドレス、DAは宛先アドレス リスト、FCは中心周波数、CDTは搬送波検出器しきい値、MAXGは最大 AGC ゲイン、RGAINは無線受信機ゲイン、Dは期間です。たとえば、helperPacketizedModemRadio('B200','ABCDE',1,[2 3],915e6,CDT1,MAXGAIN1,RXGAIN1,120)を実行します。helperPacketizedModemRadio('B210','12345',2,[1 3],915e6,CDT2,MAXGAIN2,RXGAIN2,120)を実行してノード 2 を起動します。helperPacketizedModemRadio('B200','A1B2C',3,[1 2],915e6,CDT3,MAXGAIN3,RXGAIN3,120)を実行してノード 3 を起動します。セッションが終了すると、ノードごとに統計が出力されます。
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 補助関数は、どちらも helperPacketizedModemNode System object を使用してモデム ノードを実装します。この例では、最初にシミュレートされたチャネル、次に SDR ハードウェアと無線チャネルを使用する同じコードを使用して、システムを評価しています。
シミュレートされたチャネルを使用するコードが時間ベースでも、モデム ノード オブジェクトを使用してイベントベースのシミュレーションを実行できます。この例では、イベントベースのシミュレーション カーネルは提供しません。
その他の調査
次のパラメーターを変えて、データ リンク レイヤーのパフォーマンスへのそれらの影響を調査できます。
PacketArrivalRateACKTimeOutMaxBackoffTimeMaxDataRetriesQueueSize
また、アルゴリズムの実装の詳細については、次の補助関数も参照してください。
helperPacketizedModemNode.mhelperPacketizedSourceController.mhelperPacketizedModemMessageGenerator.mhelperPacketizedModemDataLinkLayer.mhelperPacketizedModemPHYEncoder.mhelperPacketizedModemPHYDecoder.mhelperPacketizedModemMessageParser.mhelperMultiUserChannel.m
PacketizedModemPhysicalLayerTxRxExample スクリプトを使用して、物理レイヤーのパフォーマンスのみを調査できます。
参考文献
[1] Data Link Layer
[2] ALOHANet
著作権情報
Universal Software Radio Peripheral® and USRP® are trademarks of National Instruments® Corp.