このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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 でのシステム設計を参照してください。
LocalIPPort
— データを受信するローカル ポート
25000
(既定値) | [1, 65535]
データを受信する端子。[1, 65535] の範囲内のスカラーとして指定します。このプロパティは生成コードでは調整可能ですが、シミュレーション中は調整できません。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
RemoteIPAddress
— データ受信元のアドレス
'0.0.0.0'
(既定値) | 有効な IP アドレスを含む文字ベクトル | string スカラー
データの受信元のアドレス。有効な IP アドレスを含む文字ベクトルまたは string スカラーとして指定します。特定の IP アドレスを入力すると、その他のアドレスからの UDP パケットがブロックされます。既定値は '0.0.0.0'
で、これはデータを任意のリモート IP アドレスから受信できることを示します。
データ型: char
ReceiveBufferSize
— 内部バッファーのサイズ
8192
バイト (既定値) | [1, 67108864]
UDP パケットを受信する内部バッファーのサイズ。[1, 67108864]
の範囲のスカラーとしてバイト数で指定します。受信したバイト数がこの値を超える場合、バッファーがオーバーフローし、内容が切り捨てられます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
MaximumMessageLength
— 出力メッセージの最大サイズ
255
(既定値) | [1, 65507]
出力メッセージの最大長。[1, 65507] の範囲内の正のスカラーとしてサンプル数で指定します。このプロパティは、UDP パケットのデータ サイズ以上の値に設定します。このプロパティの指定よりも多くのサンプル数を受信すると、超過したデータが切り捨てられます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
MessageDataType
— メッセージのデータ型
'uint8'
(既定値) | 'double'
| 'single'
| 'int8'
| 'int16'
| 'uint16'
| 'int32'
| 'uint32'
| 'logical'
メッセージ出力のベクトル要素のデータ型。MATLAB® の組み込みデータ型として指定します。
データ型を UDP パケットの作成に使用されるデータ入力と一致させます。
データ型: char
IsMessageComplex
— メッセージの実数/複素数
false
(既定値) | true
メッセージの実数/複素数。true
または false
として指定します。
受信メッセージが複素数の場合、このプロパティを true
に設定します。受信メッセージが実数の場合、プロパティを false
に設定します。
データ型: logical
使用法
出力引数
dataR
— 受信したデータ
スカラー | ベクトル
ネットワークから受信したデータ。1 つのパケットとして返されます。MaximumMessageLength プロパティは各データ パケットに格納できる最大バイト数を指定します。受信したデータの長さはネットワークから受信したバイト数です。
IsMessageComplex
プロパティが true
に設定されている場合、受信データは複素数データになります。
送信中にパケットが破棄され、受信側がパケットを受信しない場合、dataR
出力は空になります。
データ型: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| logical
複素数のサポート: あり
オブジェクト関数
オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj
という名前の System object のシステム リソースを解放するには、次の構文を使用します。
release(obj)
例
UDP を使用したバイトの伝送
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
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 ネットワーク経由で送信します。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
拡張機能
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を参照してください。LocalIPPort
プロパティは生成コードでは調整可能ですが、シミュレーション中は調整できません。
バージョン履歴
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)