Correct for Symbol Timing and Doppler Offsets

Recover from symbol timing and frequency offset errors by using the comm.CarrierSynchronizer and comm.SymbolSynchronizer objects.

Configure Example

Specify the samples per symbol parameter. Create a matched pair of raised cosine filter objects.

sps = 8;
txfilter = comm.RaisedCosineTransmitFilter('FilterSpanInSymbols',10, ...
    'OutputSamplesPerSymbol',sps,'Gain',sqrt(sps));
rxfilter = comm.RaisedCosineReceiveFilter('FilterSpanInSymbols',10, ...
    'InputSamplesPerSymbol',sps,'DecimationFactor',sps/2,'Gain',sqrt(1/sps));

Create a PhaseFrequencyOffset object to introduce a 100 Hz Doppler shift.

doppler = comm.PhaseFrequencyOffset('FrequencyOffset',100, ...
    'PhaseOffset',45,'SampleRate',1e6);

Create a variable delay object to introduce timing offsets.

varDelay = dsp.VariableFractionalDelay;

Create carrier and symbol synchronizer objects to correct for a Doppler shift and a timing offset, respectively.

carrierSync = comm.CarrierSynchronizer('SamplesPerSymbol',2);
symbolSync = comm.SymbolSynchronizer(...
    'TimingErrorDetector','Early-Late (non-data-aided)', ...
    'SamplesPerSymbol',2);

Create constellation diagram objects to view the results.

refConst = qammod(0:15,16,'UnitAveragePower',true);

cdReceive = comm.ConstellationDiagram('ReferenceConstellation',refConst, ...
    'SamplesPerSymbol',sps,'Title','Received Signal');

cdDoppler = comm.ConstellationDiagram('ReferenceConstellation',refConst, ...
    'SamplesPerSymbol',2,'Title','Frequency Corrected Signal');

cdTiming = comm.ConstellationDiagram('ReferenceConstellation',refConst, ...
    'SamplesPerSymbol',2,'Title','Frequency and Timing Synchronized Signal');

Main Processing Loop

Perform the following operations:

  • Generate random symbols and apply QAM modulation.

  • Filter the modulated signal.

  • Apply frequency and timing offsets.

  • Pass the transmitted signal through an AWGN channel.

  • Correct for the Doppler shift.

  • Filter the received signal.

  • Correct for the timing offset.

for k = 1:15
    data = randi([0 15],2000,1);
    modSig = qammod(data,16,'UnitAveragePower',true);
    txSig = txfilter(modSig);

    txDoppler = doppler(txSig);
    txDelay = varDelay(txDoppler,k/15);

    rxSig = awgn(txDelay,25);

    rxFiltSig = rxfilter(rxSig);
    rxCorr = carrierSync(rxFiltSig);
    rxData = symbolSync(rxCorr);
end

Visualization

Plot the constellation diagrams of the received signal, the frequency corrected signal, and the frequency and timing synchronized signal. While specific constellation points cannot be identified in the received signal and only partially identified in the frequency corrected signal, the timing and frequency synchronized signal aligns with the expected QAM constellation points.

cdReceive(rxSig)

cdDoppler(rxCorr)

cdTiming(rxData)

See Also

|