このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
dsp.UDPSender
ネットワークへの UPD パケットの送信
説明
UDPSender
オブジェクトは、ネットワークに UPD パケットを送信します。
ネットワークに UPD パケットを送信するには、次を行います。
dsp.UDPSender
オブジェクトを作成し、そのプロパティを設定します。関数と同様に、引数を指定してオブジェクトを呼び出します。
System object の機能の詳細については、System object とはを参照してください。
作成
説明
は、指定ポートに UDP パケットを送信する UDP 送信機オブジェクト udps
= dsp.UDPSenderudps
を返します。
は、各プロパティが指定の値に設定されたUDP 送信機オブジェクト udps
= dsp.UDPSender(Name,Value
)udps
を返します。
プロパティ
特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release
を使用します。
プロパティが "調整可能" の場合、その値をいつでも変更できます。
プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。
RemoteIPAddress
— データの送信先リモート アドレス
'127.0.0.1'
(既定値) | 有効な IP アドレスを含む文字ベクトル | string スカラー
データの送信先となるリモート (つまりホスト) IP アドレスを指定します。既定の設定はローカルホストの '127.0.0.1'
となります。
データ型: char
RemoteIPPort
— データの送信先リモート ポート
25000
(既定値) | 範囲 [1, 65535] の整数
データの送信先となるリモート IP アドレスのポートを指定します。このプロパティは生成コードでは調整可能ですが、シミュレーション中は調整できません。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
LocalIPPortSource
— ローカル IP ポートのソース
Auto
(既定値) | Property
ホストのローカル IP ポートの決定方法を Auto
または Property
として指定します。Auto
を指定すると、オブジェクトは利用可能なポートから動的にポートを選択します。Property
を指定すると、オブジェクトは LocalIPPort
プロパティが指定するソースを使用します。
LocalIPPort
— データの送信元ローカル ポート
25000
(既定値) | 範囲 [1, 65535] の整数
データの送信元となるポートを指定します。
依存関係
このプロパティは、LocalIPPortSource
プロパティを Property
に設定した場合に適用されます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
SendBufferSize
— 内部バッファーのサイズ
8192
バイト (既定値) | 範囲 [1, 67108864]
の整数
UDP パケットを送信する内部バッファーのサイズ。範囲 [1, 67108864]
の整数としてバイト数で指定します。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
使用法
入力引数
Packet
— 送信データ
スカラー | ベクトル
オブジェクトは呼び出しごとに 1 つの UDP パケットをネットワークに送信します。
データ型: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| logical
複素数のサポート: あり
オブジェクト関数
オブジェクト関数を使用するには、System object™ を最初の入力引数として指定します。たとえば、obj
という名前の System object のシステム リソースを解放するには、次の構文を使用します。
release(obj)
例
UDP を使用したバイトの伝送
dsp.UDPSender
および dsp.UDPReceiver
System object をそれぞれ使用して UDP パケットを送受信します。正常に送信されたバイト数を計算します。
メモ: R2016a 以前のリリースを使用している場合、それぞれのオブジェクトの呼び出しを等価な step 構文で置き換えてください。たとえば、obj(x)
は step(obj,x)
になります。
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 = 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
MATLAB での UDP ポート番号の調整
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 ネットワーク経由で正常に送信されています。初期データはオーバーヘッドによって破棄されています。
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
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意および制限:
MATLAB コード生成における System object (MATLAB Coder)
この System object から生成される実行可能ファイルは、MATLAB® に付属のプリビルドされたダイナミック ライブラリ ファイル (
.dll
ファイル) に依存します。このオブジェクトから生成されたコードとすべての関連ファイルを zip 圧縮ファイルにパッケージ化するには、関数packNGo
を使用します。この zip ファイルを使用して、MATLAB がインストールされていない他の開発環境にプロジェクトを移動して解凍し、リビルドすることができます。詳細は、How To Run a Generated Executable Outside MATLABを参照してください。
RemoteIPPort
プロパティは生成コードでは調整可能ですが、シミュレーション中は調整できません。
バージョン履歴
R2012a で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)