最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

アイ ダイアグラムおよびコンスタレーション ダイアグラム

この例では、通信システムの解析において comm.EyeDiagram および comm.ConstellationDiagram を使用する方法を示します。

comm.EyeDiagram System object™ の使用

PLOT を使用してフィルター処理された変調信号をプロットしても、変調の特性はアイ ダイアグラムおよびコンスタレーション ダイアグラムほど明確には示されません。アイ ダイアグラムは、信号特性を表すために、トレースと呼ばれる多くの短いセグメントを重ね合わせます。コンスタレーション ダイアグラムは、シンボル時間における信号をサンプリングして、信号空間 (I/Q) に表示します。シミュレーション パラメーター (サンプルレート、シンボルあたりのサンプル数) は、解析用に高解像度を提供します。

% Initialize system parameters
Fs = 10000;     % Sample rate
Rs = 100;       % Symbol rate
sps = Fs/Rs;    % Samples per symbol
rolloff = 0.5;  % Rolloff factor
M = 4;          % Modulation order (QPSK)

% Square root raised cosine filters.
filterSpan = 6;
filterGainTx = 9.9121;
transmitFilter = comm.RaisedCosineTransmitFilter('RolloffFactor', rolloff, ...
    'OutputSamplesPerSymbol', sps, ...
    'FilterSpanInSymbols', filterSpan, ...
    'Gain', filterGainTx);
receiveFilter = comm.RaisedCosineReceiveFilter('RolloffFactor', rolloff, ...
    'InputSamplesPerSymbol', sps, ...
    'FilterSpanInSymbols', filterSpan, ...
    'DecimationFactor', 1, ...
    'Gain', 1/filterGainTx);


% Generate modulated and pulse shaped signal
frameLen = 1000;
message = randi([0 M-1], frameLen, 1);
modulated = pskmod(message, M, pi/4);
filteredTx = transmitFilter(modulated);

t = 0:1/Fs:50/Rs-1/Fs; idx = round(t*Fs+1);
hFig = figure; plot(t, real(filteredTx(idx)));
title('Modulated, filtered in-phase signal');
xlabel('Time (sec)');
ylabel('Amplitude');
grid on;

% Manage the figures
hFig.Position = [50 400 hFig.Position(3:4)];

アイ ダイアグラム System object は、システムの特性を解析するために、変調されたパルス整形信号の複数のトレースをプロットするのに使用されます。次の図では、2 次元カラーのアイ ダイアグラムがプロットされます。色の輝度は、指定時間での入力信号の振幅の確率密度関数 (PDF) に比例するものとします。上のプロットは解析信号の同相成分で、下のプロットは直交成分です。SymbolsPerTrace プロパティの既定値は 2 であるため、アイ ダイアグラムのスパンは、2 つのシンボル分となります。次の例では、送信信号が解析されます。ルート レイズド コサイン パルス整形フィルターにより導入される符号間干渉 (ISI) をはっきりと確認できます。

% Create an eye diagram object
eyeObj = comm.EyeDiagram(...
    'SampleRate', Fs, ...
    'SamplesPerSymbol', sps, ...
    'DisplayMode', '2D color histogram', ...
    'ShowImaginaryEye', true, ...
    'YLimits', [-0.7 0.7]) %#ok<NOPTS>

% Update the eye diagram object with the transmitted signal
eyeObj(0.5*filteredTx);

% Manage the figures:
eyeObj.Position = [hFig.Position(1)+hFig.Position(3) hFig.Position(2) ....
                   eyeObj.Position(3)*0.75 eyeObj.Position(4)];
hFig.Visible = 'off';
eyeObj = 

  comm.EyeDiagram with properties:

                  Name: 'Eye Diagram'

   Trace configuration
            SampleRate: 10000
      SamplesPerSymbol: 100
          SampleOffset: 0
       SymbolsPerTrace: 2

   Display configuration
           DisplayMode: '2D color histogram'
    EnableMeasurements: 0
      ShowImaginaryEye: 1
               YLimits: [-0.7000 0.7000]
              ShowGrid: 1
              Position: [320 282 640 460]

  Use get to show all properties

