Hello, I am working on a digital filter implementation of a fractional-sample delay filter bank. Basically, I have ten sampled input signals which are each out of phase with the previous by 2/25ths of a sample (the last is 18/25ths of a sample out of phase with the first) and I'd like to delay each one, except the last, so that they are all in phase. I am currently testing an implementation involving a high order FIR LPF (or a low order LPF oversampled by 25 times), sliced into 10 lower order LPFs, each offset slightly from the previous. This in theory will result in what I am looking for but it requires low pass filtering. Is there a way to achieve this fractional delay without low pass filtering? I know a simple all pass filter introduces a delay while keeping the magnitude response constant, but the delay is an integer sample number (isn't it?). I guess I could also just shift the signals and interpolate to "resample" at the shifted position, but it seems less practical and/or accurate. Maybe it isn't. Can anyone comment? Thanks, Marc
fractional-sample delay filtering
Started by ●September 23, 2005
Reply by ●September 23, 20052005-09-23
in article 1127508537.136564.94120@f14g2000cwb.googlegroups.com, Marc at marc.saab@mail.mcgill.ca wrote on 09/23/2005 16:48:> Hello, > > I am working on a digital filter implementation of a fractional-sample > delay filter bank. Basically, I have ten sampled input signals which > are each out of phase with the previous by 2/25ths of a sample (the > last is 18/25ths of a sample out of phase with the first) and I'd like > to delay each one, except the last, so that they are all in phase. > > I am currently testing an implementation involving a high order FIR LPF > (or a low order LPF oversampled by 25 times), sliced into 10 lower > order LPFs, each offset slightly from the previous. This in theory > will result in what I am looking for but it requires low pass > filtering. > > Is there a way to achieve this fractional delay without low pass > filtering? I know a simple all pass filter introduces a delay while > keeping the magnitude response constant, but the delay is an integer > sample number (isn't it?). I guess I could also just shift the signals > and interpolate to "resample" at the shifted position, but it seems > less practical and/or accurate. Maybe it isn't. > > Can anyone comment? Thanks,fractional-sample delay is the same interpolation as done in sample rate conversion, except that the fractional portion of the instantaneous resampling time does not vary (rapidly) as it does for SRC. i have posted a little primer on how to think about this which has a copy at http://groups.google.com/group/comp.dsp/msg/e9b6488aef1e2580?hl=en&fwc=1 -- r b-j rbj@audioimagination.com "Imagination is more important than knowledge."
Reply by ●September 24, 20052005-09-24
Marc wrote:> I guess I could also just shift the signals > and interpolate to "resample" at the shifted position, but it seems > less practical and/or accurate. Maybe it isn't.Consider what each sample represents in reconstruction. Each sample is replaced by a sinc() function scaled by the amplitude of the sample. The results of all the substitutions are summed to get the continuous reconstruction. Now what if you replaced each sample instead with a sinc() function that is shifted by some fraction of a sample? You'd get a reconstruction that is also shifted by that fraction. You don't have to wait for reconstruction to do that. You can instead replace each sample in your set by a fractionally shifted, sampled sinc() with them all summed up in the same way. The way to do that is to calculate that fractionally shifted, sampled sinc() and then use it (windowed to make it some finite length) as the coeficients of an FIR. The longer the windowed approximation, the more accurate will be the result. But yes, it is a lowpass. :-) Bob -- "Things should be described as simply as possible, but no simpler." A. Einstein
Reply by ●September 26, 20052005-09-26
Hi Bob, Thanks for the reply. Essentially that's what I'm doing. The interpolating functions were derived from a lowpass filter and we're using a shifted subfunction (a subset of samples of the LPF) for each incremental delay. In the end it appears to be same thing (is it?). I'm just prototyping in Matlab right now and it seems to be working well. I was hoping there was a way to do it without losing high frequency. I'm going to start working on Rob's reply but it was intimidating before I had any coffee. :) Thanks guys. Any other ideas please let me know. Marc
Reply by ●September 26, 20052005-09-26
Marc wrote:> The > interpolating functions were derived from a lowpass filter and we're > using a shifted subfunction (a subset of samples of the LPF) for each > incremental delay. In the end it appears to be same thing (is it?). > I'm just prototyping in Matlab right now and it seems to be working > well. > > I was hoping there was a way to do it without losing high frequency.The low pass filter should roll off somewhere below the Nyquist frequency, so the high frequency components you lose should just be (near) aliases which you don't want anyway. IMHO. YMMV. -- rhn A.T nicholson d.O.t C-o-M
Reply by ●September 26, 20052005-09-26
Marc wrote:> Hi Bob, > > Thanks for the reply. Essentially that's what I'm doing. The > interpolating functions were derived from a lowpass filter and we're > using a shifted subfunction (a subset of samples of the LPF) for each > incremental delay. In the end it appears to be same thing (is it?). > I'm just prototyping in Matlab right now and it seems to be working > well.Well, there are lots of lowpass filters. The one that is appropriate for this application is the symmetric sinc() function. This, of course, is linear rather than minimum phase which incurs a delay of half the filter length plus your fractional amount.> > I was hoping there was a way to do it without losing high frequency. > I'm going to start working on Rob's reply but it was intimidating > before I had any coffee. :)With a finite, windowed approximation to the infinite sinc() you will get some finite slope rolloff, rather than a brick wall at the high end and that can be controlled by the length of the sinc() approximation you use. The longer, the sharper. Bob -- "Things should be described as simply as possible, but no simpler." A. Einstein
Reply by ●September 28, 20052005-09-28
I'm implementing a symmetric Kaiser LPF with the cutoff near Nyquist and it's working fine. A little optimization and I should be ready to go. Thanks for the input guys. Marc
Reply by ●September 28, 20052005-09-28
Marc wrote:> I'm implementing a symmetric Kaiser LPF with the cutoff near Nyquist > and it's working fine.Interesting. I'm not a filter guy so could you give me some more info on that filter? I'm curious what the overall frequency response is compared to the sinc(). Bob -- "Things should be described as simply as possible, but no simpler." A. Einstein
Reply by ●September 28, 20052005-09-28
in article dhektb01jc1@enews2.newsguy.com, Bob Cain at arcane@arcanemethods.com wrote on 09/28/2005 13:46:> > > Marc wrote: >> I'm implementing a symmetric Kaiser LPF with the cutoff near Nyquist >> and it's working fine. > > Interesting. I'm not a filter guy so could you give me some > more info on that filter? I'm curious what the overall > frequency response is compared to the sinc().i'm not sure, Bob, bu i think he means a Kaiser windowed sinc() (which, if you're doing it the sinc() way, is about as good as it gets). if not, then i dunno. -- r b-j rbj@audioimagination.com "Imagination is more important than knowledge."
Reply by ●September 29, 20052005-09-29
"Bob Cain" <arcane@arcanemethods.com> wrote in message news:dhektb01jc1@enews2.newsguy.com...> > > Marc wrote: >> I'm implementing a symmetric Kaiser LPF with the cutoff near Nyquist >> and it's working fine. > > Interesting. I'm not a filter guy so could you give me some more info on that > filter? I'm curious what the overall frequency response is compared to the > sinc().I think he just means he is using the windowed-sinc method and using a Kaiser window.






