Está en la página 1de 9

DISEO DE FILTROS DIGITALES IIR

Usando un filtro analgico tipo Butterworth de Orden 3, disear un filtro IIR pasa bajo con
una frecuencia de corte de 0.2 en 3dB.
Diseo:
La funcin de Transferencia para N=3 tipo Butterworth es:

H ( s) =

1
1
= 3
2
2
( s + 1) ( s + s + 1) s + 2s + 2s + 1

Graficando la Respuesta en Frecuencia y los Polos con Matlab

Realizando pre-warping


0.2
C = tg C C = tg

2
2

H ( s) =

H (s) =

; C = 0.3249

1
3

s
s
s
+2
+2
+1
C
C
C

1
3

s
s
s
+2
+2
+1
0.03429
0.10556
0.3249
1
H (s) = 3
s ( 29.1575) + s 2 (18.9465) + s (6.1557) + 1
H ( s) =

0.03429
s + s ( 0.6497 ) + s (0.2111) + 0.03429
3

Grafica de Respuesta en Frecuencia y localizacin de polos con MATLAB

Digitalizando nuestro filtro analgico, utilizamos el mtodo de Transformacin Bilineal

H ( z ) = H (s)
H ( z) =

H (z) =

( z + 1) 3
H ( z) =

(z

z 1
z +1

0.03429
3

z 1 z 1
z 1

+
( 0.6497 ) +
(0.2111) + 0.03429
z +1 z +1
z +1

[( z 1)

0.03429
3

+ ( z 1) * ( z + 1) * 0.6497 + ( z 1)( z + 1) * 0.2111 + ( z + 1) * 0.3429


2

0.03429( z + 1)

2 z + 1)( z 1) + ( z 2 2 z + 1)( z + 1)( 0.6497 ) + ( z 1) ( z 2 + 2 z + 1)( 0.2111) + ( z 2 + 2 z + 1)( z + 1)( 0.3429 )


0.03429( z + 1)
2
( z 2 z + 1)[ z1.6497 0.3503] + ( z 2 + 2 z + 1)[ z 0.24539 0.17681]
3

H (z) =

0.03429( z + 1)
H ( z) = 3
2
z (1.6497 ) z ( 3.6497 ) + z ( 2.3503) 0.3503 + z 3 (1.6497 ) + z 2 ( 0.24539 ) z ( 0.108223) 0.17681
3

H ( z) =

0.03429 z 3 + 3 z 2 + 3 z + 1
z 3 (1.6497 ) z 2 ( 3.6497 ) + z ( 2.3503) 0.3503 + z 3 (1.6497 ) + z 2 ( 0.24539) z ( 0.108223) 0.17681

H (z) =

0.03429 z 3 + 3 z 2 + 3 z + 1
z 3 (1.89509 ) z 2 ( 3.33572 ) + z ( 2.224207 ) 0.52711

H (z) =

z 3 ( 0.03429 ) + z 2 ( 0.10287 ) + z ( 0.10287 ) + 0.03429


z 3 (1.89509 ) z 2 ( 3.33572 ) + z ( 2.224207 ) 0.52711

Finalmente

Funcin de Matlab para el diseo de todo tipo


de filtros IIR
Analgicos:
function [B,A,n] =
iirafilt(type,fp,fs,Ap,As)
% [B,A] = function
iirdfilt(type,fp,fs,Ap,As)
%
% type es el tipo de filtro, 'butter',
'cheby1', 'cheby2'
% fp es la/las frecuencia/s de
pasabanda en Hz
% fs es la/las frecuencia/s de
parabanda en Hz
% Ap y As son las atenuaciones
respectivas en decibelios
if length(fp) ~= length(fs)
disp('Error en dimensiones de fp
y/o fs');
return
end
if Ap > As,
disp('Error en los valores de Ap
y/o As');
return;
end
% Determinar el tipo de filtro:
pasabajo, pasoalto, paabanda o
parabanda
if (length(fp) == 1)
if (fp < fs),
tipo = 'lp';
elseif (fp > fs)

tipo = 'hp';
else
disp('Frecuencia de pasabanda =
Frecuencia de parabanda');
return;
end
elseif (length(fp) == 2)
aux = [fp fs];
[aux1,i]=sort(aux);
if (i==[3 1 2 4])
tipo = 'bp';
elseif (i==[1 3 4 2])
tipo = 'bs';
else
disp('Error: Compruebe que los
valores de fp y fs estn en el orden
correcto');
return;
end
end
wp = 2*pi*fp;
ws = 2*pi*fs;
switch tipo
case 'lp',
switch type
case 'butter',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;
n =
log10(sqrt(aux/e2))/log10(ws/wp); n =
ceil(n);
wc = (1/e2)^(1/(2*n));
[Z,P,K]=buttap(n);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] =
lp2lp(Ban,Aan,wc*wp);
case 'cheby1',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;

n =
acosh(sqrt(aux/e2))/acosh(ws/wp); n =
ceil(n);
[Z,P,K]=cheb1ap(n,Ap);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] = lp2lp(Ban,Aan,wp);
case 'cheby2',
e2 = 1/(10^(0.1*As)-1);
aux = 10^(0.1*Ap)-1;
n = acosh(sqrt(1/
(aux*e2)))/acosh(ws/wp); n = ceil(n);
[Z,P,K]=cheb2ap(n,As);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] = lp2lp(Ban,Aan,ws);
end
case 'hp',
wp = 1/wp;
ws = 1/ws;
switch type
case 'butter',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;
n =
log10(sqrt(aux/e2))/log10(ws/wp); n =
ceil(n);
wc = (1/e2)^(1/(2*n));
[Z,P,K]=buttap(n);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] = lp2hp(Ban,Aan,1/
(wc*wp));
case 'cheby1',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;
n =
acosh(sqrt(aux/e2))/acosh(ws/wp); n =
ceil(n);
[Z,P,K]=cheb1ap(n,Ap);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] = lp2hp(Ban,Aan,1/wp);
case 'cheby2',
e2 = 1/(10^(0.1*As)-1);
aux = 10^(0.1*Ap)-1;
n = acosh(sqrt(1/
(aux*e2)))/acosh(ws/wp); n = ceil(n);
[Z,P,K]=cheb2ap(n,As);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] = lp2hp(Ban,Aan,1/ws);
end
case 'bp'
% Hay que pasar a pasobajo
las especificaciones
wx2 = wp(1)*wp(2);wx = sqrt(wx2);
if (ws(1)*ws(2) < wx2),
ws(1) = wx2/ws(2);
else
ws(2) = wx2/ws(1);
end
wp = wp(2)-wp(1);
ws = ws(2)-ws(1);

