Designing IIR Filters using Bilinear Transform
68 views (last 30 days)
Show older comments
Vincent Abraham
on 16 Nov 2020
Answered: Mathieu NOE
on 16 Nov 2020
I have written the following code to design an IIR filter with a cut-off frequency of 800 Hz. However, I'm not getting the desired cut-off in the plot. Can someone tell me where I went wrong ?
clc;
clear all;
close all;
N = 2;
Wc = 800;
FS = 8000;
wc = 2*pi*Wc/FS;
T = 1;
[a, b] = butter(N, wc, 's');
[ad, bd] = bilinear(a, b, T);
freqz(ad,bd,512,8000);
axis([0 4000 -40 1]);
title('Frequency Response of the Filter')
0 Comments
Accepted Answer
Mathieu NOE
on 16 Nov 2020
so final and last version of the answer :
N = 2;
fc = [500 1000];
FS = 8000;
fcn = 2*fc/FS;
T = 1/FS;
freq = logspace(2,log10(FS/2.56));
% [ad, bd] = butter(N, fcn); % digital version
[a, b] = butter(N, 2*pi*fc, 's'); % analog version
figure(1); % allows log x
[g,p] = bode(a,b,2*pi*freq);grid
subplot(2,1,1),semilogx(freq,20*log10(g));
title('Frequency Response of the Filter')
subplot(2,1,2),semilogx(freq,p);grid
[ad, bd] = bilinear(a, b, FS);
figure(2); freqz(ad,bd,freq,FS); % allows only lin x
title('Frequency Response of the Filter')
figure(3); % allows log x
[g,p] = dbode(ad,bd,1/FS,2*pi*freq);
subplot(2,1,1),semilogx(freq,20*log10(g));grid
title('Frequency Response of the Filter')
subplot(2,1,2),semilogx(freq,p);grid
% axis([0 4000 -40 1]);
[ad, bd] = butter(N, fcn); % digital version
figure(4); % allows log x
[g,p] = dbode(ad,bd,1/FS,2*pi*freq);
subplot(2,1,1),semilogx(freq,20*log10(g));grid
title('Frequency Response of the Filter')
subplot(2,1,2),semilogx(freq,p);grid
0 Comments
More Answers (1)
Mathieu NOE
on 16 Nov 2020
hello
this works - simply wrong computation of normalized cut off frequency
FYI butter will by default generate a digital filter; no need to create an first analog version to discretize with bilinear
also I tested the freqz display (linear frequency axis) vs traditionnal log x bode plot;
clc;
clear all;
close all;
N = 2;
fc = 800;
FS = 8000;
fcn = 2*fc/FS;
T = 1/FS;
[ad, bd] = butter(N, fcn);
freq = logspace(2,log10(FS/2.56));
figure(1); freqz(ad,bd,freq,FS); % allows only lin x
title('Frequency Response of the Filter')
figure(2); % allows log x
[g,p] = dbode(ad,bd,1/FS,2*pi*freq);
subplot(2,1,1),semilogx(freq,20*log10(g));
title('Frequency Response of the Filter')
subplot(2,1,2),semilogx(freq,p);
% axis([0 4000 -40 1]);
8 Comments
Mathieu NOE
on 16 Nov 2020
you're welcome
I will put the last version of the code in the answer section, if you don't mind accep it ! tx
See Also
Categories
Find more on Filter Analysis in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!