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

アイ ダイアグラム測定

この例では、comm.EyeDiagram System object を使用して、シミュレートした信号のアイ ダイアグラムを測定する方法を示します。

comm.EyeDiagram System object の使用

comm.EyeDiagram System object は、垂直および水平ヒストグラムの形式でアイ ダイアグラム データを収集します。これらのヒストグラムを使用して、テスト対象システムの定量的指標を抽出します。これらの定量的指標はアイ ダイアグラム測定と呼ばれます。次のシミュレーション パラメーター (サンプルレート、シンボルあたりのサンプル数) は、解析用に高解像度を提供するために選択されます。

% Initialize system parameters
Fs = 10000;             % Sample rate
Rs = 100;               % Symbol rate (Sps)
sps = Fs/Rs;            % Number of samples per symbol
SNR = 30;               % Signal to noise ratio (dB)
Trise = 1/(5*Rs);       % Rise time of the NRZ signal
Tfall = 1/(5*Rs);       % Fall time of the NRZ signal
frameLen = 5000;        % Number of symbols in a frame

次のコードは、通信信号源パッケージに用意されたパターン発生器を利用してバイナリ非ゼロ復帰 (NRZ) 信号を生成します。次に、comm.AWGNChannel System object を介してこの信号に加法性ホワイト ガウス ノイズ (AWGN) を追加します。次に、時間領域信号がプロットされます。信号特性を調べるもう 1 つの方法は、アイ ダイアグラム System object を使用して信号のアイ ダイアグラムを生成することです。アイ ダイアグラムのトレース内のシンボル数を示す SymbolsPerTrace プロパティを 2 に設定して、測定を行う必要があります。右側の図は同じ信号のアイ ダイアグラムを示します。SampleOffset を指定した値に設定して、アイ ダイアグラムを図の中央に配置します。アイ ダイアグラム オブジェクトの使い方の詳細は、ドキュメンテーション (comm.EyeDiagram) およびアイ ダイアグラムおよびコンスタレーション ダイアグラムの例を参照してください。

% Set up the pattern generator
src = commsrc.pattern('SamplingFrequency', Fs, ...
                      'SamplesPerSymbol', sps, ...
                      'RiseTime', Trise, ...
                      'FallTime', Tfall) %#ok

% Generate NRZ signal
message = generate(src, frameLen);

% Create an comm.AWGNChannel System object.
% Set the NoiseMethod property of the channel to 'Signal to noise ratio
% (SNR)'. The commsrc.pattern object generates unit power signals; set the
% SignalPower property to 1 Watt.
channel = comm.AWGNChannel('NoiseMethod', 'Signal to noise ratio (SNR)',...
  'SNR', SNR, 'SignalPower', 1);

% Add AWGN
received = channel(message);

% Create an eye diagram and display properties
eyeObj = comm.EyeDiagram(...
    'YLimits', [-1.5 1.5], ...
    'SamplesPerSymbol', sps, ...
    'SampleRate', Fs, ...
    'SampleOffset', 0.004*Fs, ...
    'DisplayMode', '2D color histogram', ...
    'ColorScale', 'Logarithmic') %#ok

% Update the eye diagram object with the noisy NRZ signal
eyeObj(received);

% Plot the time domain signal
t = 0:1/Fs:15/Rs-1/Fs; idx = round(t*Fs+1);
hFig = figure('Position', [0 0 460 360]);
plot(t, received(idx));
title('Noisy NRZ signal');
xlabel('Time (sec)');
ylabel('Amplitude');
grid on;

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

                 Type: 'Pattern Generator'
    SamplingFrequency: 10000
     SamplesPerSymbol: 100
           SymbolRate: 100
            PulseType: 'NRZ'
         OutputLevels: [-1 1]
             RiseTime: 0.0020
             FallTime: 0.0020
          DataPattern: 'PRBS7'
               Jitter: [1x1 commsrc.combinedjitter]


eyeObj = 

  comm.EyeDiagram with properties:

                  Name: 'Eye Diagram'

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

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

  Use get to show all properties

バックプレーン通信などの高速アプリケーションでは特に、タイミング ジッターが通信信号の重要な特性となります。タイミング ジッターは、信号のタイミング クロックの理想クロックからの偏差として定義されます。タイミング ジッターは、次のサブカテゴリに二分されます [1]。確定的ジッターおよびランダム ジッター [ 1 ]。確定的ジッターの 2 つの例には周期的ジッターと符号間干渉 (ISI) があります。

周期ジッターは正弦波の和として、ISI は関数 Dirac の列としてモデル化できます。ランダム ジッターは、信号クロック エッジのガウス バリエーションとしてモデル化されます。

