I'm working with cascaded second-order allpass filters. Each filter is characterized by conjugate pole/zero pairs. In a long (>50) cascade of identical filters, the pole locations of the overall transfer function begin to diverge from their initial, theoretical location. They seem to fan out in a ring around where the true pole should be. This occasionally leads to instability, as the poles can end up outside the unit circle.

I'm assuming this is some kind of round-off or accuracy error, but haven't had any luck locating resources on this problem. Can anyone point me in the right direction?


Here is a code snippet demonstrating the problem. Uses Numpy/Scipy and the zplane function found here:


b = [0.72986695907729304, -1.0592380171923862e-16, 1]
a = [1, -1.0592380171923862e-16, 0.72986695907729304]

bN = array(1);
aN = array(1);

Nf = 10

for nf in range(Nf):
  bN = array(convolve(b, bN), dtype=float32);
  aN = array(convolve(a, aN), dtype=float32);

z_casc, p_casc, g_casc = zplane(bN, aN)
  • $\begingroup$ Would help if you actually gave an example. $\endgroup$
    – Phonon
    Oct 8 '14 at 0:29
  • $\begingroup$ How did you compute the pole locations of the overall transfer function? Did you implement the filter and your resulting filter is unstable, or did you just compute the (poles of the) total transfer function? $\endgroup$
    – Matt L.
    Oct 8 '14 at 9:43
  • $\begingroup$ boy, i get suspicious when i see something like $10^{-16}$ next to a $10^{0}$. me thinks that either that should be set to zero or there is some numerical funny-business going on. $\endgroup$ Oct 9 '14 at 5:14

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.