このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
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
参考
dsp.UDPSender
| dsp.UDPReceiver
| dsp.STFT
| dsp.ISTFT
| timescope
| dsp.Delay