QPSK demodulator on GNURadio continuously loses phase lock I am designing a QPSK demodulator to be used for receiving Meteor M2 (LEO satellite) signals (QPSK at 72Kbaud). However, I am finding a lot of problems in my way.
First of all, this is the flowchart I came with:

First, I filtered the signal, applied it a $\frac{3}{16}$ fractional downsampling and fed it to a Polyphase Clock Sync block (8sps input, 2sps output and 2pi/100 bandwidth, 0.5 TED Gain and 0.7 Damping factor and 0.15 Deviation). Then, since I thought that for lower passes multipath would be a thing, I added a CMA equalizer after the symbol sync block. Lastly, I placed a Costas Loop just before the soft decoder.
When the elevation of the satellite is above ~50°, I obtain a pretty clear constellation with no decoding errors. Nevertheless, the interesting challenge of designing such demodulator is for it to work at lower elevations. It is very important that it does not lose lock at any moment of the pass, since even the shortest lock loss will produce a black line on the final image.
I am having a lot of trouble with the signal lock at low elevations. I assume that this is caused by a &quot;dirty&quot; signal at the input of the Polyphase Clock Sync block.
• Does my flowchart look good? This is the first digital receiver I design in GNURadio and have very little experience in this field.
• Is there any way (other than trial and error) to optimise Symbol Sync block parameters?
• What technique (filtering, equalization, etc.) may I use in order to solve the locking problems?
Thank you in advance!
Edit: the input signal to the low pass filter has already no doppler shift.
Edit 2: can a PLL Carrier Tracking block help in this situation? The signal seems to be frequency stable, but I do not know whether such block can help avoiding phase locks at the symbol sync stage. Can placing the Costas Loop before symbol sync help?
Edit 3: after some refinement, this is the look of the receiver

Thank you very much @gotchi85 por the help
From what I understand, the modulation is a QPSK at 72k symbol.
So the main lobe is 144 kHz wide.
First point: Shaping filter clarification
Do you know if there is a shaping filter used by the transmitter?
Usually it is an RRC filter with a roll off of a given value.
If there is one in the transmiter, your RRC filter in the receiver should match roll off value
Second point: The low pass filter
The main lobe is 144kHz wide (because of QPSK-72ksps). The low pass filter you use is 90 kHz (2 x 45 kHz, for negative + postive spectrum side) wide.
With a 0.5 alpha roll off used at the transmitter, its bandwith would be 72 x (1+0.5) = 108 kHz &lt;=&gt; 54 x 2. With a 45 kHz, you cut before a possible RRC inside the chain (45 vs 54). Expand the low pass filter bandwith so that it does not interfere with the RRC filter in the receiver of Symbol block.
Try 60 instead of 45 Khz
Third point: AGC

AGC placement:
Is the AGC placement intended?
What happens if the signal is too low at the input of the first filter?
Do you have an external AGC before entering GNU radio?

AGC rate:
I have a small experience with GNU radio, so don't know what is behind the rate or other AGC blocks...
The important thing is that the AGC does not track on the varation of the symbols but on the average signal level.
Try maybe to decrease that rate so the reponse is slower.


There are probably other points to tune, these are main I see. You could earn several fractions of dB in those first places.
If there is an improve, you should see it on the constellation directly (if not too noisy)
The best approach is to first make the design and verify it performances in lab conditions and not directly on the satellite.