Main Content

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

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

参考

| | | | |

関連するトピック