ここで、受信信号を調べます。受信信号は、シンボル エネルギーとノイズ パワーのスペクトル密度比 (Es/No) が 20 dB となる AWGN によって破損し、受信側は整合フィルターを採用すると仮定します。したがって、この組み合わされたフィルターを受信側から見ると、ISI が最小の近似レイズド コサイン フィルターとなります。アイ ダイアグラムで確認できる問題は、信号がオブジェクトの振幅の制限を超過していることです。コマンド ライン警告からわかるように、アイ ダイアグラムのオブジェクトは範囲外の値を無視します。

EsNo = 20; SNR = EsNo - 10*log10(sps);

% Create an comm.AWGNChannel System object and set its NoiseMethod property
% to 'Signal to noise ratio (SNR)'. Set the 'SignalPower' property to the
% calculated input signal power.
channel = comm.AWGNChannel('NoiseMethod', 'Signal to noise ratio (SNR)',...
  'SNR', SNR);
channel.SignalPower = var(filteredTx);
received = channel(filteredTx);
filteredRx = receiveFilter(received);

% Discard the existing eye diagram data
reset(eyeObj);

% Step the eye diagram object with the received signal
eyeObj(filteredRx);

figure(hFig);
plot(t, real(filteredRx(idx)));
title(['Modulated, filtered noisy in-phase signal, Es/No = ' ...
    num2str(EsNo) ' dB']);
xlabel('Time (sec)');
ylabel('Amplitude');
grid on;
Warning: An input value is outside the specified Y limits and is ignored. 

解析のすべての信号が含まれるよう、振幅の制限を調整することができます。振幅の制限を変更すると、アイ ダイアグラム オブジェクトがリセットされるため、同じ入力でアイ ダイアグラムをもう一度更新する必要があります。新しい振幅制限で、範囲外の警告がスローされなくなります。

eyeObj.YLimits = [-1.5 1.5];
eyeObj(filteredRx);

カラー スケールを対数に設定すると、アイ ダイアグラムの小さい PDF 値がより見やすくなります。このビューでより見やすくなるのは、ゼロ レベル付近のアイパターンの開口部を通過するラインです。これらのラインは、入力信号の初期の過渡特性によるものです。

eyeObj.ColorScale = 'Logarithmic';

アイ ダイアグラム解析の精度は、アイ ダイアグラムのオブジェクトを通過するシンボルの数が増加するにつれて向上します。次の例では、アイ ダイアグラムのオブジェクトがループでステップ インされ、2000 個のデータ シンボルを収集します。アイパターンの最も幅の広い振幅の開口部は、10 ms で発生します。これは、最適なサンプリング時間に対応します。

eyeObj.ColorScale = 'Linear';
release(channel);
release(transmitFilter);
release(receiveFilter);
release(eyeObj);
frameLen = 50; nFrames = 40;
for p = 1:nFrames
    message = randi([0 M-1],frameLen,1);
    modulated = pskmod(message, M, pi/4);
    filteredTx = transmitFilter(modulated);

    channel.SignalPower = var(filteredTx);
    received = channel(filteredTx);
    filteredRx = receiveFilter(received);

    eyeObj(filteredRx);
end

アイ ダイアグラムの時間オフセットを、アイ ダイアグラムの開口部を時間軸に沿って移動するように設定できます。下の図では、5 ms の時間オフセットがアイ ダイアグラムに適用されています。時間オフセットは、プロットのみを目的とし、回収データへの影響はありません。

eyeObj.SampleOffset = 5e-3*Fs;

