%---------------------------------------------------------------- % band_stop2n3dB es un programa integrable al entorno Matlab % trata del diseño de un filtro activo de dos secciones % bicuadrads en cascada. % % Se trata del diseño de un filtro de banda eliminada en una % configuración con polos Butterworth n=2, siendo ambas secciones % estructuras Boctor. % Nosotros pondremos primero la sección bicuadrada LPN y en % segundo lugar la sección HPN ya que esta última proveerá una % ganancia adicional para solventar la escasa ganancia de la % primera etapa y así no saturar dicha etapa LPN, además el Q % de ambas etapas es idéntico en base al algoritmo de Geffe. % % SIGFREDO PAGEL % Septiembre 2015 % % --------------------------------------------------------------- close all; clear all; % w=0:0.01:2000; % barrido en frecuencia para el "plot" w1 = 800; w2 = 1250; w0 = sqrt(w1*w2); w_central = w0; % Coincide con w_infinito en este caso ancho_banda = w2-w1; n=2; % H_db = GananciaFiltro_dB; H_dB = 3 % 3dB hn = 10^((H_dB/n)/20) % repartición por sección en valores naturales % sitodas las secciones tuvieran la % misma ganancia alfa = 0.707; beta=0.707; % qe = w_central/ancho_banda; C = alfa*alfa + beta*beta; D = alfa/(qe*C); E = beta/(qe*C); F=(E^2)-(D^2)+4; G = sqrt ((F/2) + sqrt(((F^2)/4)+((D^2)*(E^2)))); H=D*E/G; K=(1/2)*sqrt(((D+H)^2)+((E+G)^2)); Q = K/(D+H); disp ( sprintf (' ')) disp ( sprintf (' PARÁMETROS GEFFE ')) disp ( sprintf (' ' )) disp ( sprintf (' C = %-11.6g D = %-11.6g E = %-11.6g F = %-11.6g', C, D, E, F) ) disp ( sprintf (' G = %-11.6g H = %-11.6g K = %-11.6g Q = %-11.6g', G, H, K, Q) ) disp ( sprintf (' ' ) ) disp(' ') wres1 = w_central/K; wres2 = w_central*K; % %--------------------------- FIN GEFFE ---------------------------- % % %--------------------------- POLO DOBLE --------------------------- % %-------------------------- SECCIÓN 1 LPN ------------------------- % % Boctor_lpn_test % % ------------------------- Las pulsaciones ----------------------- % wr0 = wres1; wz0 = w_central; wz = wz0/wr0; wr = wr0/wr0; % % valores normalizados para que wz=1 % *** Algoritmo de Cioffi *** % Nota: desarrollado por John Cioffi % en la Universidad de Illinois % % adoptamos un valor de k1 tal que: % (wr/wz)^2 < k1 < 1 ; % 0.9256 < k1 < 1 --> adoptamos 0.95 k1 = 0.95; R24 = 1; % establecemos este valor que luego % será desnormalizado R4 = 1/k1; % " % R24 = 1/(1/R2 + 1/R4), de donde: % R24 = 1/(1/R2 + k1); R2 = 1/(1-k1); R5 = 1; R6 = 1; % establecemos R5 = R6 = 1 % wr = 1/(sqrt(r4*R6*C1*C2) wr=1; % de donde C1*C2 = 1 % % wz = sqrt((R1+R24+R6)/(R1*R24*R6*C1*C2)); % operando wz = sqrt((R1+2)/(R1*k1)); R1 = 2/(k1*wz^2 - 1); C2 = 2*Q; C1 = k1/(2*Q); R3 = (1/2)*((k1/Q^2)+ k1*wz^2 - 1); % h = R5/(R3 + R5) la ganacia hf % h = 1/((k1/Q^2)+ k1*wz^2 + 1); % % Ganancia_BF % Tbf = h*(wz^2/wr^2); % T(0) % Thf = R5/(R3 + R5); % T(inf) % % ------------- desnormalización en frecuencia ------------- wz = wz*wr0; wr = wr*wr0; % % -------------- Desnormalización en impedancia ------------ kz = 10000; kw = wr0; R1 = kz*R1; R2 = kz*R2; R3 = kz*R3; R4 = kz*R4; R5 = kz*R5; R6 = kz*R6; C1 = C1/(kz*kw); C2 = C2/(kz*kw); R24 = (R4*R2)/(R4+R2); h1 = (R5/(R3 + R5)); % % disp ( sprintf (' ' )) disp(' ------------- SECCIÓN 1 -------------') disp(' ') disp ( sprintf (' R1 = %-11.6g C1 = %-11.6g ', R1, C1) ) disp ( sprintf (' R2 = %-11.6g C2 = %-11.6g ', R2, C2) ) disp ( sprintf (' R3 = %-11.6g Q = %-11.6g ', R3, Q) ) disp ( sprintf (' R4 = %-11.6g wz = %-11.6g ', R4, wz ) ) disp ( sprintf (' R5 = %-11.6g wr = %-11.6g ', R5, wr ) ) disp ( sprintf (' R6 = %-11.6g h1 = %-11.6g ', R6, h1 ) ) disp('---------------------------------------') disp(' ') % % ---------------------- Valores verificados --------------------- % wz = sqrt((R1 + R24 + R6)/(R1*R24*R6*C1*C2)); wr = sqrt(1/(R4*R6*C1*C2)); a1 = 1/(R6*C2) + 1/(R24*C2) ; b1 = 1/(R6*C2) + 1/(R24*C2) + 1/(R1*C1) - (1/(R6*C1))*(R3/R5); disp(' ') disp('--------------- Verificación Sección 1 ----------------') disp(' ') disp ( sprintf (' wz = %-11.6g b1 = %-11.6g b0 = %-11.6g ', wz, b1, wz^2) ) disp ( sprintf (' wr = %-11.6g a1 = %-11.6g a0 = %-11.6g ', wr, a1, wr^2) ) disp('--------------------------------------------------------') disp(' ') %---------------------------- TRANSFERENCIA 1 -------------------------') s=j*w; num = (R5/(R3 + R5))*(s.*s + wz^2); den = s.*s + a1*s + wr^2; warning off; % --------------------------------------------------------------------- transferencia1 = 20*log10(abs(num./den)); figure; plot(w,transferencia1,'-','color',[1 0.4 0],'linewidth',1) xlabel ('Pulsación (rad/s)') ylabel ('| T(jw) | (dB)') title ('Respuesta Sección 1') axis([0 2000 -40 10]) grid hold on %-------------------------- SECCIÓN 2 HPN ------------------------- % % Boctor_hpn_test % % ------------------------- Las pulsaciones ----------------------- % wr0 = 1174.02; % Proviene de Geffe wz0 = 1000; % Es un dato especificado wz = wz0/wr0; wr = wr0/wr0; % El valor del Q lo establece el algoritmo % de Geffe y no requiere ser mencionado aquí. % valores normalizados g = (Q*(1-wz^2))^-1; a = (g^2 - 1)/(1 + g^2*wz^2); h2 = hn^n/h1; % En este caso la etapa 2 deberá asumir % las carencias de la etapa 1, al ser % una formación de sólo 2 etapas será % h*hs1 = hn^2, siendo "hn" la ganancia % por etapa requerida para satisfacer % la ganancia global del filtro de 3 dB. R1 = ((1+a)/(a*g*wz))^2; R2 = 1; R3 = h2*((1+a)^2)/(a*g^2); R4 = (h2/(h2-1))*a^-1; R5 = h2/a; R6 = (h2*(1+a)^2)/((a*g^2)*(h2*(1+a-(a*wz^2))-1)); C = a*g/(1+a); C1 = C; C2 = C; % % desnormalización en frecuencia wz = wz*wr0; wr = wr*wr0; % % Desnormalización en impedancia km = 10000; kf = wr0; R1 = km*R1; R2 = km*R2; R3 = km*R3; R4 = km*R4; R5 = km*R5; R6 = km*R6; R45 = (R4*R5)/(R4+R5); % % Desnormalización en impedancia y frecuencia C = C/(km*kf); C1 = C; C2 = C; h2 = (R5/R45); % % ----------- Impresión de parámetros Etapa 2 ----------- % disp ( sprintf (' ' )) disp ( sprintf (' ' )) disp(' ------------- SECCIÓN 2 -------------') disp(' ') disp ( sprintf (' R1 = %-11.6g C1 = %-11.6g ', R1, C1 ) ) disp ( sprintf (' R2 = %-11.6g C2 = %-11.6g ', R2, C2 ) ) disp ( sprintf (' R3 = %-11.6g Q = %-11.6g ', R3, Q ) ) disp ( sprintf (' R4 = %-11.6g wz = %-11.6g ', R4, wz ) ) disp ( sprintf (' R5 = %-11.6g wr = %-11.6g ', R5, wr ) ) disp ( sprintf (' R6 = %-11.6g h2 = %-11.6g ', R6, h2) ) disp('---------------------------------------') disp(' ') pause % % ------------ Valores verificados Etapa 2 -------------- wz = sqrt((R1*R2*C*C)^-1); wr = sqrt((R2*C1*C2)^-1 *((1/R1) + (1/R6) - R5/(R3*R4))); a1 = 1/(R1*C1) + 1/(R2*C2) + 1/(R6*C1) - (R5/(R3*C1))*(1/R2 +1/R4); R45=(R4*R5)/(R4+R5); b1 = (1/(R1*C1)) + (1/(R2*C2)) - ((R45/(R2*C1))*((1/R3) + (1/R6))); disp(' ') disp('------------------- Verificación Sección 2 ------------------') disp(' ') disp ( sprintf (' wz = %-11.6g b1 = %-11.6g b0 = %-11.6g ', wz, b1, wz^2) ) disp ( sprintf (' wr = %-11.6g a1 = %-11.6g a0 = %-11.6g ', wr, a1, wr^2) ) disp('-------------------------------------------------------------- ') disp(' ') %------------------------------ TRANSFERENCIA -------------------------') s=j*w; num2 = (R5/R45)*(s.*s + wz^2); den2 = s.*s + a1*s + wr^2; warning off; % --------------------------------------------------------------------- transferencia2 = 20*log10(abs(num2./den2)); % plot(w,transferencia2,'-','color',[1 0 1],'linewidth',1) grid on xlabel ('Pulsación (rad/s)') ylabel ('| T(jw) | (dB)') title ('Respuesta Sección 1 & 2') axis([0 2000 -40 10]) hold on pause T = transferencia1 + transferencia2; % ----------------- plot(w,respuesta)------------------ % plot(w,T,'-','color',[0.2 0.4 0.6],'linewidth',2) grid on xlabel ('Pulsación (rad/s)') ylabel ('| T(jw) | (dB)') title ('Respuesta del filtro') axis([0 2000 -40 10]) pause hold off clf % % -------------- plot sólo curva final ----------------- % plot(w , T,'-','color',[1 .1 .6],'linewidth',2) xlabel ('Pulsación (rad/s)') ylabel ('| T(jw) | (dB)') title ('Respuesta final del filtro') axis([0 2000 -40 10]) grid minor