comm.GardnerTimingSynchronizer System object

Package: comm

Recover symbol timing phase using Gardner's method

comm.GardnerTimingSynchronizer will be removed in a future release. Use comm.SymbolSynchronizer instead.


The GardnerTimingSynchronizer object recovers the symbol timing phase of the input signal using the Gardner method. This object implements a non-data-aided feedback method. Gardner timing synchronization is a non-data-aided feedback method that is independent of carrier phase recovery. The timing error detector that forms part of this object's algorithm requires at least two samples per symbol, one of which is the point at which the decision can be made.

To recover the symbol timing phase of the input signal:

  1. Define and set up your Gardner timing synchronizer object. See Construction.

  2. Call step to recover symbol timing phase according to the properties of comm.GardnerTimingSynchronizer. The behavior of step is specific to each object in the toolbox.


H = comm.GardnerTimingSynchronizer creates a timing phase synchronizer System object™, H. This object recovers the symbol timing phase of the input signal using the Gardner method.

H = comm.GardnerTimingSynchronizer(Name,Value) creates an Gardner timing synchronizer object, H, with each specified property set to the specified value. You can specify additional name-value pair arguments in any order as (Name1,Value1,...,NameN,ValueN).



Number of samples representing each symbol

Specify the number of samples that represent each symbol in the input signal as an integer-valued scalar value greater than 1. The default is 4.


Error update step size

Specify the step size for updating successive timing phase estimates as a positive real scalar value. The default is 0.05. Typically, this number is less than 1/SamplesPerSymbol, which corresponds to a slowly varying timing phase. This property is tunable.


Enable synchronization reset input

Set this property to true to enable resetting the timing phase recovery process based on an input argument value. The default is false. When you set this property to true, you must specify a reset input value to the step method. When you specify a nonzero value as the reset input, the object restarts the timing phase recovery process. When you set this property to false, the object does not restart.


Condition for timing phase recovery reset

Specify the conditions to reset the timing phase recovery process as one of Never | Every frame. The default is Never. When you set this property to Never, the phase recovery process never restarts. The object operates continuously, retaining information from one symbol to the next. When you set this property to Every frame, the timing phase recovery restarts at the start of each frame of data. In this case, the restart occurs each time the object calls the step method. This property applies when you set the ResetInputPort property to false.


cloneCreate Gardner timing phase synchronizer object with same with same property values
getNumInputsNumber of expected inputs to step method
getNumOutputsNumber of outputs from step method
isLockedLocked status for input attributes and nontunable properties
releaseAllow property value and input characteristics changes
resetReset states of Gardner timing phase synchronizer object
stepRecover symbol timing phase using Gardner's method


Recover timing phase using the Gardner method.

% Initialize data
    L = 16; M = 8; numSymb = 100; snrdB = 30;
    R = 25; rollOff = 0.75; filtDelay = 3; g = 0.07; delay = 6.6498;

% Create System objects
    hMod = comm.PSKModulator(M);
    hTxFilter = comm.RaisedCosineTransmitFilter(...
        'RolloffFactor', rollOff, ...
        'FilterSpanInSymbols', 2*filtDelay, ...
        'OutputSamplesPerSymbol', L);
    hDelay = dsp.VariableFractionalDelay('MaximumDelay', L);
    hChan = comm.AWGNChannel(...
        'NoiseMethod', 'Signal to noise ratio (SNR)', ...
        'SNR', snrdB, 'SignalPower', 1/L);
    hRxFilter = comm.RaisedCosineReceiveFilter(...
        'RolloffFactor', rollOff, ...
        'FilterSpanInSymbols', 2*filtDelay, ...
        'InputSamplesPerSymbol', L, ...
        'DecimationFactor', 1);
    hSync = comm.GardnerTimingSynchronizer('SamplesPerSymbol', L, ...
        'ErrorUpdateGain', g);

% Generate random data
    data = randi([0 M-1], numSymb, 1);

% Modulate and filter transmitter data
    modData = step(hMod, data);
    filterData = step(hTxFilter, modData);

% Introduce a random delay
    delayedData = step(hDelay, filterData, delay);

% Add noise
    chData = step(hChan, delayedData);

% Filter receiver data
    rxData = step(hRxFilter, chData);

% Estimate the delay from the received signal   
    [~, phase] = step(hSync, rxData);
    fprintf(1, 'Actual Timing Delay: %f\n', delay);
    fprintf(1, 'Estimated Timing Delay: %f\n', phase(end));


This object implements the algorithm, inputs, and outputs described on the Gardner Timing Recovery block reference page. The object properties correspond to the block parameters, except:

The Reset parameter corresponds to the ResetInputPort and ResetCondition properties.
Was this topic helpful?