# Why is the gain of my IIR filter positive?

Sorry, two questions in one day!

I'm struggling to understand what I'm doing wrong in this very simple filter design. I want to design a simple, single pole low pass filter and implement it as an IIR in an embedded system.

I was looking at the DSP book online at recursive filters, and using their single-pole example to get started: http://www.dspguide.com/ch19/1.htm

According to the next page the coefficients I should need for the IIR single pole low pass filter are: $a_0=1-x$ and $b_1=x$

In order to get $x$ they give the equation (19-5) of $x=\epsilon^{-2\pi f_c}$

Given an fc of 0.125, I calculate x = 0.455938. Is this correct?

An fc of 0.125 at a sampling rate of 8kHz is 1kHz.

I don't see why when I try to get the frequency response of this filter I end up with entirely positive gain, as shown below:

Here is the code I've been using:

%Start from nothing!
clear;

% Set the sampling frequency used by our digital filtering system:
fs=8000;

% Set the coefficients up (As already worked out!) for a single-pole low pass
% filter. This should give us -3dB @ 1kHz with -6dB/Octave roll off
a = [ 0.544062 ];
b = [ 1, 0.45594 ];

% Determine the frequency response of the filter design above. Get the output
% in frequency rather than rad/s. Use 64 plot points.
[H,f] = freqz(b, a, 64, fs);

% Show our cutoff frequency
cutoff = -3 * ones(64);

% Plot the result so that we can see if it is correct:
figure(1);
plot(f, 20*log10(abs(H)), f, cutoff);
xlabel('Frequency (Hz)');
ylabel('Magnitude (dB)');


I'm again, just stumped as to what's going on, and don't know how to solve the issue.

• You have your a and b vectors reversed. For a first-order IIR filter, the a vector should have two elements (and you almost always want the first element to be unity). So, you're plotting the frequency response of the filter with difference equation $0.544062y[n] = x[n] + 0.45594 x[n-1]$, which is not what you want. Commented Jan 9, 2013 at 16:11

You have your a and b vectors reversed. For a first-order IIR filter, the a vector should have two elements (and you almost always want the first element to be unity). So, you're plotting the frequency response of the filter with difference equation $0.544062y[n]=x[n]+0.45594x[n−1]$, which is not what you want.

Also, as a note on MATLAB syntax, you'll also need to negate the second element of a (multiply it by -1) in order to get what you want. Read the documentation on functions that take IIR filter coefficients to learn why.

• Hi Jason, thanks very much for the reply. Looks like I need to read a lot more! I figured a and b were a convention that would be used the same in MATLAB as in the DSP book that was guiding me. I guess not. I don't suppose you can link to any documentation can you? I'm using GNU Octave and I can't see any documentation that has any information regarding anything special about the coefficients used. Thank-you again. Commented Jan 9, 2013 at 21:26

Yep, a and b reversed, AND x has the wrong sign. What you want is a=[1 -x]; b=1-x; The way that x is calculated seems also a bit off. A "real" low pass typically 0 gain at the Nyquist frequency. Taking into a account the bilinear transform you would want something like this

x = tan(fc*pi); a=[1 -x]; b=[(1-x) (1-x)]/2;

• Hi Hilmar, thanks for the reponse. I was trying to get a better grasp of IIR filters and so tried to step through the book recreating the (what appeared to be anyway) simplest examples I could to start off to check that I was doing the right things with GNU Octave. It seems like it's more of a minefield than I thought. Time to select a different DSP book. Thank-you very much for your help. Commented Jan 9, 2013 at 21:30
• Hilmar, the filter given by the linked page seems to be designed by impulse invariance rather than bilinear transform. Is that inherently a wrong design method? Commented Jun 21, 2013 at 16:11

Brian, I came across your post on the Valvers site when I was trying to learn about designing filters in Octave, so thanks for putting that up. The comment submission part of the page is broken though; thats not on purpose is it?

Anyway, the second filter (Hilmar's), is also what you get if you use Octave's Butterworth design routine (in package 'signal') to make a first order low pass with the values you had in for Fc and Fs:

octave-3.6.4:1467> [bb2 ba2] = butter(1,1000/4000)
bb2 =
0.29289   0.29289
ba2 =
1.00000  -0.41421


I've spent some time recently figuring out how to make different kind of digital filters in Octave, for implementation on an LPC cortex M3 microcontroller. I posted some notes here:

http://tooling-up.blogspot.com/2013/06/signal-acquisition-filtering-on-simple.html

• Hi Holly, Sorry for the late reply! That looks spot on. Thanks for putting up the link to the cortex M3 work. I'm using a few M0's and M3's at the moment so that's really useful. I'm not sure why the comment submission on valvers was broken. It seems okay at the moment. Commented Aug 7, 2013 at 15:35