Main Content

Choose Extrapolation Method Based on Application

This example shows how to choose the right extrapolation method based on your design. It also shows how to use extrapolation method to predict the values eye metrics at symbol error rates beyond those captured in an eye diagram. You can see the strengths and weaknesses of each extrapolation or interpolation method.

Find Eye Width of PAM2 Signal

Load a PAM2 waveform with low noise, a fast slew rate relative to its unit interval, and jitter consisting of a significant duty cycle distortion (DCD) and a normally distributed random jitter (RJ) component. Load two eye diagrams derived from the waveform: one made from 2000 symbols and the other made from 20 million symbols.

load("extrapolate_pam2.mat", "ed2k", "ed20M");
plot(ed2k);

Figure contains an axes object. The axes object with xlabel Seconds, ylabel Amplitude contains an object of type image.

The original data contained approximately 2000 samples, which means the smallest measured symbol error rate (SER) should be around 1 / 1000. But some applications require eye metrics at much smaller SER values, such as 1e-7, which is what this example uses.

ser = 1e-7;

You can use any of the available two extrapolation methods and five interpolation methods to predict the size of the eye opening for a longer dataset, based on the measurement of the current dataset. Compare each against a long simulation, using bathtub curves.

Available Extrapolation Methods

  • dualdirac - This method performs a curve fit of the Dual-Dirac jitter model's PDF to a slice of the eye diagram, then uses the coefficients of that fitted model to solve the corresponding quantile for the specified symbol error rate to find the position of the eye contour.

  • gaussian - This method uses the sample mean and sample standard deviation of a slice of the eye diagram to define a Gaussian curve. It then solves the Gaussian quantile for the specified symbol error rate to find the position of the eye contour.

bathtub(ed2k, "horizontal", 0, "Extrapolation", "dualdirac", "SER", ser);
hold on
bathtub(ed2k, "horizontal", 0, "Extrapolation", "gaussian", "SER", ser);
bathtub(ed20M, "horizontal", 0, "Extrapolation", "linear", "SER", ser, "Marker", ".", "LineStyle", "none");
hold off
title("Extrapolation Methods");
legend("dualdirac", "gaussian", "measured", "Location", "southeast");

Figure contains an axes object. The axes object with title Extrapolation Methods, xlabel seconds, ylabel Symbol Error Rate contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent dualdirac, gaussian, measured.

Available Interpolation Methods

  • none - Previous neighbor interpolation of the cumulative sum of an eye slice, outward from the center of the eye.

  • linear - Linear interpolation of the cumulative sum of an eye slice.

  • spline - Natural spline interpolation of the cumulative sum of an eye slice.

  • pchip - PCHIP interpolation of the cumulative sum of an eye slice.

  • makima - Modified Akima interpolation of the cumulative sum of an eye slice.

bathtub(ed2k, "horizontal", 0, "Extrapolation", "none", "SER", ser);
hold on
bathtub(ed2k, "horizontal", 0, "Extrapolation", "linear", "SER", ser);
bathtub(ed2k, "horizontal", 0, "Extrapolation", "spline", "SER", ser);
bathtub(ed2k, "horizontal", 0, "Extrapolation", "pchip", "SER", ser);
bathtub(ed2k, "horizontal", 0, "Extrapolation", "makima", "SER", ser);
bathtub(ed20M, "horizontal", 0, "Extrapolation", "linear", "SER", ser, "Marker", ".", "LineStyle", "none");
hold off
title("Interpolation Methods");
legend("none", "linear", "spline", "pchip", "makima", "measured", "Location", "southeast");

Figure contains an axes object. The axes object with title Interpolation Methods, xlabel seconds, ylabel Symbol Error Rate contains 6 objects of type line. One or more of the lines displays its values using only markers These objects represent none, linear, spline, pchip, makima, measured.

The extrapolation methods provide a pessimistic estimate, while the interpolation methods provide an optimistic one. In this case, the application suits the Dual-Dirac model: we are finding a timing-based metric, eye width, the signal is PAM2, and the jitter is composed of a binary deterministic component and a normally-distributed random component.

eyeWidth(ed2k, 0, "Extrapolation", "dualdirac", "SER", ser, "Plot", "on")

Figure contains an axes object. The axes object with xlabel Seconds, ylabel Amplitude contains 3 objects of type image, line. These objects represent Eye Contour 1, Eye Width at 0 = 8.6149e-11 Seconds.

ans = 
8.6149e-11

Find Eye Height Trend of PAM4 Signal

Load a set of PAM4 waveforms with intersymbol interference and thermal effects being the primary contributors to noise. The data represents a set of simulations of the same circuit, taken at different ambient temperature values. Each simulation ran for 1000 symbols. Load the cell array of eye diagrams and the corresponding vector of temperature values.

load("extrapolate_pam4.mat", "eyes", "temps");

Create a table to organize the temperatures and eye diagrams:

tbl = table(temps', eyes', 'VariableNames', ["Temperature", "EyeDiagram"])
tbl=11×2 table
    Temperature        EyeDiagram    
    ___________    __________________

          0        {1×1 eyeDiagramSI}
         10        {1×1 eyeDiagramSI}
         20        {1×1 eyeDiagramSI}
         30        {1×1 eyeDiagramSI}
         40        {1×1 eyeDiagramSI}
         50        {1×1 eyeDiagramSI}
         60        {1×1 eyeDiagramSI}
         70        {1×1 eyeDiagramSI}
         80        {1×1 eyeDiagramSI}
         90        {1×1 eyeDiagramSI}
        100        {1×1 eyeDiagramSI}

