Rockbox.org home
release
dev builds
extras
themes manual
wiki
device status forums
mailing lists
IRC bugs
patches
dev guide



Rockbox mail archive

Subject: Re: DSP: low pass filter

Re: DSP: low pass filter

From: Jacob <jacob01_at_gmx.net>
Date: 2005-08-17

Hi,

just to add my 5c and just because I spent several hours digging again into
digital filter design 2 nights ago, here are the results. I've used
floats even in the filter, but changing it to int (32bit) shouldn't be a
big issue.

You get an approximated 2nd order (12dB/octave) Butterworth low-pass
IIR filter with a cutoff frequency (-3dB) of 120 Hz by applying the following
piece of 'code':

{
  float x, y1 = 0, y2 = 0, y;
  float alpha_0 = 7.22031e-05, beta_1 = -1.97582, beta_2 = 0.976111;
  
  while (/* input samples left */)
  {
    /* read sample into x */

    /* filter */
    x = x * alpha_0;
    y = y1 + x;
    y1 = y2 + 2 * x - y * beta_1;
    y2 = x - y * beta_2;
   
    /* output is in y */
  }
}

To compute the coefficients:

  f_a = 44100
  f_g = 120

  F_g = f_g / f_a

  norm = cos (pi * F_g) / sin (pi * F_g)

  /* Coefficients for Butterworth 2. order, continuous world */
  a_1 = 1.4142
  b_1 = 1.0000

  /* discrete coefficients */
  alpha_0 = 1 / (1 + a_1 * norm + b_1 * norm * norm)
  beta_1 = 2 * (1 - b_1 * norm * norm) / (1 + a_1 * norm + b_1 * norm * norm)
  float beta_2 = (1 - a_1 * norm + b_1 * norm * norm) /
                  (1 + a_1 * norm + b_1 * norm * norm)

If 12dB/octave are not enough, you can cascade several filters but you have
to use different coefficients a_1 and b_1 in each of them to get the same
cutoff frequency:

Given that there are N 2nd order filter (see above), for each stage k
(1 <= k <= N) you get the coefficients like this:

  a_1[k] = 2 * cos (( 2 * k - 1) * pi / ( 4 * N ))
  b_1[k] = 1

E.g. for an 24dB/oct filter (4th order):
 
  a_1[1] = 1.84776, b_1[1] = 1
  a_1[2] = 0.765367, b_1[2] = 1
  alpha_0[1] = 7.19397e-05, beta_1[1] = -1.96861, beta_2[1] = 0.968901
  alpha_0[2] = 7.2601e-05, beta_1[2] = -1.98671, beta_2[2] = 0.987

You might get instabilities with low cutoff frequencies and high N.

Even though you are already happy with your solution, I hope someone
besides myself will find this at least interesting ;-)

Jacob

On Mon, Aug 15, 2005 at 09:54:00PM +0200, Tomas wrote:
> Well... following my calculations and Dave's suggestion I have just used
> a 128 samples moving average, and it works great.
>
> [...]
>
> [IDC]Dragon wrote:
>
> >I suggest using an IIR filter instead of FIR. You need way less past
> >samples
> >for each step.
> >[...]
_______________________________________________
http://cool.haxx.se/mailman/listinfo/rockbox
Received on Wed Aug 17 01:29:57 2005


Page was last modified "Jan 10 2012" The Rockbox Crew
aaa