From my reading, I see that there are two ways people usually do carrier synchronization:

  1. Decision directed, where the transmitted symbols are unknown are the receiver, decisions are made, and then an error is computed. This assumes the receiver knows the type of signal was sent (in order to make the symbol decisions).

  2. Data aided, where there is some known symbol sequence that is used for adjusting the phase and drive the error to zero.

Are there any carrier synchronization techniques which are non-data-aided and blind in the sense that all they require are IQ samples? I'm thinking of a scenario where I could give the technique a QPSK signal or a 16-QAM signal and the frequency offset would be fixed for both signals.

The best idea I have so far is to use a combination of signal identification and one of the two methods above (IQ samples $\rightarrow$ Signal ID alg. $\rightarrow$ Choose correct traditional technique). Maybe this is a good way to go about it, but if there is some more formal method, I am unsure.

Edit #1

Things that I know or have existing ways to estimate:

  • Symbol rate
  • Pulse shape
  • Bandwidth
  • Equally likely symbols
  • Modulation could be PSK or QAM
  • Assuming a single carrier system

Edit #2

The fourth power method is something that I known of but not in the way that is being described by Dan and Marcus. Apparently can be used for general constellations:

% make some random constellation by choosing 10 points within a 10-by-10 grid
constSize = 10;
iComponent = 10*(rand(constSize , 1)-0.5);
qComponent = 10*(rand(constSize , 1)-0.5);
const = iComponent + 1j*qComponent;
symbols = const(randi([1, length(const)], 1000, 1)); 

pulseFilter = rcosdesign(rolloff, span, sps, 'sqrt');
basebandSig = upfirdn(symbols, pulseFilter, sps);
basebandSig = exp(1j*2*pi*f0*[0:length(basebandSig)-1]'/sampleRate) .* basebandSig; % adding frequency offset f0 Hertz
basebandSig4 = basebandSig.^4;

% Fourth power estimate
fax = -sampleRate/2:sampleRate/nfft:sampleRate/2-1/nfft;
fftBasebandSig4 = fftshift(fft(basebandSig4));
[~, maxInd] = max(abs(fftBasebandSig4));
f0Hat = fax(maxInd)/4;

The problem is I don't fully understand what is happening. I understand for BPSK or QPSK how raising to the fourth power, all the points go to a single phase and then you can see the frequency offset but for the random constellation I generated, this doesn't happen.

To try and understand what is happening I plotted what happens to the signal when raising to the fourth power: enter image description here enter image description here

I see more points around (0, 0), but this also happens if I raise to the fifth power, as well as a peak at 5x the true frequency offset. What is special about the fourth power and do raising to other powers ever offer any benefit? (For a classic M-PSK constellation, you'd raise to the $M^{th}$ power)

Edit #3

In case of future readers, between the accepted answer and the paper, Blind estimation of frequency offset in the presence of unknown multipath, I was able to gain a better grasp of the "raising the oversampled signal to a power" method.

  • $\begingroup$ You might want to explicitly list the things you do know about the transmission: Do you know the bandwidth? The Pulse shape? Whether it's a linear modulation? are the symbols white(ned)? Do you happen to know the symbol rate? Are you sure it's a single-carrier system? $\endgroup$ Mar 7, 2020 at 12:18
  • $\begingroup$ Did the last paragraph that I added to my answer help? $\endgroup$ Mar 9, 2020 at 14:23

3 Answers 3


One approach not yet mentioned is frequency multiplication by a factor of the number of phase positions used followed by a PLL for noise reduction and then a frequency divider by then same factor. The reason for this is when you multiply the frequency by N, you also multiply the phase by N. If the phase positions are selections of $2\pi/N$ (or those with any fixed offset), then multiplying the phases by N results in a consistent phase angle versus time, which then results in a fixed frequency tone that a PLL can lock to.

For example with BPSK (2 phase positions) a simple squaring will produce a specular component at 2x the carrier frequency since changing between 0° and 180° will result in changing between 0° and 0° (at twice the frequency) after doubling. With QPSK (4 phase positions) you need to raise the signal to the 4th power (which will quadruple the frequency, and the phase). The reason for the PLL is that any AM components (through pulse shaping or QAM modulation) will result in other lower level frequency components that the PLL will essentially filter out.

To answer your question as to what is so special about raising to the Nth power is that you basically raise to a sufficient enough power such that the modulo phase variation of the result is equivalent to small angle PM (which has a dominant carrier) in contrast to BPSK for example which has complete carrier suppression with equiprobable data.

  • $\begingroup$ How does this work when I could have either a BPSK or QPSK? The idea is to try squaring and raising to the fourth power then look at which produced a higher peak? $\endgroup$
    – Engineer
    Mar 7, 2020 at 19:25
  • 1
    $\begingroup$ If it is either BPSK or QPSK then yes raise to the fourth power. This is because 0, 90, 180 or 270 time 4 all equal to 0 degrees. So if you had 0/180, or 0/90/180/270 they would both create a strong component at 4x your carrier if you raised the signal to the fourth power. $\endgroup$ Mar 7, 2020 at 19:28
  • 1
    $\begingroup$ Squaring QPSK converts the phase states 0,90,180,270 to be 0 and 180-- squaring that again then converts the 0 and 180 to all be 0°. So if you want a solution for either then you would raise all to the fourth power and center your PLL at 4x the carrier. Then with the clean PLL output at 4x the carrier you would use a frequency divider (divide by 4) to recover the carrier. $\endgroup$ Mar 7, 2020 at 19:30
  • 1
    $\begingroup$ Also note that if you're averaging enough, e.g. 16 QAM can be recovered, albeit slower and with more noise, by the same fourth power method used for QPSK – the "error" of the non-diagonal constellation points averages out, if the loop filter is slow enough for statistics to be sufficiently reliable uniform. $\endgroup$ Mar 8, 2020 at 0:42
  • 1
    $\begingroup$ No it could still work; consistent with Marcus's comment above: if the resulting phase modulation after the multiplication is small enough that the additional tones created are > 6 dB down then the PLL should be able to lock onto the strongest (averaged) carrier. For small angles this is $20Log_{10}(\phi)$. So evaluate the distribution of all the phases after you multiply them all by 4 and modulo them with $2\pi$. If I was doing this, I would simulate a random distribution of the constellation, raise the pulse shaped time domain waveform to the 4th power and take the FFT to see if the result. $\endgroup$ Mar 8, 2020 at 16:16

If you know the pulse shape and bandwidth, a band-edge detector would be a classical first step; see fred harris' talk on that (+slides).

After doing that, you'd have a good carrier frequency and even phase estimate.

You'd do that before estimating whether it's PSK or QAM, because the latter becomes much easier after.

You could then use a PLL to track and fine-tune at lower computational effort, typically (that depends).

  • $\begingroup$ That was a good video to watch. The band-edge detector is like a balancing act where we try to make sure the output power of the upper edge filter is the same as the output power of the lower edge filter, is this the right idea? $\endgroup$
    – Engineer
    Mar 8, 2020 at 19:31

If your frequency offset is small you can do timing synchronization and then carrier recovery which is only based on the rotation of the IQ samples.

I found PLL confusing until I understood them in a statistical sense with the filter being an averaging mechanism.

Timing synchronization can be done with variance minimization or power maximization, etc.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.