Designing IIR Filters using Bilinear Transform

조회 수: 21 (최근 30일)
Vincent Abraham
Vincent Abraham 2020년 11월 16일
답변: Mathieu NOE 2020년 11월 16일
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')

채택된 답변

Mathieu NOE
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

추가 답변 (1개)

Mathieu NOE
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
Vincent Abraham
Vincent Abraham 2020년 11월 16일
Damn okay thanks a lot!
Mathieu NOE
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 CenterFile Exchange에서 Analog Filters에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by