# IIR filter design in matlab

I have to design 2 IIR bandpass filter with the following specifications:

Sampling frequency 1000 Hz Pass-band 50 Hz to 200 Hz Order 6 using bilinear transform and impulse invariance with Butterworth prototype analogue filter.

I'm confused, because the two methods I've got for producing the filters have different results.

fs = 1000;
fNq = fs/2;
f1 = 50/fNq;
f2 = 200/fNq;
[z,p,k] = buttap(6);
[A,B,C,D] = zp2ss(z,p,k);
[zd,pd,kd] = bilinear(z,p,k,fs);
Bw = f2-f1;
Wo = sqrt(f1*f2);
[At,Bt,Ct,Dt] = lp2bp(A,B,C,D,Wo,Bw);
[b,a] = ss2tf(At,Bt,Ct,Dt);

[Ad,Bd,Cd,Dd] = bilinear(At,Bt,Ct,Dt,fs);
[bz, az] = ss2tf(Ad,Bd,Cd,Dd);
fvtool(bz,az);


(I think that) The above code creates an analogue prototype, transforms to a state-space form, applies the bilinear transform, transforms the low-pass filter to a band-pass filter, transforms to a transfer function and the plots it.

My problem is that it is noticably different to:

[num,den] = butter(6, [f1, f2], 's');
[B,A] = bilinear(num, den, fs);
fvtool(B, A);


I have similar problems with the impulse invariance method.

Could someone please give me a hint as to what I'm doing wrong?

## 1 Answer

The issue is resolved: the butter() function automatically does bilinear transform, you just need to specify the frequencies normalised to the Nyqyist freq.

• Please give this answer the check mark if it really solved your problem. Thanks!
– Peter K.
Commented Oct 4, 2016 at 11:41