switch type
case 'butter',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;
n =
log10(sqrt(aux/e2))/log10(ws/wp); n =
ceil(n);
wc = (1/e2)^(1/(2*n));
[Z,P,K]=buttap(n);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] =
lp2bp(Ban,Aan,wx,wp*wc);
case 'cheby1',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;
n =
acosh(sqrt(aux/e2))/acosh(ws/wp); n =
ceil(n);
[Z,P,K]=cheb1ap(n,Ap);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] =
lp2bp(Ban,Aan,wx,wp);
case 'cheby2',
e2 = 1/(10^(0.1*As)-1);
aux = 10^(0.1*Ap)-1;
n = acosh(sqrt(1/
(aux*e2)))/acosh(ws/wp); n = ceil(n);
[Z,P,K]=cheb2ap(n,As);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] =
lp2bp(Ban,Aan,wx,ws);
end
case 'bs',
wx2 = ws(1)*ws(2);wx = sqrt(wx2);
if (wp(1)*wp(2) < wx2),
wp(1) = wx2/wp(2);
else
wp(2) = wx2/wp(1);
end
wp = 1/(wp(2)-wp(1));
ws = 1/(ws(2)-ws(1));
switch type
case 'butter',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;
n =
log10(sqrt(aux/e2))/log10(ws/wp); n =
ceil(n);
wc = (1/e2)^(1/(2*n));
[Z,P,K]=buttap(n);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] = lp2bs(Ban,Aan,wx,1/
(wp*wc));
case 'cheby1',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;

