serdes.DFECDR

Decision feedback equalizer (DFE) with clock and data recovery (CDR)

Description

The serdes.DFECDR System object™ adaptively processes a sample-by-sample input signal or analytically processes an impulse response vector input signal to remove distortions at post-cursor taps.

The decision feedback equalizer modifies baseband signals to minimize the intersymbol interference (ISI) at the clock sampling time. The DFE samples data at each clock tick and adjusts the amplitude of the waveform by a correction voltage. The correction voltage is determined by the previous N sampled unit interval (UI) values, where N is the number of DFE taps.

A clock and data recovery function provides the clock sampling location to the DFE. The clock recovery is a first order phase tracking CDR model. For more information, see Clock and Data Recovery in SerDes System.

To equalize the input signal:

  1. Create the serdes.DFECDR object and set its properties.

  2. Call the object with arguments, as if it were a function.

To learn more about how System objects work, see What Are System Objects? (MATLAB).

Creation

Description

dfecdr = serdes.DFECDR returns a DFECDR object that modifies an input waveform with the DFE and determines the clock sampling times. The system object estimates the data symbol according to the Bang-Bang CDR algorithm.

dfecdr = serdes.DFECDR(Name,Value) returns a DFECDR object with each specified property set to specified value. Unspecified properties have default values.

Example: dfecdr = serdes.DFECDR('Mode',1) returns a DFECDR object that applies specified DFE tap weights to input waveform.

Properties

expand all

Unless otherwise indicated, properties are nontunable, which means you cannot change their values after calling the object. Objects lock when you call them, and the release function unlocks them.

If a property is tunable, you can change its value at any time.

For more information on changing property values, see System Design in MATLAB Using System Objects (MATLAB).

DFE Properties

DFE operating mode, specified as 0, 1, or 2. Mode determines what DFE tap weight values are applied to the input waveform.

Mode ValueDFE ModeDFE Operation
0offserdes.DFECDR is bypassed and the input waveform remains unchanged.
1fixedserdes.DFECDR applies input DFE tap weights specified in TapWeights to the input waveform.
2adaptserdes.DFECDR adaptively determines the optimum DFE tap weights values and applies them to the input waveform.

Data Types: double

Initial DFE tap weights, specified as a row vector in volts. The length of the vector specifies the number of taps. Each vector element value specifies the strength of the tap at that element position. Setting a vector element value to zero only initializes the tap.

Data Types: double

Minimum value of the adapted taps, specified as a real scalar or real valued row vector in volts. Specify as a scalar to apply to all the DFE taps or as a vector that has the same length as the TapWeights.

Data Types: double

Maximum value of the adapted taps, specified as a nonnegative real scalar or real valued row vector in volts. Specify as a scalar to apply to all the DFE taps or as a vector that has the same length as the TapWeights.

Data Types: double

Controls DFE tap weight update rate, specified as a unitless nonnegative real scalar. Increasing the value of EqualizationGain leads to a faster convergence of DFE adaptation at the expense of more noise in DFE tap values.

Data Types: double

DFE adaptive step resolution, specified as a nonnegative real scalar in volts. EqualizationStep specifies the minimum DFE tap change from one time step to the next to mimic hardware impairment. Setting EqualizationStep to zero yields DFE tap values without any resolution limitation.

Data Types: double

CDR Properties

Early or late CDR count threshold to trigger a phase update, specified as a unitless real positive integer greater than 4. Increasing the value of Count provides a more stable output clock phase at the expense of convergence speed. Because the bit decisions are made at the clock phase output, a more stable clock phase has a better bit error rate (BER).

Early/late count threshold also controls the bandwidth of the CDR which is approximately calculated by using the equation:

Data Types: double

Clock phase resolution, specified as a real scalar in fraction of symbol time. ClockStep is the inverse of the number of phase adjustments in CDR.

Data Types: double

Clock phase offset, specified as a real scalar in the range [−0.5, 0.5] in fraction of symbol time. PhaseOffset is used to manually shift the clock probability distribution function (PDF) for better BER.

Data Types: double

Reference clock offset impairment, specified as a real scalar in the range [−300, 300] in parts per million (ppm). ReferenceOffset is the deviation between transmitter oscillator frequency and receiver oscillator frequency.

Data Types: double

Sampling latch metastability voltage, specified as a real scalar in volts (V). If the data sample voltage lies within the region (±Sensitivity), there is a 50% probability of bit error.

Data Types: double

Advanced Properties

Time of a single symbol duration, specified as a real scalar in seconds (s).

Data Types: double

Uniform time step of the waveform, specified as a real scalar in seconds (s).

Data Types: double

Modulation scheme, specified as 2 or 4.

Modulation ValueModulation Scheme
2Non-return to zero (NRZ)
4Four-level pulse amplitude modulation (PAM4)

Data Types: double

Input wave type form:

  • 'Sample' — A sample-by-sample input signal.

  • 'Impulse' — An impulse response input signal.

Data Types: char

Usage

Description

y = dfecdr(x)

Input Arguments

expand all

Input baseband signal. If the WaveType is set to 'Sample', then the input signal is a sample-by-sample signal specified as a scalar. If the WaveType is set to 'Impulse', the input signal is an impulse response vector signal.

Output Arguments

expand all

Estimated channel output. If the input signal is a sample-by-sample signal specified as a scalar, then the output is also scalar. If the input signal is an impulse response vector signal, the output is also a vector.

Object Functions

To use an object function, specify the System object as the first input argument. For example, to release system resources of a System object named obj, use this syntax:

