# filter with arbitrary and variable rolloff

Started by May 15, 2006
```Hi,

How can I implement a filter (lowpass) with variable slope.
1st order gives me 6db per octave and
2nd order 12db per octave.  So what can I do if I need
8db or 4.2db attenuation per octave.  Could fractional delay lines
instead of unit delays be a starting point?

gr.
Anton

```
```"banton" <bantone@web.de> wrote in message
news:KsidnfBIb9nq6vXZRVn-gg@giganews.com...
> Hi,
>
> How can I implement a filter (lowpass) with variable slope.
> 1st order gives me 6db per octave and
> 2nd order 12db per octave.  So what can I do if I need
> 8db or 4.2db attenuation per octave.  Could fractional delay lines
> instead of unit delays be a starting point?
>
> gr.

One way is to use a design program that will accept a "continuous"
definition of desired response.  Then, generate the response sequence of
values that you want.  Then, let the program design the filter.  Surely you
don't need 8dB/octave for too many octaves, right?

Fred

```
```Fred wrote:
> One way is to use a design program that will accept a "continuous"
> definition of desired response.  Then, generate the response sequence of

> values that you want.  Then, let the program design the filter.  Surely
you
> don't need 8dB/octave for too many octaves, right?

But what I need is a _variable_ slope.  My question was a bit to vague. I
need a way to recalculate the coefficients on the fly. I found this
material about a 3db rolloff filter:

http://www.firstpr.com.au/dsp/pink-noise/
A cite from this source:
----
It comes back to the roll-off of a first order low-pass filter being too
steep at -6dB/octave. The only thing I could think of with a softer
roll-off was the transition from 0dB/oct to -6dB/octave at the "knee" of
such a filter. By positioning enough of these knees in a "staircase" a
good -3dB/oct slope can be made.
---

I wonder if there is a way to use a similar method but with the
possibility
to change the slope in realtime.

gr.
Anton

```
```"banton" <bantone@web.de> wrote in message
news:ivydnQ7nQtts2vTZRVn-gg@giganews.com...
> Fred wrote:
>> One way is to use a design program that will accept a "continuous"
>> definition of desired response.  Then, generate the response sequence of
>
>> values that you want.  Then, let the program design the filter.  Surely
> you
>> don't need 8dB/octave for too many octaves, right?
>
> But what I need is a _variable_ slope.  My question was a bit to vague. I
> need a way to recalculate the coefficients on the fly. I found this
> material about a 3db rolloff filter:
>
> http://www.firstpr.com.au/dsp/pink-noise/
> A cite from this source:
> ----
> It comes back to the roll-off of a first order low-pass filter being too
> steep at -6dB/octave. The only thing I could think of with a softer
> roll-off was the transition from 0dB/oct to -6dB/octave at the "knee" of
> such a filter. By positioning enough of these knees in a "staircase" a
> good -3dB/oct slope can be made.
> ---
>
> I wonder if there is a way to use a similar method but with the
> possibility
> to change the slope in realtime.
>
> gr.
> Anton

Anton,

Oh, OK.  Well, the notion of a table lookup comes to mind.  Design a bunch
of filters that span the space of possibilities and apply the filter you
want.  The real trick is how to change from one filter to another.  You
might make all the filters (FIR filters) the same length and transition the
coefficient values from one set to another over the temporal length of the
filter.  That way there would be a gradual "transient" in changing filters.

Example:
original filter:
filter 1 h1(n) = [a b c d e f g h i] length = 9

to transition to:
filter 2 h2(n) = [j k l m n o p q r] length = 9

filter 11 h11(n) = h1(n)
filter 12 h12(n) = h1*8/9 + h2/9
filter 12 h13(n) = h1*7/9 + h2*2/9
.
.
filter 18 h18(n) = h1/9 + h2*8/9
filter 19 h19(n) = h2(n)

Of course, you keep the interim values of the input data to apply to each of
these new filters at each sample time.  That's the same as if you'd not
changed the filter coefficients at all - a circular buffer or .....

If you consider what this does, it's like having the two filters that are in
transition in parallel and you increase the output from the new one as you
decrease the output from the original one.  It could be more gradual and it
could be more abrupt.  I simply chose a transition time that's equivalent to
the length of the impulse response of each filter - or its settling time

Fred

```
```Fred wrote:
>Oh, OK.  Well, the notion of a table lookup comes to mind.  Design a
bunch
>of filters that span the space of possibilities and apply the filter you

>want.  The real trick is how to change from one filter to another.  You
>might make all the filters (FIR filters) the same length and transition
the
>coefficient values from one set to another over the temporal length of
the
>filter.  That way there would be a gradual "transient" in changing
filters.

That is a straight forward way.  I'll try it.
What do you think is a good way to design the tables of coefficients
for the fir filters.  Ifft and windowing?

That might be a good working solution, but just for curiousity I still
would like to know if the fractional delay line idea is the wrong path in

general or if it is just too complicated (overkill).
How does a filter change if I use fractional delays (allpass based or
lagrange interpolation) instead of the unitdelays?
Usually they are used for comb filters to achieve flexible tuning of
resonance frequencies, but I think it could also be possible to
achieve slope control that way.

gr.
Anton

```
```banton wrote:

> Fred wrote:
>
>>Oh, OK.  Well, the notion of a table lookup comes to mind.  Design a
>
> bunch
>
>>of filters that span the space of possibilities and apply the filter you
>
>
>>want.  The real trick is how to change from one filter to another.  You
>>might make all the filters (FIR filters) the same length and transition
>
> the
>
>>coefficient values from one set to another over the temporal length of
>
> the
>
>>filter.  That way there would be a gradual "transient" in changing
>
> filters.
>
> That is a straight forward way.  I'll try it.
> What do you think is a good way to design the tables of coefficients
> for the fir filters.  Ifft and windowing?
>
> That might be a good working solution, but just for curiousity I still
> would like to know if the fractional delay line idea is the wrong path in
> general or if it is just too complicated (overkill).
> How does a filter change if I use fractional delays (allpass based or
> lagrange interpolation) instead of the unitdelays?
> Usually they are used for comb filters to achieve flexible tuning of
> resonance frequencies, but I think it could also be possible to
> achieve slope control that way.

Anton,

With linear-phase filters, you need only slopes between flat and 6
dB/octave. You can just add (subtract) integer multiples of 6 dB/octave
to (from) them.

When this is done with analog or IIR filters, up breaks alternate with
down breaks on the Bode plot, and the overall slope is determined by
their (logarithmic) spacing. There are analytic ways to optimize
flatness, but eyeball analysis usually suffices.

Jerry
--
Engineering is the art of making what you want from things you can get.
&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;
```
```"Jerry Avins" <jya@ieee.org> wrote in message
news:peidnVuREPUPavTZnZ2dnUVZ_tudnZ2d@rcn.net...
> banton wrote:
>
> Anton,
>
> With linear-phase filters, you need only slopes between flat and 6
> dB/octave. You can just add (subtract) integer multiples of 6 dB/octave
> to (from) them.
>
> When this is done with analog or IIR filters, up breaks alternate with
> down breaks on the Bode plot, and the overall slope is determined by
> their (logarithmic) spacing. There are analytic ways to optimize
> flatness, but eyeball analysis usually suffices.
>

Jerry,

I'm intrigued by your comment and don't fully understand yet.  How do you

Fred

```
```"banton" <bantone@web.de> wrote in message
news:lr-dnWVG__V5xfTZnZ2dnUVZ_tSdnZ2d@giganews.com...
>
> That is a straight forward way.  I'll try it.
> What do you think is a good way to design the tables of coefficients
> for the fir filters.  Ifft and windowing?

Either the windowing method of filter design or a real optimizing filter
design program that allows you to specify the desired function
continuously - I'm not sure which program might do that.  In contrast, the
Parks-McClellan program has you define constant gain across each defined
band.  I'm not sure if defining lots of mini-bands would work but it
might...

>
> That might be a good working solution, but just for curiousity I still
> would like to know if the fractional delay line idea is the wrong path in
> general or if it is just too complicated (overkill).
> How does a filter change if I use fractional delays (allpass based or
> lagrange interpolation) instead of the unitdelays?
> Usually they are used for comb filters to achieve flexible tuning of
> resonance frequencies, but I think it could also be possible to
> achieve slope control that way.

I don't know.

Fred

```
```banton wrote:

> How can I implement a filter (lowpass) with variable slope.
> 1st order gives me 6db per octave and 2nd order 12db per octave.
> So what can I do if I need 8db or 4.2db attenuation per octave.
> Could fractional delay lines instead of unit delays be a starting
> point?

If you take any filter and replace each unit delay with a first-order
allpass filter, you get what's called a frequency-warped filter. Say
the original filter's frequency spectrum is H(e^jw); then the warped
filter spectrum is H(e^j f(w)) where the shape of the function f
depends on the allpass coefficient.

You could certainly try to approximate a given slope starting from a

Martin

--
No wonder that illegitimate children are commonly
the greatest minds; they are the result of an hour
full of wit, marital ones often spring from boredom.
--Theodor Gottlieb von Hippel
```
```Fred Marshall wrote:

...

> Jerry,
>
> I'm intrigued by your comment and don't fully understand yet.  How do you
> add/subtract integer multiples or any of the others?  Cascade the filters?

Precisely! Phase effects can be bothersome, but linear-phase filters
avoid the question, and minimum-phase implementations usually work
together with no problem. The difference between cascading 3- and
6-dB/octave filters, and building a single 9/dB/octave filter with 3-
and 6-dB/octave sections is possible interaction in the first case, but
the restrictions on phase behavior blur the distinction.

Jerry
--
Engineering is the art of making what you want from things you can get.
&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;&#4294967295;
```