Carrier frequency offset estimation for QPSK and asymmetrical spectrum I am working on estimation of carrier frequency offset for QPSK data from a satellite. From my understanding, there are two main approaches: either remove data from the carrier (by taking the fourth power), or with band-edge filtering, or some other method of measuring difference of energy content in positive and negative parts of the spectrum.

In my particular case I have the signal converted to base-band (and with some offset). I'm now trying to estimate that offset. I can correctly estimate offset by taking the fourth power of the signal, and then running an FFT on that signal. However, I'm struggling with band-edge filtering, and it seems that the issue is not my implementation of the filter, but rather, the signal itself. While the algorithm works like charm on synthetic QPSK data, when I run it on some real satellite data, it is not able to compensate for frequency offset. I tried to find the cause of this behavior, and I was able to find that the signal spectrum is asymmetrical, and negative frequency content is having more energy than positive, as shown in the figure below (figure shows FFT of signal with frequency offset removed). What I do not understand why there is such a difference in the energy in the positive and negative parts of the spectrum, and I would appreciate if somebody could provide me some insight into this.
A likely source of the amplitude imbalance given it is on the actual signal is filtering distortion along the signal chain such that the gain is not flat across the bandwidth of the spectrum. This would not be uncommon with analog filtering and can be compensated for with equalization (if needed).

For an alternate approach to carrier tracking applicable to QPSK, consider estimating the carrier frequency offset using the baseband samples after timing recovery (timing recovery with a Gardner TED converges even under relatively large carrier offset frequencies). With that, the correct sample locations for each symbol (just prior to decision) are used with a cross product frequency discriminator to estimate carrier offset as follows:

$$Err = |I_2| |Q_1|-|I_1| |Q_2|$$ 

Where the absolute values convert all samples to the first quadrant (so this will work for offset frequencies such that the phase doesn't rotate more than $pi/4$ radians between samples, or up to 1/8th the symbol rate. 

$Err$ is proportional to frequency offset as the result above is the imaginary portion of the complex conjugate product of the two samples, which is proportional to the phase between the samples. A change in phase versus a change in time (the symbol duration) is proportional to frequency, since $f=d\phi/dt$.

Thus the cross product frequency discriminator is the cross product phase detector for the phase between two samples at two different times.