release(obj)

expand all

stepRun System object algorithm
releaseRelease resources and allow changes to System object property values and input characteristics
resetReset internal states of System object

Examples

expand all

This example shows how to process impulse response of a channel using serdes.DFECDR system object™.

Use a symbol time of 100 ps. There are 16 samples per symbol. The channel has 14 dB loss.

SymbolTime = 100e-12;         
SamplesPerSymbol = 16;
dbloss = 14;                  
NumberOfDFETaps = 2;

Calculate the sample interval.

dt = SymbolTime/SamplesPerSymbol; 

Create the DFECDR object. The object adaptively applies optimum DFE tap weights to input impulse response.

DFE1 = serdes.DFECDR('SymbolTime',SymbolTime,'SampleInterval',dt,...
      'Mode',2,'WaveType','Impulse','TapWeights',zeros(NumberOfDFETaps,1));

Create the channel impulse response.

channel = serdes.ChannelLoss('Loss',dbloss,'dt',dt,...
      'TargetFrequency',1/SymbolTime/2);
impulseIn = channel.impulse;

Process the impulse response with DFE.

[impulseOut,TapWeights] = DFE1(impulseIn);

Convert the impulse response to a pulse, a waveform and an eye diagram for visualization.

ord = 6;
dataPattern = prbs(ord,2^ord-1)-0.5;

pulseIn = impulse2pulse(impulseIn,SamplesPerSymbol,dt);
waveIn = pulse2wave(pulseIn,dataPattern,SamplesPerSymbol);
eyeIn = reshape(waveIn,SamplesPerSymbol,[]);

pulseOut = impulse2pulse(impulseOut,SamplesPerSymbol,dt);
waveOut = pulse2wave(pulseOut,dataPattern,SamplesPerSymbol);
eyeOut = reshape(waveOut,SamplesPerSymbol,[]);

Create the time vectors.

t = dt*(0:length(pulseOut)-1)/SymbolTime;
teye = t(1:SamplesPerSymbol);
t2 = dt*(0:length(waveOut)-1)/SymbolTime;

Plot the resulting waveforms.

figure
plot(t,pulseIn,t,pulseOut)
legend('Input','Output')
title('Pulse Response Comparison')
xlabel('SymbolTimes'),ylabel('Voltage')
grid on
axis([41 55 -0.1 0.4])  

figure
plot(t2,waveIn,t2,waveOut)
legend('Input','Output')
title('Waveform Comparison')
xlabel('SymbolTimes'),ylabel('Voltage')
grid on 

figure
subplot(211),plot(teye,eyeIn,'b')
xlabel('SymbolTimes'),ylabel('Voltage')
grid on
title('Input Eye Diagram')
subplot(212),plot(teye,eyeOut,'b')
xlabel('SymbolTimes'),ylabel('Voltage')
grid on
title('Output Eye Diagram')

This example shows how to process impulse response of a channel one sample at a time using serdes.DFECDR system object™.

Use a symbol time of 100 ps, with 8 samples per symbol. The channel loss is 14 dB. Select 12-th order pseudorandom binary sequence (PRBS), and simulate the first 4000 symbols.

SymbolTime = 100e-12;           
SamplesPerSymbol = 8;
dbloss = 14;                    
NumberOfDFETaps = 2;
prbsOrder = 12;                 
M = 4000;                      

Calculate sample interval.

dt = SymbolTime/SamplesPerSymbol;

Create the DFECDR system object. Since we are processing the channel one sample at a time, the input waveform is 'sample' type. The object adaptively applies the optimum DFE tap weights to input waveform.

DFE2 = serdes.DFECDR('SymbolTime',SymbolTime,'SampleInterval',dt,...
      'Mode',2,'WaveType','Sample','TapWeights',zeros(NumberOfDFETaps,1),...
      'EqualizationStep',0,'EqualizationGain',1e-4);

Create the channel impulse response.

channel = serdes.ChannelLoss('Loss',dbloss,'dt',dt,...
      'TargetFrequency',1/SymbolTime/2);

Create the eye diagram.

eyediagram = comm.EyeDiagram('SampleRate',1/dt,'SamplesPerSymbol',SamplesPerSymbol,...
      'YLimits',[-0.5 0.5]);

Initialize the PRBS generator.

[dataBit,prbsSeed]=prbs(prbsOrder,1);

Generate the sample-by-sample eye diagram.

%Loop through one symbol at a time.
inwave = zeros(SamplesPerSymbol,1);
outwave = zeros(SamplesPerSymbol,1);
dfeTapWeightHistory = nan(M,NumberOfDFETaps);

for ii = 1:M
  %Get new symbol
      [dataBit,prbsSeed]=prbs(prbsOrder,1,prbsSeed);    
      inwave(1:SamplesPerSymbol) = dataBit-0.5;
      
   %Convolve input waveform with channel
      y = channel(inwave);
      
   %Process one sample at a time through the DFE
      for jj = 1:SamplesPerSymbol
          [outwave(jj),TapWeights] = DFE2(y(jj));
      end
      
    %Save DFE taps
      dfeTapWeightHistory(ii,:) = TapWeights;
      
    %Plot eye diagram
      eyediagram(outwave)
end

Plot the DFE adaptation history.

figure
plot(dfeTapWeightHistory)
grid on
legend('TapWeights(1)','TapWeights(2)')
xlabel('Symbols')
ylabel('Voltage')
title('DFE Taps')   

Extended Capabilities

Introduced in R2019a