[Style] ダイアログ ([表示] -> [スタイル...]) を使用して、アイ ダイアグラムに別のカラーマップを指定できます。次の例では、MATLAB® 付属の 'ジェット' カラーマップを選択します。カスタム カラーマップも指定できます。

hide(eyeObj);

アイ ダイアグラムの背景色は、カスタム カラーマップを指定することで調整できます。背景色はゼロの PDF に対応する色でもあるため、カラーマップの最初の要素は背景色に対応します。以下では、背景色が黒に設定されます。

cmap = jet(64);
cmap(1,:) = [0 0 0];

アイ ダイアグラムのオブジェクトでは、PDF 値の代わりに個々のトレースを使用して受信側信号をプロットすることもできます。こうした機能は、チャネルの短期間の表示をすばやく得るのに便利です。アイ ダイアグラムのオブジェクトの TracesToDisplay プロパティにより、オブジェクトによりプロットされるトレースの数が決定されます。10 個のトレースのみがプロットされるため、アイ ダイアグラムでは信号値の範囲が完全に示されません。

eyeObj.SampleOffset = 0;
eyeObj.DisplayMode = 'Line plot';
eyeObj.TracesToDisplay = 10;
show(eyeObj);

より見やすいラインプロットのアイ ダイアグラムを得るため、TracesToDisplay を増やします。

eyeObj.TracesToDisplay = 100;

comm.ConstellationDiagram System object の使用

comm.ConstellationDiagram は、通常はシンボルあたりのサンプル数 NSAMPS に設定される要素で間引きをしたコンスタレーション ダイアグラム (散布図とも呼ばれます) を生成します。これは、直交成分に対する信号の同相成分のプロットです。得られるプロットは、シンボル レートでサンプリングしたフィルター処理済み整合信号を示します。送信側および受信側フィルターを組み合わせたものは、理想のレイズド コサイン フィルターに対する近似であるため、受信したシンボルは送信されたシンボルとまったく同じというわけではありません。これらは ShowReferenceConstellation プロパティと ReferenceConstellation プロパティを使用して視覚的に比較できます。

% Close figures
close(hFig(ishghandle(hFig)));

% Pass the noiseless transmitted signal through a matched filter
filteredRx = receiveFilter(filteredTx);

% Create the constellation diagram
delay = 6*Fs/Rs;
filteredRxDelayed = filteredRx(delay+1:end);
cdObj = comm.ConstellationDiagram('SamplesPerSymbol', sps, ...
                                  'ShowReferenceConstellation', true, ...
                                  'ReferenceConstellation', qammod(0:3, 4, 'UnitAveragePower', 1));
cdObj(filteredRxDelayed);

% Manage the figures
cdObj.Position = [eyeObj.Position(1)+eyeObj.Position(3) eyeObj.Position(2) ....
                  cdObj.Position(3)*0.75 cdObj.Position(4)*0.75];

信号軌跡は、ShowTrajectory プロパティを true に設定するか、対応するツール バー ボタンをクリックしてもプロットできます。[スタイル] ダイアログ ([表示] -> [スタイル...]) を使用して、個々のグラフィカルなプロパティを割り当てることができます。シアン色の線は、信号空間内の直交成分に対する受信側信号の軌跡の同相成分を示しています。黄色のドットは、シンボル サンプリング時間で信号を示しています。赤の十字は指定された変調方式の送信されたシンボルを示しています。このプロットは、信号が信号空間で移動しても、シンボルの境界でサンプリングされた場合にはその値が元の信号の値に近づくことを示しています。

cdObj.ShowTrajectory = true;

ColorFading プロパティを使用して、ハードウェアのオシロスコープのように、より古いシンボルを薄くできます。

cdObj.ColorFading = true;

アイ ダイアグラムとコンスタレーション ダイアグラムを使用した通信システムの解析

