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 "dirty" 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

  • $\begingroup$ If you recorded the signal, you could replay one working and one not working. Then compare the outputs of each block from the first to last. And find where it differs. Maybe the RF signal becomes too low close to the horizon $\endgroup$
    – user51024
    Feb 19, 2021 at 22:32
  • $\begingroup$ @gotchi85 Yes, I recorded the original IQ signal. What do you mean by replay one working and one not working? $\endgroup$ Feb 20, 2021 at 0:14
  • $\begingroup$ While it is true that the signal becomes low clone to the horizon, there are other non-open source demodulator that achieve much better results than mine - hence my interest $\endgroup$ Feb 20, 2021 at 0:16
  • $\begingroup$ Try to debug your design replaying at input a record sequence where you lock and a sequence where not. You could see where are differencies at each block output to find a hint $\endgroup$
    – user51024
    Feb 20, 2021 at 6:52
  • $\begingroup$ is there a reason that you set 100m inside the AGC? If the AGC time response is too fast, it can lock on the symbols (and this is not good) $\endgroup$
    – user51024
    Feb 20, 2021 at 21:47

2 Answers 2


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 <=> 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.

  • $\begingroup$ Thank you very much! I will try to respond to your three points. First point: the RRC is located inside the symbol sync block (see rrc_taps at the bottom). Second point: I adjusted the filter wrt the shape of the spectrum (I saw it was around 90KHz wide). Nevertheless, it seems reasonable to get information about the real bandwidth of the signal and adjust it properly. Third point: you are right. I placed there an AGC without any previous calculations. I will try to optimise it $\endgroup$ Feb 21, 2021 at 10:46
  • $\begingroup$ Wrt to your last sentence, I would love to perform some measures in "lab conditions". However, since the satellite is already up in the space, the only thing that comes to my mind is using a high-elevation pass signal as a source and introducing a channel in GNURadio. This could allow me, for example, to calculate extra parameter such as the BER. The problem here is that I do not know how to model that channel to reflect a low elevation pass $\endgroup$ Feb 21, 2021 at 10:49
  • $\begingroup$ @user3141592 if not in a lab, at least with a test qpsk modulator model inside the GNU radio. Check if your demodulator gives a nice constellation diagram in ideal conditions. This is the basic thing to check. Have you tried? $\endgroup$
    – user51024
    Feb 21, 2021 at 12:46
  • $\begingroup$ @user3141592 I checked your last update. The RRC filter (matched filter) should be before the symbol sync module. The best is to try to add a modulator chain inside GNU radio, it is a matter of 4 or 5 blocks. You'll see clearly if you are fine on an ideal case. $\endgroup$
    – user51024
    Feb 21, 2021 at 21:26
  • $\begingroup$ Thank you, I have been working on a test modulator this afternoon and I seem to be able to improve my receiver with it. BTW, I placed the RRC filter after the sync block because of the following answer by @DanBoschen dsp.stackexchange.com/a/31518/34118 $\endgroup$ Feb 21, 2021 at 23:27

I would put the matched filter (RRC) before or as part of the clock recovery block.


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.