I'm new to GNU Radio and signal processing. I don't know if the following is a simple question, but I have been scratching my head about it.

I created a simple flow graph with a random source (0-3) and created a signal out of that using QPSK. I also added a noise source and added both together. The noise amplitude is controllable. In the end, I want to extract the original source using a Low Pass Filter.

enter image description here

The cutoff frequency is also controllable. I want that the Low pass filter filters out everything except the "main slope" of the input signal (see 2nd plot, image below). In a constellation sink (3rd plot), the signal before and after the Low Pass filter is shown. For a transition width of 1000, this works as expected:

enter image description here

Notice that there are four red areas (filtered signal, blue is unfiltered) in the constellation sink. They match up with my random input source (0-3) and QPSK. However, if I set the transition width to 1100, this changes and it looks like that the filtered signal is now worse:

enter image description here

I figured out that this can be handled with "Skip Heads". In the flow graph above, I already added one ahead of the constellation sink. I heard that the filters introduce a delay of half the filter length. So I thought that skip head has to be set to (transition width/2). This worked for a transition width of 1100: Only four distinct red areas were shown. However, the (transition width/2) approach doesn't work with a transition width of 2000, for example. What am I doing wrong?

The second thing I was wondering about is the shift of the signals in time domain. I plotted the unfiltered signal and the filtered signal and noticed that they are shifted (as expected, because of the filter delay). I tried to experiment with the parameters and a skip head of 35 aligned the signals perfectly but (transition width/2) didn't work. I don't know how to calculate this value for arbitrary transition widths and additionally, 35 didn't work for the Skip Head of the constellation sink (not 4 red areas were shown, but 9, see picture above). So I must be doing something wrong.

I hope that my question is understandable. Thanks for answering!

Edit: I figured out that the correct phase shift can be archived with the length of the filter taps / 2 (instead of transition width / 2). However, this doesn’t fix the issue with the constellation sink.

  • $\begingroup$ I don't know anything about GNU Radio, but 15k cutoff plus >1k transition width seems like a bad idea with just 32k sampling rate, as there will be relevant quantities of energy left above the Nyquist frequency. $\endgroup$
    – Max
    Commented Jan 3, 2022 at 14:58
  • $\begingroup$ What would you suggest to do? Increase the sample rate? $\endgroup$
    – leonboe1
    Commented Jan 3, 2022 at 15:00
  • $\begingroup$ Yes, this would be one way. Another is using steeper filters. $\endgroup$
    – Max
    Commented Jan 3, 2022 at 17:02
  • $\begingroup$ Ultimately when you have independent transmitter and receivers you will need to deal with timing and carrier recovery which will resolve this. You may want to consider nipping that in the bud now and then be well equipped to make a real receiver. $\endgroup$ Commented Jan 4, 2022 at 0:08
  • $\begingroup$ @DanBoschen I‘d love to! But in this example, I have no clue how to shift the signals correctly. Do you have an idea? $\endgroup$
    – leonboe1
    Commented Jan 4, 2022 at 9:33

1 Answer 1


To align the samples (and realigning with different filter implementations) consider implementing actual timing and carrier recovery loops, or using those discriminators and approaches to manually correcting the offsets as would be done in those acquisition and tracking loops. This will put you on the road toward an actual implementation when the transmitter and receiver are on independent clocks and delay offsets due to variable distances, with additional possible frequency offsets due to Doppler if the transmitter and receiver are moving relative to one another.

These functions are also already implemented in GNU Radio and detailed under Synchronizers in the GNU Radio documentation. For further details on how these work and how they many be implemented manually for educational purposes please see these other posts I have written here on StackExchange with further details on carrier recovery and timing recovery for BPSK, QPSK and QAM modulations:

How to correct the phase offset for QPSK I-Q data

Symbol timing recovery in Python

FFT-based coarse carrier recovery for QPSK

Fractional spaced equalizer + timing (clock) recovery

Loop bandwidth for symbol timing recovery

Gardner Timing Recovery for Repeated Symbols

Design a timing recovery algorithm with predefined samples with max amplitude

Symbol timing synchronization using a high sampling rate

phase difference detection

Recovering signal for psk

Phase synchronization in BPSK

Carrier frequency offset estimation for QPSK and asymmetrical spectrum

Clock recovery using Mueller and Muller adds noise affecting EVM or SNR (Two cases - GNU Radio & Python code)

High modulation index PSK - carrier recovery

Location of Matched Filter

PLL for Phase Demodulation and Carrier Tracking

Software PLL tracking of carrier frequency in bandlimited transmission

QPSK constellation from baseband signal


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.