次のコードは、AWGN チャネルを通過し、受信側で整合フィルター処理された信号をプロットします (赤い線)。ノイズを含む信号とノイズを含まない整合フィルター処理された信号 (青い線) とを分離できたとしても、信号に対するノイズの効果を特定することは困難です。ノイズ信号の Es/No は 10 dB です。これは、-10 dB の信号対ノイズ比 (SNR) に対応します。

% Create the plot
EsNo = 10; SNR = EsNo - 10*log10(sps);
frameLen = 1000;
release(channel);
release(transmitFilter);
release(receiveFilter);
channel.SNR = SNR;

message = randi([0 M-1],frameLen,1);
modulated = pskmod(message, M, pi/4);
filteredTx = transmitFilter(modulated);
filteredRxPerfect = receiveFilter(filteredTx);

channel.SignalPower = var(filteredTx);
received = channel(filteredTx);
filteredRx = receiveFilter(received);

t = 6/Rs:1/Fs:40/Rs-1/Fs;
idx = round(t*Fs+1);

hFig = figure;
plot(t,real(filteredRxPerfect(idx)),'b-',t,real(filteredRx(idx)),'r-');
title('Modulated, filtered in-phase signal and noisy signal');
xlabel('Time (sec)');
ylabel('Amplitude');
grid on;
legend('Modulated, filtered signal', ...
    ['Noisy, filtered signal, Es/No=' num2str(EsNo) ' dB'], ...
    'Location', 'SouthWest');

% Manage the figures
hFig.Position = [50 400 hFig.Position(3:4)];

以下の図は、ノイズを含まない整合フィルター処理済みの受信信号およびノイズ信号のアイ ダイアグラムです。アイ ダイアグラムは、AWGN チャネルおよび受信側フィルターによって送信信号から受信した信号の変動を明確に示しています。

% Create the eye diagrams
eyeObj.YLimits = [-2 2];
release(eyeObj);
eyeObj(filteredRxPerfect);
eyeObj.Name = 'Noiseless Eye Diagram';

eyeObj.Position = [hFig.Position(1)+hFig.Position(3) eyeObj.Position(2)  ....
                   eyeObj.Position(3) eyeObj.Position(4)];

% Make an independent copy of the eye diagram object
eyeObjNoise = clone(eyeObj);
eyeObjNoise.Name = 'Noisy Eye Diagram, Es/No = 10 dB';
reset(eyeObjNoise);
eyeObjNoise(filteredRx);

% Manage the figures
close(hFig(ishghandle(hFig)));
eyeObjNoise.Position = [eyeObjNoise.Position(1)+eyeObjNoise.Position(3) eyeObjNoise.Position(2) ...
                        eyeObjNoise.Position(3) eyeObjNoise.Position(4)];

以下の図は、ノイズを含まない整合フィルター処理済みの受信信号およびノイズ信号のコンスタレーション ダイアグラムです。それらは、理想的なサンプリング時間での受信信号における送信信号からの変動を明確に示しています。

% Create the constellation diagrams
delay = 6/Rs * Fs;
cdObj       = comm.ConstellationDiagram('SamplesPerSymbol', sps);
cdObj.Name = 'Noiseless Constellation Diagram';
cdObjNoise  = comm.ConstellationDiagram('SamplesPerSymbol', sps);
cdObjNoise.Name = 'Noisy Constellation Diagram, Es/No = 10 dB';
cdObj(filteredRxPerfect(delay+1:end));
cdObjNoise(filteredRx(delay+1:end));

% Manage the figures
hide(eyeObj);
hide(eyeObjNoise);
cdObj.Position = [eyeObj.Position(1) eyeObj.Position(2) ....
                  cdObj.Position(3)*0.75 cdObj.Position(4)*0.75];
cdObjNoise.Position = cdObj.Position + [cdObj.Position(3) 0 0 0];

以下は、同じ送信信号ですが、Es/No が 20 dB (マゼンタ色の線) で受信した信号のプロットです。ノイズによって生じる変動は、前の信号のものより小さくなります (Es/No = 10 dB)。この場合、システムの特性を特定するため、アイ ダイアグラムおよびコンスタレーション ダイアグラムの必要性が高くなります。

