Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

dsp.UDPSender

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

説明

dsp.UDPSender オブジェクトは、ユーザー データグラム プロトコル (UDP) を使用して、ネットワーク経由でデータ パケットを送信します。UDP は、単純なメッセージベースのコネクションレス型プロトコルです。このプロトコルは、受信側の準備が整っているかどうかを確認せずに、送信元から宛先に一方向にデータ パケットを送信します。このプロトコルにはハンドシェイク メカニズムがありません。データ パケットは、さまざまな理由で破棄される可能性があります。UDP には確認応答、再送信、またはタイムアウトがありません。ただし、UDP は非常に単純な送信プロトコルであり、時間的に制約のある用途など、再送信によって遅延するパケットを待つよりもパケットを破棄する方が望ましい場合に適しています。

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

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

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

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

作成

説明

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

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 を送信します。

オブジェクトは UDP ネットワーク経由でデータを送信するため、送信中にデータ パケットが失われる可能性があり、送信されたすべてのデータが受信者によって受信されるとは限りません。dsp.UDPReceiver オブジェクトを使用してデータを受信できます。

入力引数

すべて展開する

オブジェクトは呼び出しごとに 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 パケットを送受信します。正常に送信されたバイト数を計算します。

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 = [];
    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 = 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 で導入

参考

オブジェクト

ブロック