Main Content

Adjust Carrier Synchronizer Damping Factor to Correct Frequency Offset

Correct for a frequency offset by using the carrier synchronizer object. Increase the damping factor of the synchronizer and determine if the offset was corrected.

Set the modulation order, sample rate, frequency offset, and signal-to-noise ratio parameters.

M = 8;
fs = 1e6;
foffset = 1000;
snrdb = 20;

Create a phase frequency offset object to introduce a frequency offset to a modulated signal. Create a constellation diagram object.

pfo = comm.PhaseFrequencyOffset(SampleRate=fs, ...
    FrequencyOffset=foffset);
constDiagram = comm.ConstellationDiagram( ...
    ReferenceConstellation=pskmod(0:M-1,M,pi/M));

Create a carrier synchronizer object to correct for the frequency offset.

carriersync = comm.CarrierSynchronizer(Modulation='8PSK', ...
    DampingFactor=0.05,NormalizedLoopBandwidth=0.01);

The main processing loop includes these steps:

  • Generate random data.

  • Apply 8-PSK modulation.

  • Introduce a frequency offset.

  • Pass the signal through an AWGN channel.

  • Correct for the frequency offset.

  • Display the constellation diagram.

for k = 1:200
    data = randi([0 M-1],1000,1);
    modSig = pskmod(data,M);
    txSig = pfo(modSig);
    rxSig = awgn(txSig,snrdb);
    syncOut = carriersync(rxSig);
    constDiagram(syncOut)
end

The constellation points cannot be clearly identified indicating that the carrier synchronizer is unable to compensate for the frequency offset.

Determine the normalized pull-in range, the maximum frequency lock delay, and the maximum phase lock delay by using the info function.

syncInfo = info(carriersync)
syncInfo = struct with fields:
    NormalizedPullInRange: 0.0044
    MaxFrequencyLockDelay: 78.9568
        MaxPhaseLockDelay: 130

Convert the normalized pull-in range from radians to cycles. Compare the normalized frequency offset to the pull-in range.

[foffset/fs syncInfo.NormalizedPullInRange/(2*pi)]
ans = 1×2
10-3 ×

    1.0000    0.7071

The offset is greater than the pull-in range. This is reason that the carrier synchronizer failed to correct the frequency offset.

Change the damping factor of the synchronizer to 0.707.

carriersync.DampingFactor = 0.707;

Repeat the main processing loop.

for k = 1:200
    data = randi([0 M-1],1000,1);
    modSig = pskmod(data,M);
    txSig = pfo(modSig);
    rxSig = awgn(txSig,snrdb);
    syncOut = carriersync(rxSig);
    constDiagram(syncOut)
end

There are now eight observable clusters, which shows that the frequency offset was corrected.

Determine the new pull-in range. The normalized offset is less than the pull-in range. This explains why the carrier synchronizer was able to correct the offset.

syncInfo = info(carriersync);
[foffset/fs syncInfo.NormalizedPullInRange/(2*pi)]
ans = 1×2

    0.0010    0.0100