通信システムで発生するジッターには、これらの成分を任意に組み合わせることができます。通常使用される組み合わせは双対 Dirac モデルで、ISI とランダム ジッターが組み合わされています [ 2 ]。ISI は 2 つの振幅が等しい関数 Dirac によってモデル化されます。次の図は、ランダム ジッター、周期的ジッター、周期的なジッターとランダム ジッター、および ISI とランダム ジッターの確率密度を示します。ジッター サンプルは通信信号源パッケージで提供されるジッター発生器を使用して生成します。

histEdges = -0.1/Rs:1/(10*Fs):0.1/Rs; hFigPdf = figure;

% Obtain PDF of random jitter generated by the combined jitter object. Set
% random jitter standard deviation to 1% of symbol time.
jitterSrc = commsrc.combinedjitter('SamplingFrequency', Fs, ...
  'RandomJitter', 'on', 'RandomStd', 0.01/Rs);
jitter = generate(jitterSrc, 1e6);
rjPdf = histc(jitter, histEdges);
rjPdf = rjPdf / sum(rjPdf);
subplot(221);
plot(histEdges*1e3,rjPdf);
grid on;
title('Random Jitter');
xlabel('Time (ms)');
ylabel('PDF');

% Obtain PDF of periodic jitter. Set jitter amplitude to 5% of symbol time
% and jitter frequency to 3 Hz.
set(jitterSrc, 'RandomJitter', 'off', 'PeriodicJitter', 'on', ...
    'PeriodicAmplitude', 0.05/Rs, 'PeriodicFrequencyHz', 3);
jitter = generate(jitterSrc, 1e6);
rjPdf = histc(jitter, histEdges);
rjPdf = rjPdf / sum(rjPdf);
subplot(222);
plot(histEdges*1e3,rjPdf);
grid on;
title('Periodic Jitter');
xlabel('Time (ms)');
ylabel('PDF');

% Obtain PDF of random and periodic jitter
jitterSrc.RandomJitter = 'on';
jitter = generate(jitterSrc, 1e6);
rjPdf = histc(jitter, histEdges);
rjPdf = rjPdf / sum(rjPdf);
subplot(223);
plot(histEdges*1e3,rjPdf);
grid on;
title('Periodic and Random Jitter');
xlabel('Time (ms)');
ylabel('PDF');

% Obtain PDF of ISI and random jitter
jitterSrc.PeriodicJitter = 'off';
jitterSrc.DiracJitter = 'on';
jitterSrc.DiracDelta = 0.05/Rs*[-1 1];
jitter = generate(jitterSrc, 1e6);
rjPdf = histc(jitter, histEdges);
rjPdf = rjPdf / sum(rjPdf);
subplot(224);
plot(histEdges*1e3,rjPdf);
grid on;
title('ISI and Random Jitter');
xlabel('Time (ms)');
ylabel('PDF');

同じジッター オブジェクトをパターン発生器で使用して出力信号にジッターを注入できます。以下のコードは、AWGN に加えランダム ジッターによっても損なわれた信号を生成します。この例では、前の例と同じメッセージ データを使用して 2 つの信号を比較します。信号に与えるジッターの影響は、この時間領域の図では明らかでないことに注意してください。

close(hFigPdf);
hide(eyeObj);

% Attach the jitter object to the pattern generator
src.Jitter = jitterSrc;
% Generate only random jitter with standard deviation 0.3 ms.
src.Jitter.DiracJitter = 'off';
src.Jitter.RandomJitter = 'on';
src.Jitter.RandomStd = 0.3e-3;

% Generate NRZ signal with random jitter and add AWGN
reset(src);
release(channel);
message = generate(src, frameLen);
received = channel(message);

% Plot the jittered noisy NRZ signal with the noisy signal
t = 0:1/Fs:15/Rs-1/Fs;
idx = round(t*Fs+1);
figure(hFig);
hold on;
plot(t, received(idx), 'r');
title('Noisy and Jittered NRZ signal');
xlabel('Time (sec)');
ylabel('Amplitude');
grid on;

ジッターの影響は信号のアイ ダイアグラムでよくわかります。次の 2 つのアイ ダイアグラムの図は、ジッターの影響を示しています。ランダム ジッターを追加した結果、ジッターがある信号の幅は振幅ゼロのレベルで、ジッターがない信号よりも大幅に広くなっています。この例では実数信号を取り上げますが、ShowImaginaryEye プロパティを true に設定した場合、アイ ダイアグラム オブジェクトは複素信号も表示できることに注意してください。