% Close all open figures
hide(eyeObj);hide(eyeObjNoise); hide(cdObj);hide(cdObjNoise);

% Plot the transmitted signal
EsNo2 = 20; SNR2 = EsNo2 - 10*log10(sps);
channel.SNR = SNR2;
channel.SignalPower = var(filteredTx);
received = channel(filteredTx);
filteredRx = receiveFilter(received);

hFig = figure;
plot(t, real(filteredRxPerfect(idx)),'b-', t, real(filteredRx(idx)), 'm-');
title('Modulated, filtered signal and noisy signal');
xlabel('Time (sec)');
ylabel('Amplitude');
grid on;
legend('Modulated, filtered signal', ...
    ['Noisy signal, Es/No=' num2str(EsNo2) ' dB'], ...
    'Location', 'SouthWest');

% Manage the figures
hFig.Position = [50 400 hFig.Position(3:4)];

以下の図は、1 回目のノイズ信号および 2 回目のノイズ信号のアイ ダイアグラムです。2 回目の受信信号の変動は、1 回目の受信信号より小さいことがはっきりとわかります。

% Close figures
close(hFig(ishghandle(hFig)));

% Create the eye diagram plots
eyeObjNoise2 = clone(eyeObj);
eyeObjNoise.Name = 'Noisy Eye Diagram, Es/No = 20 dB';
eyeObjNoise2(filteredRx);

% Manage the figures
eyeObjNoise2.Position = eyeObjNoise.Position; eyeObjNoise.Position = eyeObj.Position;
show(eyeObjNoise); show(eyeObjNoise2);

以下の図は、1 回目のノイズ信号および 2 回目のノイズ信号のコンスタレーション ダイアグラムです。サンプリング点における 2 回目の受信信号の変動は、1 回目の受信信号より小さいことがはっきりとわかります。

% Create constellation diagrams
cdObjNoise2 = clone(cdObj);
cdObjNoise2.Name = 'Noisy Constellation Diagram, Es/No = 20 dB';
release(cdObjNoise2);
cdObjNoise2(filteredRx);

% Manage the figures
cdObjNoise2.Position = cdObjNoise.Position; cdObjNoise.Position = cdObj.Position;
show(cdObjNoise); show(cdObjNoise2); hide(eyeObjNoise); hide(eyeObjNoise2);

アイ ダイアグラムとコンスタレーション ダイアグラムを使用したタイミング誤差による影響の可視化

アイ ダイアグラムおよびコンスタレーション ダイアグラムを使用すると、タイミング誤差による影響を可視化できます。また、このアニメーションは、どのようなオフセットでもコンスタレーション ダイアグラムおよびアイ ダイアグラムをプロットできることを示しています。このアニメーションには、整合フィルター処理済みの 2 回目のノイズ信号を使用します。アイ ダイアグラムの青い線は、サンプル時間を示します。コンスタレーション ダイアグラムの赤いドットは、最適なサンプリング時間におけるサンプルを示します。一方、青い星は、サンプル時間オフセットの付いたサンプルを示します。

% Prepare scopes
hide(cdObjNoise);
cdObjNoise2.ShowTrajectory = true;
eyeObjNoise2.DisplayMode = '2D color histogram';
reset(eyeObjNoise2);
release(eyeObjNoise2);
release(cdObjNoise2);
eyeObjNoise2(filteredRx(idx));
cdObjNoise2(filteredRx(idx));

helperPrepareScatterEyeAnimation(cdObjNoise2, eyeObjNoise2);

% Create and animate the plots
for offset = (0:1:Fs/Rs-1)
  eyeObjNoise2.SampleOffset = offset;
  cdObjNoise2.SampleOffset  = offset;
  pause(0.1);
end