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 están 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;