close(hFig)

% Make a copy of the eye diagram object and reset
eyeObjJitter = clone(eyeObj);
release(eyeObjJitter);
reset(eyeObjJitter);

% Update the eye diagram object with the noisy, jittered signal
eyeObjJitter(received);

% Bring up the previous eye diagram for comparison
show(eyeObj);
show(eyeObjJitter);
eyeObj.Name       = 'Eye Diagram without Jitter';
eyeObjJitter.Name = 'Eye Diagram with Jitter';
eyeObjJitter.Position = [eyeObj.Position(1)+eyeObj.Position(3) eyeObj.Position(2) ...
                         eyeObj.Position(3) eyeObj.Position(4)];

水平ヒストグラムを利用して、ジッター特性をさらに詳しく調べることができます。水平ヒストグラムは DecisionBoundary プロパティで指定された振幅レベルで計算されます。図は、振幅単位 (AU) 0 の水平ヒストグラムを示しています。アイ ダイアグラムは 2 つのシンボル区間をトレースするため、5 ms と 15 ms の 2 か所で基準振幅レベルをクロスします。シンボル区間は 10 ms であることに注意してください。また、信号劣化はランダム ジッターに起因するため、2 か所のクロッシングではガウス特性が示されます。

% Enable vertical histogram overlay, and therefore measurements
eyeObjJitter.EnableMeasurements = true;
eyeObjJitter.Position = eyeObjJitter.Position + [0 0 0 eyeObjJitter.Position(4)*0.75];
eyeObjJitter.OverlayHistogram = 'Jitter';

% Need to step the input again for histograms to be collected:
eyeObjJitter(received);

% Also export the plotted horizontal histogram with the jitterHistogram
% method
horHist = jitterHistogram(eyeObjJitter);
hide(eyeObj);

垂直ヒストグラムを利用して、チャネルのノイズ特性を調べることができます。垂直ヒストグラムは、2 つのクロッシング時間の平均に対応する、最適なサンプリング時間 (アイ パターン遅延の測定値) で収集されます。

eyeObjJitter.OverlayHistogram = 'Noise';

% Also export the plotted vertical histogram, with the noiseHistogram
% method
verHist = noiseHistogram(eyeObjJitter);

以下のコードは、ランダム ジッター、ISI、および AWGN があるシミュレーションを実行します。ISI は信号をレイズド コサイン フィルターに渡すことにより発生します。ノイズによるレベル クロッシングを抑制できるような値に Hysteresis プロパティを設定します。ほとんどの測定値設定を変更すると、アイ ダイアグラム オブジェクトがリセットされる場合があることに注意してください。MeasurementDelay をフィルター遅延よりも大きな値に設定して、信号の過渡部分を除去します。シミュレーションは for ループで実行されるため、アイ ダイアグラム オブジェクトはストリーミング方式で測定値を計算します。

eyeObjJitter.OverlayHistogram = 'None';
reset(eyeObjJitter);
release(eyeObjJitter);

% Set the jitter parameters
src.Jitter.RandomStd = 0.1e-3;

% Set jitter hysteresis value, measurement delay, and color scale
eyeObjJitter.Hysteresis = 0.1;
eyeObjJitter.MeasurementDelay = 6/Rs;
eyeObjJitter.ColorScale = 'Linear';

% Set up the square root raised cosine filter.
b = rcosdesign(0.5, 6, sps);
b = b / sum(b);
transmitFilter = dsp.FIRFilter('Numerator', b);

% Run simulation
frameLen = 1000;
numFrames = 20;
lastSymbol = 0;
lastJitter = 0;

release(channel);
% Generate jittered signal
message = generate(src, frameLen*numFrames);
% Add ISI and noise
messageISI = transmitFilter(message);
received = channel(messageISI);

for k = 1:800
  % Update the eye diagram object with the signal
    eyeObjJitter( received( 1+(k-1)*10*2*sps : k*10*2*sps ) );
end

% Also export the displayed measurements with the measurements method:
meas = measurements(eyeObjJitter) %#ok<NOPTS>

% For a detailed explanation of the measurements, please refer to the
% documentation (type "doc comm.EyeDiagram" on the command line). Note that
% since the simulation was run using less than 20000 symbols, the results
% are not very accurate.
meas = 

  struct with fields:

              EyeLevels: [2x1 double]
           EyeAmplitude: 1.8519
              EyeHeight: 1.5124
        VerticalOpening: 1.0447
                 EyeSNR: 10.5280
          QualityFactor: 16.0473
         CrossingLevels: [2x1 double]
          CrossingTimes: [2x1 double]
               EyeDelay: 0.0104
               EyeWidth: 0.0077
      HorizontalOpening: 0.0048
               RiseTime: 0.0066
               FallTime: 0.0066
    DeterministicJitter: 6.5994e-04
           RandomJitter: 0.0045
            TotalJitter: 0.0052
              RMSJitter: 3.8680e-04
       PeakToPeakJitter: 0.0049

