Re: Question on pole-zero cancellation
- From: "Rune Allnor" <allnor@xxxxxxxxxxxx>
- Date: 7 Jun 2006 14:19:56 -0700
Oli Filth skrev:
Rune Allnor said the following on 07/06/2006 21:20:
Oli Filth skrev:
Take as a simple example the moving-sum filter:
H(z) = 1 - z^-L
--------
1 - z^-1
The numerator includes a zero at DC, the denominator gives a pole at DC,
and so these cancel, giving non-zero response at DC.
However, if we implement the filter recursively:
(I hope my ASCII art comes out ok...)
+------+
---+--->| z^-L |------+
| +------+ | -
| v
+----------------->0-----------------+----->
^ |
| +------+ |
+-----| z^-1 |<---+
+------+
This is equivalent to:
+------+
---+--->| z^-L |------+
| +------+ | -
| v
+----------------->0--->0-----------------+----->
^ |
| +------+ |
+-----| z^-1 |<---+
+------+
i.e. implementing the feedforward section before the feedback section,
and doing the two additions separately.
The feedforward section has already killed the DC component, so we can't
recover it.
So my question is, how does the recursive moving-sum filter manage to
work (and we know it does), if it appears to be exactly equivalent to
something that blocks DC?
Because the zero at DC is exactly cancelled by a pole.
Indeed, this is mathematically the case. But if we implement the
unit-circle zero first, then the output of that section contains a
perfect spectral null. If you put in a true DC signal, the output will
be zero. Once that's happened, no amount of subsequent gain can recover
the signal at that frequency, not even the infinite gain that a pole
provides.
There are two different, although formally equivalent, representations
and two different implementations. See below.
Note that the
second block scheme of yours is an expanded representation of the
total system, not the actual system.
I'm not sure what you mean. The two block diagrams are the *exact* same
system, and both explicitly implement:
y[n] = y[n-1] + x[n] - x[n-L]
No. Your pole-zero cirquit implements this difference equation.
The moving-sum filter can also be implemented as
y[n] = x[n] + x[n-1] + ... + x[n-L].
This one has no problems with DC. The one above has, along with
the possibly imperfect pole-zero cancellation.
You can multiply any number by 1,
no matter how the factor 1 is represented, provided the representation
is exact.
Any transfer function H(z) can be expanded in a similar way:
H(z) = 1*H(z) = (1-z)/(1-z)*H(z)
(* means multiplication) and we have the same "paradox" you
found above.
I don't disagree. But conceptually, how do we resolve the paradox?
By factoring out the poles and zeros that cancel before we implement
what remains. In stead of multiplying with (1-z)/(1-z), multiply by 1.
Imagine another example, a channel equaliser. If the (noiseless)
channel contains a spectral null (e^{j.theta} - z) for some theta, what
equaliser would we use to recover a component at theta? I don't think
that 1/(e^{j.omega} - z) would be very useful, even though
mathematically it cancels the channel response. So why does it work above?
These are two diffreent problems. With the equalizer, the system only
contains the zero. The pole has to be introduced from somewhere,
which turns out to be all but impossible in practice. With the
moving-sum
filter, the pole and zero are introduced by analytical manipulations.
Big difference.
Rune
.
- Follow-Ups:
- Re: Question on pole-zero cancellation
- From: Oli Filth
- Re: Question on pole-zero cancellation
- References:
- Question on pole-zero cancellation
- From: Oli Filth
- Re: Question on pole-zero cancellation
- From: Rune Allnor
- Re: Question on pole-zero cancellation
- From: Oli Filth
- Question on pole-zero cancellation
- Prev by Date: Re: Announce: Fast real-time-stretching and resampling algorithms (Procrustes/Sylea)
- Next by Date: Re: Question on pole-zero cancellation
- Previous by thread: Re: Question on pole-zero cancellation
- Next by thread: Re: Question on pole-zero cancellation
- Index(es):
Relevant Pages
|