An FFT-based course frequency acquisition block is being tested in GNU Radio. The algorithm used can be found on the GOES satellite user manual and is summarized in the figure below. 
[![goes-acquisition][1]][1]
The algorithm works by:

 1. Carrier detection by Absolute-law, Square-law or fourth-power law. Square law detector involves squaring the IQ signal while fourth-power law uses the fourth-power of the IQ signal. 
 2. Finding the FFT
 3. Averaging successive FFT sequences
 4. Finding the peak by looking at 8 adjacent bins with the highest magnitude. 

I have been able to implement the algorithm in GNU Radio, at least for BPSK. The algorithm is able to recover the carrier at all offset scenarios (offset < 10% symbol rate, offset ~ symbol rate, offset > symbol rate). 
[![fft-acquisition-gnuradio][2]][2]
[![fft-acquisition-bpsk][3]][3]

According to the GOES manual, the same algorithm should work for OQPSK, and I assume by extension, QPSK. However, the carrier derived by the algorithm for the case of QPSK is pretty bad, especially in low-SNR scenarios.  

I have two questions

 1. Are there any literature sources as to how the frequency detectors (square, fourth-power) work? I have basically implemented the algorithms but I do not fully understand their mathematical derivations.

 2.  Is there a more effective frequency detector for QPSK apart from square/fourth-power/absolute laws that could remedy the situation?

Regards,
Moses. 

  [1]: https://i.sstatic.net/gCMiq.png
  [2]: https://i.sstatic.net/RQ1dy.png
  [3]: https://i.sstatic.net/CIhFE.png