Here is a simple MATLAB experiment:

alpha = 1;
R = 10;
[b,a] = butter(7,alpha*1/R);
x = resample(sign(randn(100,1)),R,1,0); % zero-order-hold
y = filter(b,a,x);
eyediagram(y, 2*R);

With channel twice the bandwidth than the pulses (alpha=2) the eye diagram looks clean. The first thing I am concerned that the eye diagram at the critical bandwidth (alpha=1, i.e. channel bandwidth is bitrate/2) still looks reasonably clean (little bit ISI but not too much):

Eye Diagram NRZ

I would have expected significant ISI at the critical bandwidth.

Now instead of using rectangular pulses, I use a raised cosine filter:

 hcos = rcosdesign(0, 30, R);
 x = upfirdn(sign(randn(1000,1)), hcos, R);

Now the eye diagram is significantly worse:

Eye Diagram raised cosine

I would expect the result to be significantly better. I played with all possible rolloff factors 0...1 and number of symbols. I also tried cutting the signal at beginning/end, thinking it may be the initial transient. No changes.

What is going on here?

(Additional info: I do not want to simulate TX/RX with raised cosine but assess a channel without having to use an equalizer - in simulation. One way to do this is using an equalizer or just using a pulse shape that works close to the theoretical bandwidth - that should be raised cosine with a low beta).

  • $\begingroup$ You can create a raised-cosine pulse (instead of root raised-cosine) by running rcosdesign(beta,30,R,normal). Can you also try setting the rolloff factor beta to 0.25, 0.5, and 0.75? Setting beta=0 means you're actually using a sinc pulse, which is notoriously difficult to get right since it requires a very long duration to maintain orthogonality, and this introduces numerical approximation errors. $\endgroup$
    – MBaz
    Jul 21, 2017 at 14:44

1 Answer 1


That's because Matlab's rcosdesign creates a root-raised-cos filter, not a raised cos filter. If you want no ISI (ie meet Nyquist's criterion), you need to do the match filtering of the reception part :

alpha = 1;
R = 10;
hcos = rcosdesign(0.25, 30, R);
x = upfirdn(sign(randn(1000,1)), hcos, R);
y = upfirdn(x, hcos, 1, R);
eyediagram(x, 2*R);
hold on
eyediagram(y, 2*R);

eyediagram RRC

eye of x

eyediagram RC

eye of y

  • $\begingroup$ Very excited about your answer, thanks! However, it still does not work: When I change the shape to normal, the eye diagram looks the same as for rectangular pulses (but it should look way better/no ISI). Similarly if I add the filter in your code between the upfirdn lines. I want to assess a channel without using equalization/ISI and hence - for simulation - use the raised cosine shape. Would you be able to change your answer to include the filter (operating at sample rate, NOT the symbol rate) $\endgroup$
    – divB
    Jul 21, 2017 at 16:57

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.