Plot the eye diagrams, labeled with the corresponding temperature.

f = figure;
f.Position = [100, 100, 2148, 2148];
for i = 1:size(tbl, 1)
    nexttile;
    plot(tbl.EyeDiagram{i});
    title(tbl.Temperature(i) + " degrees Celsius");
end

Figure contains 11 axes objects. Axes object 1 with title 0 degrees Celsius, xlabel Seconds, ylabel Amplitude contains an object of type image. Axes object 2 with title 10 degrees Celsius, xlabel Seconds, ylabel Amplitude contains an object of type image. Axes object 3 with title 20 degrees Celsius, xlabel Seconds, ylabel Amplitude contains an object of type image. Axes object 4 with title 30 degrees Celsius, xlabel Seconds, ylabel Amplitude contains an object of type image. Axes object 5 with title 40 degrees Celsius, xlabel Seconds, ylabel Amplitude contains an object of type image. Axes object 6 with title 50 degrees Celsius, xlabel Seconds, ylabel Amplitude contains an object of type image. Axes object 7 with title 60 degrees Celsius, xlabel Seconds, ylabel Amplitude contains an object of type image. Axes object 8 with title 70 degrees Celsius, xlabel Seconds, ylabel Amplitude contains an object of type image. Axes object 9 with title 80 degrees Celsius, xlabel Seconds, ylabel Amplitude contains an object of type image. Axes object 10 with title 90 degrees Celsius, xlabel Seconds, ylabel Amplitude contains an object of type image. Axes object 11 with title 100 degrees Celsius, xlabel Seconds, ylabel Amplitude contains an object of type image.

As you can see, there is little variation between individual eyes in this view. But you can use interpolation or extrapolation to characterize trends smaller than a bin in the measured data.

Of the available interpolation methods, none is not useful here, since it does not show the sub-bin differences that you want to see.

For extrapolation, the signal in question is PAM4 and the metric in question is height-related, and so it is not compatible with the assumptions of the Dual-Dirac jitter model.

First, find the trend in measured eye heights at a SER of 0.01 using linear interpolation. Then, find the trend in extrapolated eye heights at a SER of 1e-5 using gaussian extrapolation.

interpolatedHeight = zeros(size(tbl, 1), 3);
extrapolatedHeight = zeros(size(tbl, 1), 3);
for i = 1:size(tbl, 1)
    interpolatedHeight(i,:) = eyeHeight(tbl.EyeDiagram{i}, "Extrapolation", "linear", "SER", 0.01);
    extrapolatedHeight(i,:) = eyeHeight(tbl.EyeDiagram{i}, "Extrapolation", "gaussian", "SER", 1e-5);
end

Add the new vectors to the data table.

tbl.("Interpolated") = interpolatedHeight;
tbl.("Extrapolated") = extrapolatedHeight
tbl=11×4 table
    Temperature        EyeDiagram                  Interpolated                        Extrapolated          
    ___________    __________________    ________________________________    ________________________________

          0        {1×1 eyeDiagramSI}    0.066393    0.066782    0.066858    0.030514    0.030808    0.030339
         10        {1×1 eyeDiagramSI}    0.066137    0.066601    0.066631    0.030421    0.030592    0.030141
         20        {1×1 eyeDiagramSI}    0.066085    0.066421    0.066313    0.030277      0.0305    0.030049
         30        {1×1 eyeDiagramSI}    0.065957    0.066159    0.066102    0.030144     0.03032    0.029886
         40        {1×1 eyeDiagramSI}    0.065713    0.065993    0.065925    0.030012    0.030107    0.029639
         50        {1×1 eyeDiagramSI}    0.065631    0.065657    0.065645    0.029826    0.029938    0.029439
         60        {1×1 eyeDiagramSI}    0.065504    0.065694    0.065553    0.029697    0.029812    0.029258
         70        {1×1 eyeDiagramSI}    0.065295    0.065597    0.065489    0.029506    0.029546    0.029025
         80        {1×1 eyeDiagramSI}    0.065162    0.065666    0.065328    0.029326    0.029405    0.028871
         90        {1×1 eyeDiagramSI}    0.065108    0.065529    0.065206    0.029192    0.029269    0.028693
        100        {1×1 eyeDiagramSI}    0.064867    0.065364    0.064986    0.028947    0.029061     0.02851

And plot the trends in eye height over temperature.

figure;
yyaxis("left");
plot(tbl.Temperature, tbl.Interpolated);
ylabel("Interpolated Eye Height, Volts");
xlabel("Temperature, degrees Celsius");
yyaxis("right");
plot(tbl.Temperature, tbl.Extrapolated);
ylabel("Extrapolated Eye Height, Volts");
legend("Lower Eye", "Middle Eye", "Upper Eye", "Lower Eye", "Middle Eye", "Upper Eye");

Figure contains an axes object. The axes object with xlabel Temperature, degrees Celsius, ylabel Extrapolated Eye Height, Volts contains 6 objects of type line. These objects represent Lower Eye, Middle Eye, Upper Eye.