I have a complex filter that is modelling the channel response, its not symmetrical on 0. The complex filter is convolved with a complex baseband modulation of QPSK.

Plot 1 Zoom in on impulse response enter image description here

Plot 2: The convolved signal and filter produces the below constellation. Orange dots are the original signals before being impacted by the channel filter and the blue dots are the received symbols after going through the channel response. enter image description here

--EDIT-- Updated the constellation plot by rotating the signal to get better result -> with less Intersymbol Inteference but cant make it better than this ...

enter image description here

--EDIT-- This is the eye diagram from the resulting rotation...

enter image description here

Note: Fs is the same for the filter and signal, so the time instances between samples match.

How can I make this better to get less ISI? Maybe with a rotation I am at the limit of the best constellation that can be produced with this filter?

  • $\begingroup$ Can you also clarify when you did the IFFT of the measured data how you got this measured data and if you included both the measured magnitude and phase response? (Not your question but I am also thinking about how your channel introduced the phase rotation we also see). $\endgroup$ Nov 25, 2021 at 14:18
  • $\begingroup$ @DanBoschen I have been thinking about that too. The channel response is from the S-parameters, I have S21 in complex form across frequency. I took the inverse transform of this to generate the impulse response. it was ifftshift, then ifft and then fftshifted to get the impulse that was convolved with the signal. The signal clock rate, Fs, was created by looking at the frequency resolution of the measured data and the length of the filter. Fs = Ns*resolution. Then I made a modulated signal that used sps=3 and taps of 400. I suspect these final settings lead to ISI but not the rotation... $\endgroup$ Nov 25, 2021 at 21:44
  • $\begingroup$ The Ns of the signal did not equal the Ns of the fitler, because I didnt think that was necessity. $\endgroup$ Nov 25, 2021 at 21:45
  • $\begingroup$ That all sounds fine. What I do is increase N until it is clear that the impulse response has fully decayed. As I suggested in my answer, you may not have any ISI, just timing offset. But from your impulse response you can see the amount of ISI directly- is there any energy in the impulse response at the spacing of subsequent samples? $\endgroup$ Nov 25, 2021 at 22:29
  • $\begingroup$ @DanBoschen Hi Dan, I am not sure what you mean. I zoomed in on the impulse response to show it decays to zero - added a new plot to the original post. I am just trying the padding to zero at the moment. How do I see the ISI directly on the impulse response by looking at the energy at the spacing of subsequent samples? $\endgroup$ Nov 25, 2021 at 22:48

1 Answer 1


(Poster and I have iterated on this in a chat here: https://chat.stackexchange.com/rooms/131792/isi )

The OP mentions that the filter should not impact the signal since the signal is within the passband- this would only be true if this was a linear phase filter, otherwise we must also give consideration to the phase response and distortion that can cause.

Assuming the OP is not adding actual inter-symbol interference with the channel filter used, then what may be occurring here is the effect of a timing offset in the received samples (beyond the obvious phase rotation also present due to the real and imaginary terms in the filter), or the resulting eye diagram is of the Root-Raised Cosine Shaped waveform and not the completed Raised-Cosine shaped waveform that would be available after the 2nd RRC in the receiver. Assuming this is truly Raised Cosine shaped with the expected zero-ISI from pulse-shaping alone, the filter can easily have a fractional sample delay such that its output samples will no longer be at the correct sample locations as the input, so this would not be surprising, nor be an issue with the filter itself as it does not mean loss of information; it just means a compensation fractional delay needs to be included to correct for this, which can be done directly in the original filter as I will explain.

As a quick evaluation, I suggest resampling the signal to a much higher rate for purpose of creating an eye diagram which will immediately show if timing offset or inter-symbol interference is the issue (it will show it the symbol sampling locations chosen are at the ideal location for no timing error). If this is the problem, the solution would be to introduce a fractional delay which is a typical operation in a receiver (timing recovery), since the actual sample locations in a receiver are completely independent as to the samples chosen when the signal was created at the transmitter.

Below shows the effect I am suspecting with the associated eye diagram and constellation patterns showing samples with no time offset vs with a time offset:

timing offset

Quick Fix:

The quick fix to correct for a fractional delay offset using the approach the OP has started, is to zero pad the desired channel frequency response out to an integer multiple $N$ of samples prior to taking the Inverse FFT. This will interpolate $N-1$ more samples in between each of the original samples in the time domain impulse response desired. With this the original samples can be selected by using every $Nth$ sample from the resulting response, but alternatively a fractional offset can be introduced by selecting every $N+n$ samples, where $n$ is the fractional offset desired from $0$ to $N-1$.

As a side (and less important) note: Implementing the channel using an IFFT of its (complex) frequency response is not ideal- this is the frequency sampling method of filter design which results in an exact solution only at the frequency samples used but larger deviation everywhere else in comparison to other optimized methods (resulting in many more filter coefficients required to achieve a certain accuracy). Ultimately if the length in total time duration of the filter used exceeds the delay spread of the channel and there is no concern with the processing required, although suboptimal this should not be an issue and provides for a simple solution.

  • $\begingroup$ Hi Dan, Yes you were right there was incorrect symbol timing and a rotation of the constellation and compensation for filter losses made it better, but its still not great. Do you have code for a symbol recovery algorithm that you can share? Mine is rather basic and not much use for this. I will also tidy up this question shortly. $\endgroup$ Nov 28, 2021 at 18:02
  • $\begingroup$ @Villere_DSP it's a lot more detailed than I can simply share here but the good news is that it is part of an online course (DSP for Software Radios) I will be teaching in January through dsprelated.com. Email me if you want to be on the mailing list when more details of that course are announced (boschen at loglin dot com). Can you update your post here with your before and after? Just so the Q&A here is useful to others? $\endgroup$ Nov 28, 2021 at 18:05
  • $\begingroup$ I gave it above in my comment: boschen at loglin dot com $\endgroup$ Nov 28, 2021 at 19:06
  • $\begingroup$ Thank you @Villere_DSP - I’d be interested in chatting with you again (when I have time, busy today/tomorrow) to help you resolve the remaining ISI but also to ensure my answer matches your question as to the original issue so that it is helpful for future readers. Would you be interested in doing that? $\endgroup$ Dec 3, 2021 at 18:21

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.