n =
acosh(sqrt(aux/e2))/acosh(ws/wp); n =
ceil(n);
[Z,P,K]=cheb1ap(n,Ap);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] =
lp2bs(Ban,Aan,wx,1/wp);
case 'cheby2',
e2 = 1/(10^(0.1*As)-1);
aux = 10^(0.1*Ap)-1;
n = acosh(sqrt(1/
(aux*e2)))/acosh(ws/wp); n = ceil(n);
[Z,P,K]=cheb2ap(n,As);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] =
lp2bs(Ban,Aan,wx,1/ws);
end
end

[H2,W]=freqs(Ban,Aan,500);
H2db = 20*log10(abs(H2));
figure;
if (length(fp) == 1)
plot(W/(2*pi),H2db,[fp fs],-[Ap
As],'*');grid;zoom;
else
plot(W/(2*pi),H2db,[fp fs],-[Ap Ap
As As],'*');grid;zoom;
end
A=Aan;
B=Ban;
return;

Funcin de Matlab para el diseo de todo tipo


de filtros IIR

% fm es la frecuencia de muestreo en
Hz
if length(fp) ~= length(fs)
disp('Error en dimensiones de fp
y/o fs');
return
end
if Ap > As,
disp('Error en los valores de Ap
y/o As');
return;
end
% Determinar el tipo de filtro:
pasabajo, pasoalto, paabanda o
parabanda
if (length(fp) == 1)
if (fp < fs),
tipo = 'lp';
elseif (fp > fs)
tipo = 'hp';
else
disp('Frecuencia de pasabanda =
Frecuencia de parabanda');
return;
end
elseif (length(fp) == 2)
aux = [fp fs];
[aux1,i]=sort(aux);
if (i==[3 1 2 4])
tipo = 'bp';
elseif (i==[1 3 4 2])
tipo = 'bs';
else
disp('Error: Compruebe que los
valores de fp y fs estn en el orden
correcto');
return;
end
end

Digitales:
function [Bd,Ad,n] =
iirdfilt(type,fp,fs,Ap,As,fm)

% Predistorsin para la Transformacin


bilineal
wp = 2*tan(2*pi*fp/(2*fm));
ws = 2*tan(2*pi*fs/(2*fm));

% [B,A] = function
iirdfilt(type,fp,fs,Ap,As,fm)
%
% type es el tipo de filtro, 'butter',
'cheby1', 'cheby2'
% fp es la/las frecuencia/s de
pasabanda en Hz
% fs es la/las frecuencia/s de
parabanda en Hz
% Ap y As son las atenuaciones
respectivas en decibelios

switch tipo
case 'lp',
switch type
case 'butter',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;
n =
log10(sqrt(aux/e2))/log10(ws/wp); n =
ceil(n);
wc = (1/e2)^(1/(2*n));

[Z,P,K]=buttap(n);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] =
lp2lp(Ban,Aan,wc*wp);
[Bd,Ad]=bilinear(Ban,Aan,1);
case 'cheby1',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;
n =
acosh(sqrt(aux/e2))/acosh(ws/wp); n =
ceil(n);
[Z,P,K]=cheb1ap(n,Ap);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] = lp2lp(Ban,Aan,wp);
[Bd,Ad]=bilinear(Ban,Aan,1);
case 'cheby2',
e2 = 1/(10^(0.1*As)-1);
aux = 10^(0.1*Ap)-1;
n = acosh(sqrt(1/
(aux*e2)))/acosh(ws/wp); n = ceil(n);
[Z,P,K]=cheb2ap(n,As);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] = lp2lp(Ban,Aan,ws);
[Bd,Ad]=bilinear(Ban,Aan,1);
end
case 'hp',
wp = 1/wp;
ws = 1/ws;
switch type
case 'butter',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;
n =
log10(sqrt(aux/e2))/log10(ws/wp); n =
ceil(n);
wc = (1/e2)^(1/(2*n));
[Z,P,K]=buttap(n);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] = lp2hp(Ban,Aan,1/
(wc*wp));
[Bd,Ad]=bilinear(Ban,Aan,1);
case 'cheby1',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;
n =
acosh(sqrt(aux/e2))/acosh(ws/wp); n =
ceil(n);
[Z,P,K]=cheb1ap(n,Ap);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] = lp2hp(Ban,Aan,1/wp);
[Bd,Ad]=bilinear(Ban,Aan,1);
case 'cheby2',
e2 = 1/(10^(0.1*As)-1);
aux = 10^(0.1*Ap)-1;
n = acosh(sqrt(1/
(aux*e2)))/acosh(ws/wp); n = ceil(n);
[Z,P,K]=cheb2ap(n,As);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] = lp2hp(Ban,Aan,1/ws);

