I am running a BPSK flowgraph in GNU Radio which is based on RRC pulse shape. I noticed that the BER is quite poor when the number of taps is low. However, using the number of taps around $20\times Samples\_Per\_Symbol$ result in performance close to theory. I found the above number through trial and error and I was wondering if there was any general formula for determining the number of taps for RRC pulse shaping.




1 Answer 1


See pages 5 and 6 and the plots on the following pages specific to number of samples per symbol in this very helpful reference by Ken Gentile on designing RRC pulse shape filters:


An example I have previously done shows the consideration of filter length (how many symbols does the filter span) and number of samples per symbol. The top plot shows a 100 tap RRC filter with only 2 samples per symbol and the lower plot it is the same number of taps but 10 samples per symbol.

RRC 2 samp per symbol

RRC 10 samp per symbol

Observe the following key points that illustrate some of the important considerations involved: With 2 samples per symbol the filter impulse response extends further in time. This results in a greater stop band attenuation for the same filter roll-off factor (Alpha) and complexity (number of taps). The difference is particularly dominant close to the band edge in the area of 700 Hz in the plots. In the figures shown we see that we get approximately 70 dB of attenuation for 2 samples per symbol but only approximately 35 dB of attenuation for 10 samples per symbol. However the overall frequency of the digital spectrum is most constrained for 2 samples per symbol; this is resolved with subsequent up-sampling or consideration elsewhere in our overall system design. As long as those considerations are properly addressed, according to Nyquist sampling theorem we will achieve the full integrity of our RRC filter design (with only 2 samples per symbol!). In the second case, because of the higher number of samples per symbol, with the same number of filter taps (complexity) the impulse response of the filter does not extend as far in time, and is therefore truncated earlier. This degrades overall performance as visible here with the inferior filter rejection. However the greater overall digital frequency spectrum is wider. An efficient design would choose to do two samples per symbol for such a "shaping" filter and then upsample to the bandwidth needed to be compatible with the analog design or other bandwidth considerations, since the upsampling filter design would be relatively simpler. Also to be considered for many applications is a polyphase RRC upsampling filter structure. In this case we would choose an even number of taps and incorporate the upsampling as described further in this response: How to implement Polyphase filter?

Keep in mind, as explained further in this post: Why root raised cosine filter can eliminate intersymbol interference (ISI) ? the entire motivation to do RRC filtering is spectral efficiency: hence regulatory requirements (spectral mask) will often dictate the rejection ultimately needed in the RRC filter (as long as subsequent analog stages, in particular the power amplifier, maintain sufficient linearity to not undo the shaping we so carefully applied...resulting in "spectral regrowth!).

  • $\begingroup$ Not nitpicking, but, by any chance, did you mean "frequency" here: "With 2 samples per symbol the filter impulse response extends further in time."? $\endgroup$ Commented Aug 8, 2018 at 6:24
  • $\begingroup$ @aconcernedcitizen No, I did indeed mean time. The impulse response is in the time domain (the Fourier Transform of the impulse response is the frequency response of the filter). The coefficients of the FIR filter implementing the RRC is the impulse response of the filter, so by having a longer filter, it will extend further in time. $\endgroup$ Commented Aug 8, 2018 at 9:24
  • $\begingroup$ Yes, but for some reason I thought you were referring to the picture, in the frequency domain. I might need new glasses, preferably ones that do not encourage skimming over the text. :-) $\endgroup$ Commented Aug 8, 2018 at 19:41
  • $\begingroup$ For the first case (2 sps), the Matlab snippet gives 161 taps. Shouldn't it be rcosine(1,2,'sqrt',0.25,20)? $\endgroup$
    – David
    Commented Feb 26, 2020 at 21:03
  • 1
    $\begingroup$ @David I updated it to be consistent number of taps for each and migrated to a Python implementation. $\endgroup$ Commented Feb 27, 2020 at 14:45

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.