I am trying to implement a simple MATLAB model for the demodulators for phase modulated signals (PSK) used in communication systems.
enter image description here

For the detection of the phase modulated output (PM out in the above figure) the bandwidth of the demodulator should be sufficiently lower than the symbol rate (modulation bandwidth) so as to ensure that the PLL is not able to track the modulation. But clearly, low frequency phase noise will be tracked which is the benefit of this demodulator.
Since the demodulator is working as a high pass filter, I assume this can be implemented with just a high pass filter in MATLAB.
I generate the input data as follows:

data = randi([0 7], 1e6,1);
modData = step(pskModulator, data);

enter image description here

I assume that my symbol rate is 1GS/s and since we want the loop bandwidth to be much lower, I keep it at 100kHz. I generate a high-pass filter as follows:

[b,a] = butter(1,100e3/1e9,'high');
H = tf(b, a, 1/1e9);

enter image description here

Clearly close to 1GHz the filter reaches its pass-band.
My issue is that if I pass my input data through this filter, it still gets filtered out. I check it as follows:

angle_out = arrayfun(@(x) angle(x), modData);
angle_out_loop = filter(b,a,angle_out);
out = exp(1i*angle_out_loop);

enter image description here

What am I doing wrong here? How can I make a filter which filters the low frequency noise but not the signal?
Although I have assumed 1GS/s as my symbol rate but how does MATLAB know that the random input data is indeed coming at 1GHz so that the data doesn't get filtered?
I have read similar qustions:Loop Bandwidth for symbol timing recovery but they were less implementation specific. Thanks! enter image description here

  • $\begingroup$ Rotation of the constellation indicates a frequency offset which is not getting corrected. $\endgroup$
    – jithin
    Apr 2, 2020 at 11:41
  • $\begingroup$ @jithin I am only working with phasors so I think frequency offset could not be the problem... $\endgroup$
    – sarthak
    Apr 2, 2020 at 11:45
  • $\begingroup$ I checked that if I reduce the loop Bandwidth further the plot looks more like due the phase noise. I have edited the question to show that. $\endgroup$
    – sarthak
    Apr 2, 2020 at 11:47

1 Answer 1


Your results are not showing that the data is being "filtered out" necessarily but that you are using a non-linear phase filter resulting in group delay variation over your passband, as evidenced by the spread in phase.

Don't use a Butterworth filter to model this. Instead use filters derived from either firls or firpm (remez in Octave) which are linear phase and have constant group delay.

  • $\begingroup$ Thanks a lot for your answer...According to my understanding, the transfer function for the entire loop is a high pass filter for the PM output. So in my model I just assume a high pass filter of bandwidth 100kHz to model the entire loop. Is this reasoning incorrect? $\endgroup$
    – sarthak
    Apr 2, 2020 at 12:19
  • $\begingroup$ Oh I see what you are asking! I thought you were just using the inverse of your loop filter as the high pass filter. Let me edit my question. $\endgroup$ Apr 2, 2020 at 12:26
  • $\begingroup$ Ahh Ok...But in reality does the PLL works as a linear phase filter? Is it possible because RC circuits always have some phase distortion. $\endgroup$
    – sarthak
    Apr 2, 2020 at 12:37
  • 1
    $\begingroup$ That depends on your PLL design and something you need to be careful about as you see here. The analog loop filter I would implement would typically be done with an Op-amp as a PI loop filter, so just has a single pole at the origin (and the loop would have two poles at the origin due to the VCO, so 2nd order type 2 loop). Any other poles introduced would be strictly to limit high frequency noise but not dominant within the loop bandwidth. $\endgroup$ Apr 2, 2020 at 12:57
  • $\begingroup$ Thank you very much!... One last question I promise... For the butterworth filter I used here, I kept the bandwidth of 100kHz so frequencies higher than 100kHz will be allowed to pass. I want to set the sampling frequency at 1GHz (sample rate) so that it is in passband. I use filter function to apply high pass filter to the input modulated data. But how does the filter function know that the input sampling rate is 1GHz because I give no sampling rate information to the function. In other words, what is the frequency of the input data according to the filter function? $\endgroup$
    – sarthak
    Apr 2, 2020 at 13:17

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.