Some of you may know the infamous Audio EQ Cookbook. You can take a look here.

We tried to implement the functions there to achieve a implementation for a Lowpassfilter. However, when we try to lower our variable cutoff-frequency, we have some issues. With decreasing cutoff-frequency the signal is increasing in volume. Reaching a distinct treshold at around 4000- 6000Hz the filter stops working, because it computes samplevalues that are ever increasing, reaching around 2000000 shortly after lowering the cutoff frequency.

We checked our code multiple times,and the functions from the Cookbook should be right. If someone wants to see the code i can hand it to you later.

For any hints or solution we are more than thankful.

EDIT: The important part of the code.

float Filter::processFilter(float sample)
   float unprocessed = sample;

    float processed = (unprocessed) + (computeB1() * x_n_1) + 
        (computeB2() * x_n_2) - (computeA1() * y_n_1)
        -(computeA2() * y_n_2);

    x_n_2 = x_n_1;
    x_n_1 = unprocessed;

    y_n_2 = y_n_1;
    y_n_1 = processed;

    return processed;
  • $\begingroup$ What's your Q? Your implementation is in floating point? You could post the filter coefficients so we can see what's going on (or, equivalently, Q, f0, and your sampling frequency). $\endgroup$ – Matt L. Jan 26 '15 at 16:17
  • $\begingroup$ That page, you provided, belongs to "Robert Bristow-Johnson" so you better ask him, as he is a member here :) $\endgroup$ – Fat32 Jan 26 '15 at 16:20
  • $\begingroup$ Q was 1 when the problem occured. The implementation is in c++ with float type. Sampling frequency is 48000. And f0 is 5355 and every value below that. $\endgroup$ – amaik Jan 26 '15 at 16:23
  • $\begingroup$ I don't understand the downvote, if some information is missing i can provide, but just downvote the question is not helpful, thanks. $\endgroup$ – amaik Jan 26 '15 at 16:24
  • 2
    $\begingroup$ @amaik: From the cookbook you get coefficients a0, a1, a2, b0, b1, and b2. Now you divide all coefficients by a0, and that's it. So the final b0 that you use is the original b0 divided by a0, etc. $\endgroup$ – Matt L. Jan 27 '15 at 9:10

With the values you provided ($Q=1$, $f_0=5355\,\text{Hz}$, and $F_s=48\,\text{kHz}$) I get the following filter coefficients from the Cookbook formulas:

b =


a =


Note that the formulas give you denominator coefficients that are not normalized. Many implementations use $a_0=1$, which can be easily achieved by dividing numerator and denominator coefficients by $a_0=1.32248$.

The maximum pole radius of this filter is $0.72$, which means that we're not at all close to the unit circle, so stability shouldn't be an issue, no matter which implementation you use.

You can add more information if you like, but from what I know up to now, the most likely problem is a bug in your code.

Just test your filtering routine by using as input sequence x=1,0,0,...,, which should give the following output (the impulse response):

ans =

  • $\begingroup$ Ok, Thank you. I'll check again for bugs. Just one more question. y[n] does specify the effected signal, whilst x[n] the uneffected signal, doesn't. $\endgroup$ – amaik Jan 26 '15 at 16:52
  • $\begingroup$ @amaik: Yes, $x[n]$ is the input sequence, and $y[n]$ is the output sequence. $\endgroup$ – Matt L. Jan 26 '15 at 16:57
  • $\begingroup$ Thanks again. I checked the computation of the coefficients and we have the same as you posted. I edited the question and added the important part of the code. What may be false is the output sequence? I don't know. $\endgroup$ – amaik Jan 26 '15 at 17:35
  • $\begingroup$ @amaik: OK, I added the output signal for an impulse as input signal. Compare that with what you're routine computes. $\endgroup$ – Matt L. Jan 26 '15 at 17:41

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.