dsp.UDPSender
ネットワークへの UPD パケットの送信
説明
dsp.UDPSender
オブジェクトは、ユーザー データグラム プロトコル (UDP) を使用して、ネットワーク経由でデータ パケットを送信します。UDP は、単純なメッセージベースのコネクションレス型プロトコルです。このプロトコルは、受信側の準備が整っているかどうかを確認せずに、送信元から宛先に一方向にデータ パケットを送信します。このプロトコルにはハンドシェイク メカニズムがありません。データ パケットは、さまざまな理由で破棄される可能性があります。UDP には確認応答、再送信、またはタイムアウトがありません。ただし、UDP は非常に単純な送信プロトコルであり、時間的に制約のある用途など、再送信によって遅延するパケットを待つよりもパケットを破棄する方が望ましい場合に適しています。
ネットワークに UPD パケットを送信するには、次を行います。
dsp.UDPSender
オブジェクトを作成し、そのプロパティを設定します。関数と同様に、引数を指定してオブジェクトを呼び出します。
System object の機能の詳細については、System object とはを参照してください。
作成
説明
は、指定ポートに UDP パケットを送信する UDP 送信機オブジェクトを返します。udps
= dsp.UDPSender
は、各プロパティが指定の値に設定されたUDP 送信機オブジェクト udps
= dsp.UDPSender(Name,Value
)udps
を返します。
プロパティ
特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release
を使用します。
プロパティが "調整可能" の場合、その値をいつでも変更できます。
プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。
データの送信先となるリモート (つまりホスト) IP アドレスを指定します。既定の設定はローカルホストの '127.0.0.1'
となります。
データ型: char
データの送信先となるリモート IP アドレスのポートを指定します。このプロパティは生成コードでは調整可能ですが、シミュレーション中は調整できません。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
ホストのローカル IP ポートの決定方法を Auto
または Property
として指定します。Auto
を指定すると、オブジェクトは利用可能なポートから動的にポートを選択します。Property
を指定すると、オブジェクトは LocalIPPort
プロパティが指定するソースを使用します。
データの送信元となるポートを指定します。
依存関係
このプロパティは、LocalIPPortSource
プロパティを Property
に設定した場合に適用されます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
UDP パケットを送信する内部バッファーのサイズ。範囲 [1, 67108864]
の整数としてバイト数で指定します。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
使用法
説明
はネットワークに 1 つの UDP パケット y
= udps(Packet
)Packet
を送信します。
オブジェクトは UDP ネットワーク経由でデータを送信するため、送信中にデータ パケットが失われる可能性があり、送信されたすべてのデータが受信者によって受信されるとは限りません。dsp.UDPReceiver
オブジェクトを使用してデータを受信できます。
入力引数
オブジェクトは呼び出しごとに 1 つの UDP パケットをネットワークに送信します。
データ型: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| logical
複素数のサポート: あり
オブジェクト関数
オブジェクト関数を使用するには、System object™ を最初の入力引数として指定します。たとえば、obj
という名前の System object のシステム リソースを解放するには、次の構文を使用します。
release(obj)
例
dsp.UDPSender
および dsp.UDPReceiver
System object をそれぞれ使用して UDP パケットを送受信します。正常に送信されたバイト数を計算します。
UDP 送信機の RemoteIPPort
と UDP 受信機の LocalIPPort
を 31000
に設定します。データ ベクトルの長さを、受信機の MaximumMessageLength
プロパティの値よりも小さい 128
サンプルに設定します。パケットの損失を回避するには、オブジェクト アルゴリズムへの最初の呼び出しの前に、受信機オブジェクトで setup
メソッドを呼び出します。
udpr = dsp.UDPReceiver('LocalIPPort',31000); udps = dsp.UDPSender('RemoteIPPort',31000); setup(udpr); bytesSent = 0; bytesReceived = 0; dataLength = 128;
反復の各ループでデータのパケットを送受信します。ループの最後に関数 fprintf
を使用して送信機から送信されたバイト数と、受信機が受信したバイト数を印刷します。
for k = 1:20 dataSent = uint8(255*rand(1,dataLength)); bytesSent = bytesSent + dataLength; udps(dataSent); dataReceived = []; while (isempty(dataReceived)) dataReceived = udpr(); end bytesReceived = bytesReceived + length(dataReceived); end release(udps); release(udpr); fprintf('Bytes sent: %d\n', bytesSent);
Bytes sent: 2560
fprintf('Bytes received: %d\n', bytesReceived);
Bytes received: 2560
dsp.UDPReceiver
オブジェクトのローカル IP ポート番号と dsp.UDPSender
オブジェクトのリモート IP ポート番号は生成されたコードで調整可能です。正弦波データを UDP ネットワークを介して受信するためのアルゴリズムが含まれる関数 receiver
から、MEX ファイルを生成します。MEX ファイルを再生成せずに、UDP 受信機のリモート IP ポート番号を変更します。ネットワークから送受信されるバイト数を確認します。
メモ: この例は R2017a 以降でのみ動作します。
関数 receiver
への入力は、dsp.UDPReceiver
System object™ のローカル IP ポート番号です。この関数の出力は、UDP ネットワークから受信したバイト数です。
type receiver
function [bytesReceived] = receiver(portnumber) persistent udpRx if isempty(udpRx) udpRx = dsp.UDPReceiver('MessageDataType','double'); end udpRx.LocalIPPort = portnumber; dataReceived = udpRx(); bytesReceived = length(dataReceived);
remoteIPPort
番号が 65000 に設定された dsp.UDPSender
オブジェクトは UDP ネットワーク経由でデータを送信します。LocalIPPort
番号が 65000 に設定された dsp.UDPReceiver
オブジェクトは UDP ネットワーク経由でデータを受信します。このデータはフレームあたり 250 サンプルを含んだ正弦波です。
portnumber = 65000; udpSend = dsp.UDPSender('RemoteIPPort',portnumber); sine = dsp.SineWave('SamplesPerFrame',250); bytesSent = 0; bytesReceived = 0; dataLength = 250; for i = 1:10 dataSent = sine(); bytesSent = bytesSent + dataLength; udpSend(dataSent); bytesReceived = bytesReceived + receiver(portnumber); end fprintf('Number of bytes sent: %d', bytesSent);
Number of bytes sent: 2500
fprintf('Number of bytes received: %d', bytesReceived);
Number of bytes received: 2250
データは UDP ネットワーク経由で正常に送受信されます。初期データはオーバーヘッドによって破棄されています。
関数 receiver.m
から MEX ファイルを生成します。
codegen receiver -args {65000}
Code generation successful.
送信機を解放し、RemotePort
番号を 25000 に変更します。受信機の LocalIPPort
番号は引き続き 65000 です。ポート番号が異なるため、データは正常に送信されません。
release(udpSend) portnumberTwo = 25000; udpSend.RemoteIPPort = portnumberTwo; bytesReceived = 0; bytesSent = 0; for i = 1:10 dataSent = sine(); bytesSent = bytesSent + dataLength; udpSend(dataSent); bytesReceived = bytesReceived + receiver_mex(portnumber); end fprintf('Number of bytes sent: %d', bytesSent);
Number of bytes sent: 2500
fprintf('Number of bytes received: %d', bytesReceived);
Number of bytes received: 0
MEX ファイルをクリアし、受信機のローカル IP ポート番号を 25000 に変更します。MEX をクリアすると、MEX を再生成しなくても受信機のポート番号を変更できます。送信機のポート番号と受信機のポート番号が一致します。データが正常に送信されたことを確認します。
clear mex %#ok bytesReceived = 0; bytesSent = 0; for i = 1:10 dataSent = sine(); bytesSent = bytesSent + dataLength; udpSend(dataSent); bytesReceived = bytesReceived + receiver_mex(portnumberTwo); end fprintf('Number of bytes sent: %d', bytesSent);
Number of bytes sent: 2500
fprintf('Number of bytes received: %d', bytesReceived);
Number of bytes received: 2250
データは UDP ネットワーク経由で正常に送信されています。初期データはオーバーヘッドによって破棄されています。
正弦波の STFT を計算し、複素数 STFT データを UDP ネットワーク経由で送信します。受信機側で受信データの ISTFT を計算します。送信データと受信データを時間スコープを使用して可視化します。
dsp.UDPSender
オブジェクトでは複素数データを送信できます。dsp.UDPReceiver
オブジェクトで複素数データを受信できるようにするには、IsMessageComplex
プロパティを true
に設定します。
udps = dsp.UDPSender('RemoteIPPort',31000); udpr = dsp.UDPReceiver('LocalIPPort',31000,... 'IsMessageComplex',true,... 'MessageDataType','double'); setup(udpr); bytesSent = 0; bytesReceived = 0; dataLength = 128;
dsp.STFT
System object と dsp.ISTFT
System object を長さが 120 サンプルでオーバーラップの長さが 60 サンプルの周期的 hann
ウィンドウで初期化します。FFT 長を 128 に設定します。
winLen = 120; overlapLen = 60; frameLen = winLen-overlapLen; stf = dsp.STFT(... 'Window',hann(winLen,'periodic'),... 'OverlapLength',overlapLen,'FFTLength',128); istf = dsp.ISTFT(... 'Window',hann(winLen,'periodic'),... 'OverlapLength',overlapLen,... 'WeightedOverlapAdd',0);
入力は、周波数が 100 Hz、サンプル レートが 1000 Hz、各信号フレームが 60 サンプルの正弦波信号です。
sine = dsp.SineWave(... 'SamplesPerFrame',winLen-overlapLen,... 'Frequency',100);
timescope
オブジェクトをサンプル レート 1000 Hz および時間範囲 0.09 で初期化します。Delay
オブジェクトで入力を再構成後の出力信号と比較してオーバーラップの長さを補正します。
ts = timescope('SampleRate',1000,... 'ShowLegend',true,... 'YLimits',[-1 1],... 'TimeSpanSource','Property',... 'TimeSpan',.09,... 'ChannelNames',{'Input','Reconstructed'}); dly = dsp.Delay('Length',overlapLen);
正弦波の複素数 STFT データを UDP ネットワーク経由で送信します。UDP プロトコルの信頼性が低いため、送信中にデータ パケットが失われる可能性があります。送信されたすべてのデータが受信者によって受信されるとは限りません。
受信データの ISTFT を計算します。入力 x
を再構成後の出力 y
と比較します。オブジェクトによって生じるレイテンシにより、再構成後の出力は入力と比べて時間がシフトしています。そのため、それらを比較するために、再構成後の出力 y
と前の入力 xprev
の差のノルムを取得します。
時間スコープを使用して信号を可視化します。再構成後の信号が入力信号と非常に緊密にオーバーラップしていることがわかります。
n = zeros(1,1e3); xprev = 0; for k = 1:1e3 x = sine(); X = stf(x); bytesSent = bytesSent + length(X); udps(X); dataReceived = []; while (isempty(dataReceived)) dataReceived = udpr(); end if (~isempty(dataReceived)) y = istf(dataReceived); end n(1,k) = norm(y-xprev); xprev = x; bytesReceived = bytesReceived + length(dataReceived); ts([dly(x),y]); end
差のノルムが非常に小さくなっており、出力信号が入力信号の完全に再構成されたバージョンであることを示しています。
max(abs(n))
ans = 6.1244e-14
UDP オブジェクトを解放します。
release(udps); release(udpr);
非可逆であるという UDP プロトコルの性質により、伝送中に一部の送信パケットが失われる可能性があります。損失がないかを確認するには、送信バイト数と受信バイト数を比較します。
fprintf('Bytes sent: %d\n', bytesSent);
Bytes sent: 128000
fprintf('Bytes received: %d\n', bytesReceived);
Bytes received: 128000
拡張機能
使用上の注意および制限:
MATLAB コード生成における System object (MATLAB Coder)
この System object から生成される実行可能ファイルは、MATLAB® に付属のプリビルドされたダイナミック ライブラリ ファイル (
.dll
ファイル) に依存します。このオブジェクトから生成されたコードとすべての関連ファイルを zip 圧縮ファイルにパッケージ化するには、関数packNGo
を使用します。この zip ファイルを使用して、MATLAB がインストールされていない他の開発環境にプロジェクトを移動して解凍し、リビルドすることができます。詳細については、How To Run a Generated Executable Outside MATLABを参照してください。
RemoteIPPort
プロパティは生成コードでは調整可能ですが、シミュレーション中は調整できません。
バージョン履歴
R2012a で導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)