Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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
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
0.03429( z + 1)
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) =
Finalmente
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;
% 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)
% [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;