Designing IIR Filters using Bilinear Transform
26 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
Mathieu NOE
2020-11-16
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 个评论
更多回答(1 个)
Mathieu NOE
2020-11-16
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 个评论
Mathieu NOE
2020-11-16
you're welcome
I will put the last version of the code in the answer section, if you don't mind accep it ! tx
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Filter Analysis 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!