dsp.UDPReceiver
UDP パケットのネットワークからの受信
説明
dsp.UDPReceiver System object™ は UDP ネットワークを介して RemoteIPAddress プロパティで指定した IP アドレスから UDP パケットを受信します。次に、オブジェクトは、データをその内部バッファーに保存します。各 UDP パケットで受信したデータの量 (要素の数) はさまざまです。データを失わずにオブジェクトが受信できる最大バイト数は ReceiveBufferSize プロパティで設定されます。MaximumMessageLength プロパティは各データ パケットに格納できる最大サンプル数を指定します。オブジェクトがデータを受信する LocalIPPort は生成コードでは調整可能ですが、シミュレーション中は調整できません。たとえば、MATLAB での UDP ポート番号の調整を参照してください。
UDP 伝送プロトコルの性質により、dsp.UDPSender オブジェクトを使用して送信されたすべてのデータ パケットが受信者によって受信されるとは限りません。
UDP パケットをネットワークから受信するには、次のようにします。
dsp.UDPReceiverオブジェクトを作成し、そのプロパティを設定します。関数と同様に、引数を指定してオブジェクトを呼び出します。
System object の機能の詳細については、System object とはを参照してください。
作成
プロパティ
特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release を使用します。
プロパティが "調整可能" の場合、その値をいつでも変更できます。
プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。
データを受信する端子。[1, 65535] の範囲内のスカラーとして指定します。このプロパティは生成コードでは調整可能ですが、シミュレーション中は調整できません。
データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
データの受信元のアドレス。有効な IP アドレスを含む文字ベクトルまたは string スカラーとして指定します。特定の IP アドレスを入力すると、その他のアドレスからの UDP パケットがブロックされます。既定値は '0.0.0.0' で、これはデータを任意のリモート IP アドレスから受信できることを示します。
データ型: char
UDP パケットを受信する内部バッファーのサイズ。[1, 67108864] の範囲のスカラーとしてバイト数で指定します。受信したバイト数がこの値を超える場合、バッファーがオーバーフローし、内容が切り捨てられます。
データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
出力メッセージの最大長。[1, 65507] の範囲内の正のスカラーとしてサンプル数で指定します。このプロパティは、UDP パケットのデータ サイズ以上の値に設定します。このプロパティの指定よりも多くのサンプル数を受信すると、超過したデータが切り捨てられます。
データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
メッセージ出力のベクトル要素のデータ型。MATLAB® の組み込みデータ型として指定します。
データ型を UDP パケットの作成に使用されるデータ入力と一致させます。
データ型: char
メッセージの実数/複素数。true または false として指定します。
受信メッセージが複素数の場合、このプロパティを true に設定します。受信メッセージが実数の場合、プロパティを false に設定します。
データ型: logical
使用法
出力引数
ネットワークから受信したデータ。1 つのパケットとして返されます。MaximumMessageLength プロパティは各データ パケットに格納できる最大バイト数を指定します。受信したデータの長さはネットワークから受信したバイト数です。
IsMessageComplex プロパティが true に設定されている場合、受信データは複素数データになります。
送信中にパケットが破棄され、受信側がパケットを受信しない場合、dataR 出力は空になります。
データ型: 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 receiverfunction [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を参照してください。LocalIPPortプロパティは生成コードでは調整可能ですが、シミュレーション中は調整できません。
バージョン履歴
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)