[Bd,Ad]=bilinear(Ban,Aan,1);
end
case 'bp'
% Hay que pasar a pasobajo
las especificaciones
wx2 = wp(1)*wp(2);wx = sqrt(wx2);
if (ws(1)*ws(2) < wx2),
ws(1) = wx2/ws(2);
else
ws(2) = wx2/ws(1);
end
wp = wp(2)-wp(1);
ws = ws(2)-ws(1);
switch type
case 'butter',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;
n =
log10(sqrt(aux/e2))/log10(ws/wp); n =
ceil(n);
wc = (1/e2)^(1/(2*n));
[Z,P,K]=buttap(n);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] =
lp2bp(Ban,Aan,wx,wp*wc);
[Bd,Ad]=bilinear(Ban,Aan,1);
case 'cheby1',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;
n =
acosh(sqrt(aux/e2))/acosh(ws/wp); n =
ceil(n);
[Z,P,K]=cheb1ap(n,Ap);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] =
lp2bp(Ban,Aan,wx,wp);
[Bd,Ad]=bilinear(Ban,Aan,1);
case 'cheby2',
e2 = 1/(10^(0.1*As)-1);
aux = 10^(0.1*Ap)-1;
n = acosh(sqrt(1/
(aux*e2)))/acosh(ws/wp); n = ceil(n);
[Z,P,K]=cheb2ap(n,As);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] =
lp2bp(Ban,Aan,wx,ws);
[Bd,Ad]=bilinear(Ban,Aan,1);
end
case 'bs',
wx2 = ws(1)*ws(2);wx = sqrt(wx2);
if (wp(1)*wp(2) < wx2),
wp(1) = wx2/wp(2);
else
wp(2) = wx2/wp(1);
end
wp = 1/(wp(2)-wp(1));
ws = 1/(ws(2)-ws(1));

switch type
case 'butter',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;
n =
log10(sqrt(aux/e2))/log10(ws/wp); n =
ceil(n);
wc = (1/e2)^(1/(2*n));
[Z,P,K]=buttap(n);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] = lp2bs(Ban,Aan,wx,1/
(wp*wc));
[Bd,Ad]=bilinear(Ban,Aan,1);
case 'cheby1',
e2 = 10^(0.1*Ap)-1;
aux = 10^(0.1*As)-1;
n =
acosh(sqrt(aux/e2))/acosh(ws/wp); n =
ceil(n);
[Z,P,K]=cheb1ap(n,Ap);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] =
lp2bs(Ban,Aan,wx,1/wp);
[Bd,Ad]=bilinear(Ban,Aan,1);
case 'cheby2',
e2 = 1/(10^(0.1*As)-1);

aux = 10^(0.1*Ap)-1;
n = acosh(sqrt(1/
(aux*e2)))/acosh(ws/wp); n = ceil(n);
[Z,P,K]=cheb2ap(n,As);
[Ban,Aan]=zp2tf(Z,P,K);
[Ban,Aan] =
lp2bs(Ban,Aan,wx,1/ws);
[Bd,Ad]=bilinear(Ban,Aan,1);
end
end
[H2,F]=freqz(Bd,Ad,500,fm);
H2db = 20*log10(abs(H2));
if (length(fp) == 1)
figure;plot(F,H2db,[fp fs],-[Ap
As],'*');grid;zoom;
else
figure;plot(F,H2db,[fp fs],-[Ap Ap
As As],'*');grid;zoom;
end
return;

También podría gustarte