I implemented a polyphase filter function for interpolating and decimating. It works great (I compared it to what I'd get by interp/decim by inserting L-1 zeros and I get the same results) except for when I compensate delay.

I mean, what I'm doing basically is pulse-shaping with a b=rcosdesign(0.35,4,3,'sqrt'); matlab built-in function (13 taps, so delay is 6). Then I proceed as follows:


Upsample by M=3 then x=filter(b.*M,1,upsampled_data). After that, I filter again r=filter(b,1,x) and then I downsample downsample(r(mean(grpdelay(b))*2+1:end),M). As you can see, I'm removing the delay generetad by both filters.


I have my custom function so in two lines I run: x_p = polyfilter( data, b.*M, M, 'interpolation' ); rd_p= polyfilter( x_p(mean(grpdelay(b))*2+1:end), b, M, 'decimation' );

But when I plot the results, only the non-polyphase process 100% matches the original data, while the polyphase one doesn't. You can see such plot here: different plots

When I'm not taking the delay into account, both non-polyphase and polyphase filters output the exact same thing. I kind of understand that I'm not removing the delay at the exact same part of the process in both cases, because I'm removing it right before removing L-1 zeros but after filtering in the non-polyphase case, and in polyphase case I'm removing the delay right before filtering, and I think the correct one is the non-polyphase one but I'm not too sure when I should remove the delay in the polyphase case.


  • $\begingroup$ Your original signal looks like "noise". What kind of signal is it supposed to be? Regarding delays and FIR filters, polyphase is just an efficient implementation, it will not change the output compared to a regular FIR filter followed by a decimation. Suppose an N-tap symmetrical filter, the group delay will be (N-1)/2 If you decimate by D, the group delay will be (N-1)/(2*D). However, that's true if you choose the first sample out of D, if instead you select the 2nd sample out of D, the group delay will be smaller (don't recall the exact formula, might be N/(2*D) ) $\endgroup$ – Ben Aug 21 '19 at 15:49
  • $\begingroup$ My original signal are BPSK symbols (random 1 and -1) which are used by the pulse shaper. I've run this test in abscense of noise so that's why I'm getting 100 % match for the non-polyphase filter (except for the amplitude which has changed due to filtering but that's no problem since i can just do sign() and that would do). As for what you say about the group delay being (N-1)/(2*D), does that mean I can remove that after downsampling? I'll check that out, thanks! $\endgroup$ – researcher9 Aug 21 '19 at 17:02
  • $\begingroup$ It would make more sense to remove the delay after downsampling. But the problem is that the delay might be a non-integer delay after downsampling $\endgroup$ – Ben Aug 21 '19 at 18:38

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.