Reply by Rick Lyons December 11, 20112011-12-11
On Tue, 06 Dec 2011 16:18:18 -0500, robert bristow-johnson
<rbj@audioimagination.com> wrote:

>On 12/6/11 3:40 PM, Vladimir Vassilevsky wrote: >> >> robert bristow-johnson wrote: >> >>> >>> so, if you were to generalize this further and create a comb filter as >>> >>> H(z) = G(z^M) >> >> This is what they call interpolated filters. > >i dunno, Vlad. who is they? > >> Combining LPF and HPF comb structures could make for very efficient >> filters with arbitrary response. > >well, arbitrary *repeating* response. > >> Rick Lyons wrote a few articles about it. > >well, if they are that IEEE tips & tricks (or something else), i >wouldn't mind a solid reference. >
Hi Robert, I didn't see your post until this morning. My first article about interpolated FIR filters was: "Interpolated Narrowband Lowpass FIR Filters", IEEE Signal Processing Magazine, DSP Tips and Tricks column, Vol. 20, No. 1, pp. 50-57, Jan. 2003. My second article with, some additional ideas about interpolated FIR filters, was: "Turbocharging Interpolated FIR Filters", IEEE Signal Processing Magazine, DSP Tips and Tricks column, Sept. 2007. In 2009 I wrote an article about interpolated IIR filters based on a idea developed by DSP guru fred harris. That article was: "Improved Narrowband Lowpass IIR Filters in Fixed-Point Systems", IEEE Signal Processing Magazine, DSP Tips and Tricks column, March, 2009. Robert if you're ineterested in those articles but can't find down-loadable PDF copies on the web, send me a private E-mail and I'll send you a PDF version of those articles. See Ya', [-Rick-]
Reply by Clay December 7, 20112011-12-07
On Dec 6, 6:58=A0pm, robert bristow-johnson <r...@audioimagination.com>
wrote:
> On 12/6/11 3:45 PM, dvsarwate wrote: > > > On Dec 6, 3:17 pm, robert bristow-johnson<r...@audioimagination.com> > > wrote: > > >> so, if you were to generalize this further and create a comb filter as > > >>
=A0H(z) =A0 =3D =A0 G(z^M)
> > >> where G(z) is *any* realizable digital filter, either FIR or IIR, what > >> would you call that thing? > > > Think of this as *delay-scaling* of G(z). > > actually, i like to think of it as *frequency-scaling*. =A0instead of > teeth at even or odd integer multiples of pi, it can be at integer > multiples of an arbitrary w0 << pi (not so much "<<", maybe a "<" and a > half). > > > =A0Effectively we are > > looking at the input as M *interleaved* subsequences each > > being operated on by G(z). =A0For example, if M =3D 3 and > > the input is x[0], x[1], x[2], x[3], x[4], x[5], x[6], .... then we > > think of these as 3 interleaved sequences, call them a, b, c > > where > > > a[0] =3D x[0], a[1] =3D x[3], a[2] =3D x[6], .... > > b[0] =3D x[1], b[1] =3D x[4], b[2] =3D x[7], .... > > c[0] =3D x[2], c[1] =3D x[5], c[2] =3D x[8[, ... > > > etc. =A0Each of these is filtered through G(z) as though the > > others never existed; a, b, c don't interact with each > > other > > really? =A0i think that's true only for the feedforward comb, no? =A0less=
ee,
> if that were true for the feedback, maybe it could be for integer M and > that the states before feedback (indexed 0 to M-1) recirculate. =A0now ca=
n
> it be true for non-integer M (assuming an almost perfect sinc() > interpolation)? > > hmmm... > > > and the corresponding output sequences continue > > on their merry way, still interleaved, still not speaking to > > each other. > > ... you might be right. =A0not sure about recursive with non-integer M, > though (which is my primary interest). > > > =A0It is sort of like how Congress works these > > days (except there are no veto threats!) > > it's worse than that! =A0good grief. =A0i am convinced that they're > committing widespread acts of sodomy when they're in session. > > no doubt. > > :-\ > > still groping for an available label for this thing that seems, for > semantic purposes, best labeled as "generalized" or "general" comb filter=
s.
> > -- > > r b-j =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0r...@audioimagination.com > > "Imagination is more important than knowledge."
Robert I wouldn't use GCF as many would think of Greatest Common Factor. How about Canonical Comb Filter? Okay I know CCF sounds like a unit on your natural gas bill. Then you may pick Universal Tine Filter although UTF is in use (I have some in my barn for my tractor), it is not likely to be confused with DSP. Clay p.s. I recall seeing a paper a few years back that used fractional delays in a biquad filter.
Reply by dvsarwate December 7, 20112011-12-07
On Dec 7, 3:09=A0am, robert bristow-johnson <r...@audioimagination.com>
wrote:

In short, when you write

> y[n] =A0=3D =A0b_0*x[n] =A0- =A0a_M*y[n-M]
where *M* is not an integer, a_M*y[n-M] really is a *weighted* sum of various y[n-k] (where both n and k are integers, and k might be both positive and negative). Thus, in reality we have something y[n] =3D b_0*x[n] - sum_{k =3D -i}^{k =3D +i} (c_k)*y[n-k] for appropriately chosen coefficients c_k or y[n] =3D b_0*x[n] - sum_{k =3D 1}^{k =3D i} (c_k)*y[n-k] to keep it causal and not have current output dependent on future outputs. And rather than describe this as a perfectly ordinary IIR filter with transfer function E(z) which is a rational function (ratio of polynomials in z), we choose to write the transfer function as H(z) =3D b_0 / (1 + a_M*z^-M) =3D G(z^M) where G(z) is a rational function of z but H(z) is not because M is not an integer? OK, whatever floats your boat....
Reply by robert bristow-johnson December 7, 20112011-12-07
On 12/6/11 10:42 PM, dvsarwate wrote:
> On Dec 6, 6:58 pm, robert bristow-johnson<r...@audioimagination.com> > wrote: > >> >> ... you might be right. not sure about recursive with non-integer M, >> though (which is my primary interest). >> > > If M is not an integer, what is meant by y[n-M] in > >>> y[n] = b_0*x[n] - a_M*y[n-M] > > Are you upsampling to get fractionally delayed samples?
well, in one sense, yes; but really, no. if D is not an integer, how you get y[n-D] is lessee (assume normalized sampling rate, y[n] = y(n) for integer n.) +inf y(t) = SUM{ y[k] * sinc(t - k) } k=-inf +inf y(n-D) = SUM{ y[k] * sinc(n-D - k) } k=-inf inf = SUM{ y[k] * sinc((k-n) + D) } k=-inf inf = SUM{ y[n+k] * sinc(k+D) } k=-inf inf = SUM{ y[n-M+k] * sinc(k+D-M) } k=-inf where M = floor(D) and the integer part of the delay. 0 <= D-M < 1 is the fractional part of the delay. now we start approximating... K/2 y(n-D) ~= SUM{ y[n+k-M] * sinc(k+D-M) * w((k+D-M)/K) } k=-K/2+1 where w(x/K) is a good window (like a Kaiser) of width K and K is decently large, like 16 or 32. and, for realizability, M > K/2 so, at whatever value of D, i have a delayed value, no matter what the precision is on D. but i can't have an infinite number of h(t) = sinc(t) * w(t/K) values. so, by having a table of uniformly spaced values of h(t), then in that sense, i am upsampling. Dilip, this is kinda fundamentally how i look at sampling and reconstruction, whether is for sample rate conversion (where the D might be moving sorta fast) or for precision delay (where the D is moving slowly). -- r b-j rbj@audioimagination.com "Imagination is more important than knowledge."
Reply by dvsarwate December 6, 20112011-12-06
On Dec 6, 6:58=A0pm, robert bristow-johnson <r...@audioimagination.com>
wrote:

> > ... you might be right. =A0not sure about recursive with non-integer M, > though (which is my primary interest). >
If M is not an integer, what is meant by y[n-M] in
>>y[n] =3D b_0*x[n] - a_M*y[n-M]
Are you upsampling to get fractionally delayed samples?
Reply by robert bristow-johnson December 6, 20112011-12-06
On 12/6/11 3:45 PM, dvsarwate wrote:
> On Dec 6, 3:17 pm, robert bristow-johnson<r...@audioimagination.com> > wrote: >> >> so, if you were to generalize this further and create a comb filter as >> >> H(z) = G(z^M) >> >> where G(z) is *any* realizable digital filter, either FIR or IIR, what >> would you call that thing? > > Think of this as *delay-scaling* of G(z).
actually, i like to think of it as *frequency-scaling*. instead of teeth at even or odd integer multiples of pi, it can be at integer multiples of an arbitrary w0 << pi (not so much "<<", maybe a "<" and a half).
> Effectively we are > looking at the input as M *interleaved* subsequences each > being operated on by G(z). For example, if M = 3 and > the input is x[0], x[1], x[2], x[3], x[4], x[5], x[6], .... then we > think of these as 3 interleaved sequences, call them a, b, c > where > > a[0] = x[0], a[1] = x[3], a[2] = x[6], .... > b[0] = x[1], b[1] = x[4], b[2] = x[7], .... > c[0] = x[2], c[1] = x[5], c[2] = x[8[, ... > > etc. Each of these is filtered through G(z) as though the > others never existed; a, b, c don't interact with each > other
really? i think that's true only for the feedforward comb, no? lessee, if that were true for the feedback, maybe it could be for integer M and that the states before feedback (indexed 0 to M-1) recirculate. now can it be true for non-integer M (assuming an almost perfect sinc() interpolation)? hmmm...
> and the corresponding output sequences continue > on their merry way, still interleaved, still not speaking to > each other.
... you might be right. not sure about recursive with non-integer M, though (which is my primary interest).
> It is sort of like how Congress works these > days (except there are no veto threats!)
it's worse than that! good grief. i am convinced that they're committing widespread acts of sodomy when they're in session. no doubt. :-\ still groping for an available label for this thing that seems, for semantic purposes, best labeled as "generalized" or "general" comb filters. -- r b-j rbj@audioimagination.com "Imagination is more important than knowledge."
Reply by Vladimir Vassilevsky December 6, 20112011-12-06

robert bristow-johnson wrote:

> On 12/6/11 3:40 PM, Vladimir Vassilevsky wrote: > >> >> robert bristow-johnson wrote: >> >>> >>> so, if you were to generalize this further and create a comb filter as >>> >>> H(z) = G(z^M) >> >> >> This is what they call interpolated filters. > > i dunno, Vlad. who is they?
Stupidents ?
>> Combining LPF and HPF comb structures could make for very efficient >> filters with arbitrary response. > > well, arbitrary *repeating* response.
Not only that. You can apply other filters attenuating some comb teeth and emphasising the others, and then combine them. This is the same idea as in the multirate processing, but without changing the sampling rate. The resulting response could be arbitrary; and the implementation could be more efficient then a direct PM design or an FFT.
>> Rick Lyons wrote a few articles about it. > > well, if they are that IEEE tips & tricks (or something else), i > wouldn't mind a solid reference.
It is simple. Just play around it and you will get the idea.
>> BTW, you can insert a crude fractional delay approximation instead of >> z^M; > > that's the idea for audio/music application. and the fractional delay > need not be terribly crude. a 16-tap polyphase isn't terribly expensive > and can be very good.
If the fractional delay is good, then the behavior of such filter is clear. It is interesting to see what happens if the delay approximation is simple and crude; i.e. frequency dependent. another way to do it is to use an APF for the
> fractional delay. but the delay is somewhat frequency dependent, which > may or may not be a good thing.
The accurate approximation of a fractional delay could be demanding while the whole point of interpolated filters is simplification.
>> it makes for peculiar results. > > i wonder what the frequency response would look like around Nyquist, > because since it's still just a digital filter, there would still have > to be symmetry about Nyquist. when M is an integer, the tooth (or space > between teeth) lies squarely on top of Nyquist, but that is not the case > for non-integer M. so (for non-integer M) you would have to have > unequal spacing between the tooth just below Nyquist and the tooth just > above. > > otherwise, i dunno what would be appreciably different if you used a > *really* good fractional delay, that z^-M should become very nearly > e^(-j*w*M) whether M is an integer or not and it should look like a comb.
Vladimir Vassilevsky DSP and Mixed Signal Design Consultant http://www.abvolt.com
Reply by robert bristow-johnson December 6, 20112011-12-06
On 12/6/11 3:40 PM, Vladimir Vassilevsky wrote:
> > robert bristow-johnson wrote: > >> >> so, if you were to generalize this further and create a comb filter as >> >> H(z) = G(z^M) > > This is what they call interpolated filters.
i dunno, Vlad. who is they?
> Combining LPF and HPF comb structures could make for very efficient > filters with arbitrary response.
well, arbitrary *repeating* response.
> Rick Lyons wrote a few articles about it.
well, if they are that IEEE tips & tricks (or something else), i wouldn't mind a solid reference.
> BTW, you can insert a crude fractional delay approximation instead of > z^M;
that's the idea for audio/music application. and the fractional delay need not be terribly crude. a 16-tap polyphase isn't terribly expensive and can be very good. another way to do it is to use an APF for the fractional delay. but the delay is somewhat frequency dependent, which may or may not be a good thing.
> it makes for peculiar results.
i wonder what the frequency response would look like around Nyquist, because since it's still just a digital filter, there would still have to be symmetry about Nyquist. when M is an integer, the tooth (or space between teeth) lies squarely on top of Nyquist, but that is not the case for non-integer M. so (for non-integer M) you would have to have unequal spacing between the tooth just below Nyquist and the tooth just above. otherwise, i dunno what would be appreciably different if you used a *really* good fractional delay, that z^-M should become very nearly e^(-j*w*M) whether M is an integer or not and it should look like a comb. -- r b-j rbj@audioimagination.com "Imagination is more important than knowledge."
Reply by dvsarwate December 6, 20112011-12-06
On Dec 6, 3:17=A0pm, robert bristow-johnson <r...@audioimagination.com>
wrote:
> okay, we know about comb filters. >
> > so, if you were to generalize this further and create a comb filter as > > =A0 =A0 H(z) =A0 =3D =A0 G(z^M) > > where G(z) is *any* realizable digital filter, either FIR or IIR, what > would you call that thing?
Think of this as *delay-scaling* of G(z). Effectively we are looking at the input as M *interleaved* subsequences each being operated on by G(z). For example, if M =3D 3 and the input is x[0], x[1], x[2], x[3], x[4], x[5], x[6], .... then we think of these as 3 interleaved sequences, call them a, b, c where a[0] =3D x[0], a[1] =3D x[3], a[2] =3D x[6], .... b[0] =3D x[1], b[1] =3D x[4], b[2] =3D x[7], .... c[0] =3D x[2], c[1] =3D x[5], c[2] =3D x[8[, ... etc. Each of these is filtered through G(z) as though the others never existed; a, b, c don't interact with each other and the corresponding output sequences continue on their merry way, still interleaved, still not speaking to each other. It is sort of like how Congress works these days (except there are no veto threats!) Dilip Sarwate
Reply by Vladimir Vassilevsky December 6, 20112011-12-06

robert bristow-johnson wrote:

> > so, if you were to generalize this further and create a comb filter as > > H(z) = G(z^M)
This is what they call interpolated filters. Combining LPF and HPF comb structures could make for very efficient filters with arbitrary response. Rick Lyons wrote a few articles about it. BTW, you can insert a crude fractional delay approximation instead of z^M; it makes for peculiar results. Vladimir Vassilevsky DSP and Mixed Signal Design Consultant http://www.abvolt.com