Main Content

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

dsp.UDPReceiver

UDP パケットのネットワークからの受信

説明

dsp.UDPReceiver System object™ は UDP ネットワークを介して RemoteIPAddress プロパティで指定したリモート IP アドレスから UDP パケットを受信します。次に、オブジェクトは、データをその内部バッファーに保存します。各 UDP パケットで受信したデータの量 (要素の数) はさまざまです。データを失わずにオブジェクトが受信できる最大バイト数は ReceiveBufferSize プロパティで設定されます。MaximumMessageLength プロパティは各データ パケットに格納できる最大サンプル数を指定します。オブジェクトがデータを受信する LocalIPPort は生成コードでは調整可能ですが、シミュレーション中は調整できません。たとえば、MATLAB での UDP ポート番号の調整を参照してください。

UDP パケットをネットワークから受信するには、次のようにします。

  1. dsp.UDPReceiver オブジェクトを作成し、そのプロパティを設定します。

  2. 関数と同様に、引数を指定してオブジェクトを呼び出します。

System object の機能の詳細については、System object とはを参照してください。

作成

説明

udpr = dsp.UDPReceiver は、指定ポートから UDP パケットを受信する UDP 受信機オブジェクトを返します。

udpr = dsp.UDPReceiver(Name,Value) は、指定した各プロパティが指定の値に設定された UDP 受信機オブジェクトを返します。各プロパティ名を一重引用符で囲みます。

プロパティ

すべて展開する

特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 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

使用法

説明

dataR = udpr() はネットワークから 1 つの UDP パケットを受信します。

出力引数

すべて展開する

ネットワークから受信したデータ。1 つのパケットとして返されます。MaximumMessageLength プロパティは各データ パケットに格納できる最大バイト数を指定します。受信したデータの長さはネットワークから受信したバイト数です。

IsMessageComplex プロパティが true に設定されている場合、受信データは複素数データになります。

データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical
複素数のサポート: あり

オブジェクト関数

オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj という名前の System object のシステム リソースを解放するには、次の構文を使用します。

release(obj)

すべて展開する

stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット

すべて折りたたむ

dsp.UDPSender および dsp.UDPReceiver System object をそれぞれ使用して UDP パケットを送受信します。正常に送信されたバイト数を計算します。

メモ: R2016a 以前のリリースを使用している場合、それぞれのオブジェクトの呼び出しを等価な step 構文で置き換えてください。たとえば、obj(x)step(obj,x) になります。

UDP 送信機の RemoteIPPort と UDP 受信機の LocalIPPort31000 に設定します。データ ベクトルの長さを、受信機の 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 = udpr();
   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}

送信機を解放し、RemoteIPPort 番号を 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);

dsp.TimeScope オブジェクトをサンプルレート 1000 Hz および時間範囲 0.09 で初期化します。Delay オブジェクトで入力を再構成後の出力信号と比較してオーバーラップの長さを補正します。

ts  = dsp.TimeScope('SampleRate',1000,'ShowLegend',true,'YLimits',[-1 1],'TimeSpan',.09,...
    'ChannelNames',{'Input','Reconstructed'});
dly = dsp.Delay('Length',overlapLen);

正弦波の複素数 STFT データを 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 = udpr();
   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 = 5.3870e-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

拡張機能

R2012a で導入