Измерения глазковой диаграммы

В этом примере показано, как использовать коммуникацию. Система EyeDiagram object™, чтобы выполнить измерения глазковой диаграммы на симулированных сигналах.

Используя коммуникацию Системный объект EyeDiagram

Коммуникация. Системный объект EyeDiagram собирает данные о глазковой диаграмме в форме вертикальных и горизонтальных гистограмм. Мы можем использовать эти гистограммы, чтобы извлечь количественные метрики в системе под тестом. Эти количественные метрики называются измерениями глазковой диаграммы. Следующие параметры симуляции (частота дискретизации, выборки на символ) выбраны, чтобы обеспечить высокое разрешение для анализа.

% 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) использование генератора шаблона, обеспеченного в коммуникационном исходном пакете. Затем мы добавляем аддитивный белый Гауссов шум (AWGN) в этот сигнал через comm.AWGNChannel Системный объект. Затем сигнал области времени построен. Другой способ исследовать характеристики сигнала состоит в том, чтобы сгенерировать глазковую диаграмму сигнала с помощью Системного объекта глазковой диаграммы. Обратите внимание на то, что свойство SymbolsPerTrace, которое представляет количество символов в трассировке глазковой диаграммы, должно собираться в два выполнить измерения. Рисунок справа показывает глазковую диаграмму для того же сигнала. Заданное значение SampleOffset установлено, чтобы гарантировать, что глаз сосредоточен в фигуре. Для большего количества детали об использовании объекта глазковой диаграммы обратитесь к документации (коммуникация. 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]. Двумя примерами детерминированного дрожания является периодическое дрожание и интерференция межсимвола (ISI).

Периодическое дрожание может быть смоделировано как сумма синусоид, в то время как ISI может быть смоделирован как обучение функций Дирака. Случайное дрожание моделируется как Гауссово изменение фронтов синхроимпульса сигнала.

Дрожание, с которым сталкиваются в системе связи, может быть любой комбинацией этих компонентов. Обычно используемая комбинация является моделью двойного Дирака, где ISI и случайное дрожание объединены [2]. ISI моделируется двумя равными амплитудами функции Дирака. Следующий рисунок показывает функции плотности вероятности случайного дрожания, периодического дрожания, периодического и случайного дрожания, и 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, но также и случайным дрожанием. Этот пример использует те же данные о сообщении в качестве в предыдущем случае и сравнивает два сигнала. Обратите внимание на то, что эффект дрожания на сигнале не ясен в этой фигуре области времени.

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;

Эффект дрожания лучше проиллюстрирован глазковой диаграммой для сигнала. Следующие две фигуры глазковой диаграммы иллюстрируют удар дрожания. Ширина дрожавшего сигнала на нулевом амплитудном уровне значительно больше, чем ширина не дрожавшего сигнала в результате добавленного случайного дрожания. Обратите внимание на то, что даже при том, что этот пример особое внимание на действительных сигналах, объект глазковой диаграммы может также отобразить комплексные сигналы, если свойство ShowImaginaryEye установлено в истину.

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. Рисунок показывает горизонтальную гистограмму в 0 Амплитудных модулях (AU). Поскольку глазковая диаграмма прослеживает две длительности символа, она пересекает ссылочный амплитудный уровень в двух местах, 5 мс и 15 мс. Обратите внимание на то, что длительность символа составляет 10 мс. Кроме того, оба пересечения имеют Гауссовы характеристики, поскольку сигналу повреждают со случайным дрожанием.

% 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);

Вертикальная гистограмма может быть использована, чтобы исследовать шумовые характеристики канала. Вертикальная гистограмма собрана в лучшее время выборки, т.е. в значении измерения Задержки Глаза, которое соответствует среднему значению двух пересекающихся раз.

eyeObjJitter.OverlayHistogram = 'Noise';

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

Следующий код запускает симуляцию со случайным дрожанием, ISI и AWGN. ISI введен путем передачи сигнала через повышенный фильтр косинуса. Свойство Hysteresis установлено в значение, таким образом, что железнодорожные переезды из-за шума подавлены. Обратите внимание на то, что изменение большинства настроек измерения может сбросить объект Eye Diagram. 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

Сравнение измерений

Мы можем использовать возможность экспорта измерения коммуникации. EyeDiagram, чтобы сравнить измерения, полученные под различными настройками. Следующий пример исследует эффект случайного дрожания в системе NRZ с 10 уровнями символа Gsps. Детерминированное дрожание установлено в 2 нс. Стандартное отклонение случайного дрожания увеличено с 300 пикосекунд до 500 пикосекунд на 100 шагах пикосекунды. Сигнал NRZ передается через канал AWGN с ОСШ на 40 дБ. Обратите внимание на то, что 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 Threshold), ожидаемое значение случайного дрожания является приблизительно 14 раз стандартным отклонением выборок дрожания. Например, для стандартного отклонения 300 пикосекунд, случайное дрожание в BER = 1e-12 составляет 4,2 нс.

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. Оу Н. и др., "Модели дрожания для Проекта и Теста Скорости Гбит/с Последовательные Межсоединения", IEEE® Design & Test Компьютеров, Издания 21, июль-август 2004, стр 302-313.

  2. Стивенс Р., "Анализ Дрожания: Модель двойного Дирака, RJ/DJ и Q-шкала", Отчет Agilent Technologies®, 2004. Доступный от www.Agilent.com.