Этот пример показывает, как использовать коммуникацию. Система EyeDiagram object™, чтобы выполнить измерения индикаторной диаграммы на моделируемых сигналах.
Коммуникация. Системный объект 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) в этот сигнал через Системный объект
. Затем, сигнал области времени построен. Другой способ исследовать характеристики сигнала состоит в том, чтобы сгенерировать индикаторную диаграмму сигнала с помощью Системного объекта индикаторной диаграммы. Обратите внимание на то, что свойство SymbolsPerTrace, которое представляет количество символов в трассировке индикаторной диаграммы, должно собираться в два выполнить измерения. Данные справа показывают индикаторную диаграмму того же сигнала. Заданное значение SampleOffset установлено, чтобы гарантировать, что глаз сосредоточен в фигуре. Для большего количества детали об использовании объекта индикаторной диаграммы обратитесь к документации (коммуникация. EyeDiagram) и Схема Глаза и Совокупности в качестве примера.comm.AWGNChannel
% 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 может быть смоделирован как train функций Дирака. Случайное дрожание моделируется как Гауссово изменение фронтов синхроимпульса сигнала.
Дрожание, с которым сталкиваются в системе связи, может быть любой комбинацией этих компонентов. Обычно используемая комбинация является моделью двойного Дирака, где 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);
Оу Н. и др., "Модели дрожания для Проекта и Теста Скорости Гбит/с Последовательные Межсоединения", IEEE® Design & Test Компьютеров, Издания 21, июль-август 2004, стр 302-313.
Стивенс Р., "Анализ Дрожания: Модель двойного Дирака, RJ/DJ и Q-шкала", Отчет Agilent Technologies®, 2004. Доступный под эгидой www.Agilent.com.