Main Content

dsp.UDPSender

ネットワークへの UPD パケットの送信

説明

UDPSender オブジェクトは、ネットワークに UPD パケットを送信します。

ネットワークに UPD パケットを送信するには、次を行います。

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

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

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

作成

説明

udps = dsp.UDPSender は、指定ポートに UDP パケットを送信する UDP 送信機オブジェクト udps を返します。

udps = dsp.UDPSender(Name,Value) は、各プロパティが指定の値に設定されたUDP 送信機オブジェクト 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

使用法

説明

y = udps(Packet) はネットワークに 1 つの UDP パケット Packet を送信します。

入力引数

すべて展開する

オブジェクトは呼び出しごとに 1 つの UDP パケットをネットワークに送信します。

データ型: 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}
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 ネットワーク経由で送信します。受信データの 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 で導入

参考

オブジェクト

ブロック