測定値の比較

comm.EyeDiagram の測定値のエクスポート機能を使用して、異なる構成で取得した測定値を比較できます。次の例では、シンボル レート 10 Gsps で NRZ システムでのランダム ジッターの影響を調べます。確定的ジッターは 2 ns に設定されています。ランダム ジッターの標準偏差を 300 ps から 500 ps に 100 ps 刻みで大きくしています。NRZ 信号が AWGN チャネルを介して 40 dB の SNR で渡されています。立ち上がり時間と立ち下がり時間が非ゼロのため、AWGN がランダム ジッターを増加させることに注意してください。

Fs = 10e9;
Rs = 100e6;
sps = Fs/Rs;
Trise = 2e-9;
Tfall = 2e-9;

% Create a pattern generator object
srcObj = commsrc.pattern( ...
    'SamplingFrequency', Fs, ...
    'SamplesPerSymbol', sps, ...
    'DataPattern', 'PRBS31', ...
    'RiseTime', Trise, ...
    'FallTime', Tfall);
srcObj.Jitter.RandomJitter = 'on';
srcObj.Jitter.DiracJitter = 'on';
srcObj.Jitter.DiracDelta = [-1e-9 1e-9];

% Create an eye diagram object
eyeObj = comm.EyeDiagram(...
    'SampleRate', Fs, ...
    'SamplesPerSymbol', sps, ...
    'YLimits', [-1.75 1.75], ...
    'EnableMeasurements', true, ...
    'MeasurementDelay', 6e-9);

% Set the range of standard deviation for the random jitter
stdVec = (300:50:500)*1e-12;

% Set simulation parameters
frameLen = 1000;
numFrames = 100;
cnt = 1;

% Main loop
for randStd = stdVec
    % Set the random jitter standard deviation and reset the eye diagram
    % object
    srcObj.Jitter.RandomStd = randStd;
    hide(eyeObj);
    reset(eyeObj);
    release(eyeObj);

    % Update the eye diagram object with the jittered and noisy source
    x = generate(srcObj, frameLen*numFrames);
    r = awgn(x, 40);
    eyeObj(r);

    meas(cnt) = measurements(eyeObj);

    % Adjust the eye center to the middle of the time axis
    timeOffsetSamps = 2*eyeObj.SamplesPerSymbol - Fs*meas(cnt).EyeDelay;
    eyeObj.SampleOffset = round(timeOffsetSamps);

    cnt = cnt+1;
end

hide(eyeObj);
hide(eyeObjJitter);

次の図は、水平開口、ランダム ジッター、および確定的ジッターの測定結果を示します。ランダム ジッターは 1e ~ 12 のビット誤り率について測定されるため (BER しきい値プロパティを参照)、ランダム ジッターの予想値はジッター サンプルの標準偏差の約 14 倍です。たとえば、標準偏差が 300 ps の場合、BER = 1e-12 のときのランダム ジッターは 4.2 ns です。

hFig = figure;
plot(300:50:500, [meas.HorizontalOpening], 'b-*');
hold on;
plot(300:50:500, [meas.RandomJitter], 'r-*');
hold on;
plot(300:50:500, [meas.DeterministicJitter], 'g-*');
legend('Horizontal opening', 'Random jitter', 'Deterministic jitter', 'Location', 'northwest');
title('Measurement comparison for noisy NRZ signal');
xlabel('Standard deviation of random jitter (ps)');
ylabel('Time (s)');
grid on;

水平開口部と垂直開口部は、使用可能なバスタブ曲線表示を使用して、異なる BER しきい値で比較できます。

eyeObj.ShowBathtub = 'Horizontal';
eyeObj.BathtubBER  = [0.5 10.^-(1:3:13)];
show(eyeObj);

参照

  1. Ou N. et al., "Jitter Models for the Design and Test of Gbps-Speed Serial Interconnects," IEEE® Design & Test of Computers, Vol. 21, July-August 2004, pp. 302-313.

  2. Stephens R., "Jitter Analysis: The dual-Dirac Model, RJ/DJ, and Q-Scale," Agilent Technologies® Whitepaper, 2004. Available from www.Agilent.com.