domingo, 29 de abril de 2012

Filtros activos en Matlab!

Un filtro electrónico es un circuito que permite dejar pasar cierta gama de frecuencias, bloqueando las que no interesan; de ahí el término "filtro". En el post anterior vimos cómo se puede sacar la función de transferencia de un circuito, que resultó ser un filtro pasa bajas. Los filtros de ese estilo son denominados filtros pasivos. Esto quiere decir que únicamente está formado por elementos pasivos como resistencias, capacitores e inductores. Sin embargo, estos no son los únicos componentes con los cuales se pueden construir los filtros. También se pueden construir con transistores, amplificadores operacionales, etc. A los filtros construidos con este tipo de componentes se les denominan filtros activos. Una de las ventajas que poseen este tipo de filtros con respecto a los pasivos es que pueden llegar a ser muy selectivos, además de que a la salida se le puede implementar una ganancia. Por supuesto la ausencia de Facebook en tiempos de antaño provocó que la gente no perdiera el tiempo y se pusiera a jugar con estos filtros. A lo que llegaron estas personas es a diferentes tipos de filtros con diferentes características. Algunos de estos eran de respuesta "plana", pero poco selectivos, mientras que otros tenían "rizos" pero con una pendiente de corte extremadamente grande. Los más populares (o por lo menos los que les encantan a los profes) son el Butterworth, el Chebyshev y el Bessel, cada uno con diferentes características como las que acabo de mencionar. Sin embargo, estos filtros están basados en una especie de célula que se denomina topología, que es simplemente la manera en la que están acomodados los componentes. Una de las más populares es la topología Sallen-Key, que es la que vamos a ver ahorita. 
En esta ocasión analizaremos un filtro tipo pasa altas. Estos filtros, como su nombre lo indica, dejan pasar frecuencias altas, rechazando las frecuencias bajas (según nuestro criterio, por su puesto). En la siguiente imagen se puede ver el esquemático del filtro.



Para analizar este tipo de filtros se debe obtener su función de transferencia, pues su funcionamiento no es tan evidente como el del circuito anterior. El procedimiento para obtener la función de transferencia de los filtros activos es muy parecido al procedimiento usado la vez anterior. Se deben convertir los componentes al dominio de la frecuencia, obtener las ecuaciones de nodo y resolverlas. La única diferencia es que se deben considerar las características del componente activo al momento de obtener las ecuaciones de nodo. Dicho esto,
¡¡Comencemos!!

Paso 1
En este paso haremos una transformación pasando los componentes pasivos del dominio del tiempo al dominio de la frecuencia, que es donde la función de transferencia sirve. En otro post podré con detalle cómo se obtienen estas relaciones, pero por el momento créanme lo siguiente



Donde S es igual a jω, si es que vamos a estar trabajando con señales senoidales (Déjenlo en S por lo pronto) y R y C son la resistencia y la capacitancia, respectivamente. Por cierto, Z significa reactancia o impedancia (son diferentes cosas, pero por el momento hagamos de cuenta que son sinónimos).
Ahora que ya hemos pasado todos los componentes a reactancias, podremos redibujar el circuito como se muestra a continuación
Genial! Ya hemos completado el paso 1

Paso 2
Ya que tenemos nuestro circuito en el dominio de la frecuencia, podemos obtener las ecuaciones de nodo (Nota: las leyes de Kirchhoff, la ley de Ohm, Thévenin y todo eso es válido también con circuitos en el dominio de la frecuencia). Para esto hay que identificar los nodos primero.

Ya que tenemos identificados los nodos, podemos obtener las ecuaciones de cada uno.
Para el nodo 1 tenemos que


El nodo 2 está conectado a la entrada no inversora del Op-amp, y dado que idealmente tiene impedancia infinita, tenemos la siguiente ecuación.


El nodo 3 está conectado a la entrada inversora del Op-amp, y además de tener impedancia infinita resulta que existe un corto virtual entre las entradas inversora y no inversora. Esto quiere decir que el voltaje en el nodo 3 es el mismo que el voltaje en el nodo 2, lo que da como resultado que V2 = V3. Esto provoca que tengamos la siguiente ecuación



Para el nodo 4 tenemos que... un momento! En las ecuaciones que tenemos ya estamos considerando todos los voltajes que hay en todos los nodos que hay en el circuito! Eso significa que la ecuación que obtendríamos del nodo 4 ya no serviría de nada, puesto que ya tenemos todo lo que necesitamos! Yay!! :D

Paso 3
Ya que hemos obtenido las ecuaciones de nodo necesarias del circuito, podemos proceder a calcular la Función de transferencia!!
La función de transferencia de un circuito eléctrico se calcula mediante la relación que existe entre el voltaje de salida y el voltaje de entrada, dada por la siguiente ecuación:

Si somos observadores, podemos ver que en nuestras ecuaciones tenemos tanto Vo como Vi, por lo que sólo necesitamos obtener Vo de estas ecuaciones y dividirlo entre Vi! Suena fácil, no? Pues en efecto es muy sencillo siempre y cuando tengas uno de estos aparatitos mágicos llamados computadoras que hacen el trabajo duro por nosotros mientras vemos 9gag o una película. De otro modo se tendrían que "chutar" los despejes y las sustituciones a manita y eso no es de Dios. Pero por suerte nosotros sí poseemos la magia de la tecnología moderna que nos facilitará la vida inmensamente.
Lo primero que tenemos que hacer es abrir Matlab y (lo recomiendo ampliamente) crear un nuevo Script. Tendrán una ventana como la siguiente.


Se parece mucho al Bloc de notas, pero créanme que esto es mucho más cool ;D
Comencemos despejando el terreno y declarando las variables que vamos a utilizar (usamos variables simbólcas, por eso las tenemos que declarar). esto se hace así

    clear
    clc
    syms z1 z2 z3 z4 z5 z6 vi vo v1 v2 v3 r1 r2 r3 r4 c1 c2 s;

Ya que hemos declarado las variables, comencemos con la ecuación del primer nodo.

    %Ecuación del nodo 1
  eq1=((vi-v1)/z1)-((v1-v2)/z2)-((v1-vo)./z4);


De esta ecuación, despejamos v1 para sustituirla en la ecuación del nodo 2. Esto se hace así

    %Despejar v1
  v1=solve(eq1, v1);

Ya que tenemos v1, podemos escribir la ecuación 2 y resolverla para v2 (despejar v2)

    %Ecuación del nodo 2
  eq2=((v1-v2)/z2)-(v2/z3);
   %Despejar v2
  v2=solve(eq2, v2);

Por último, escribiremos la ecuación 3 y la resolveremos para Vo

  %Ecuación del nodo 3
  eq3=(v2/z5)+((v2-vo)/z6);
  %Despejar vo
  vo=simple(solve(eq3, vo))


Nota: la función simple() se utiliza para simplificar funciones simbólicas y que no se vean tan monstruosas.
Si ejecutamos este código, obtenemos lo siguiente

  vo =

  (vi*z3*z4*(z5 + z6))/(z1*(z2*z5 - z3*z6 + z4*z5) + z2*z4*z5 +  z3*z4*z5)


Ahora lo que resta es dividirlo entre Vi y sustituir las reactancias por las resistencias y capacitancias. Esto se hace así


  %Función de transferencia
  Hs=factor(simple(vo/vi))

  %Sustitución por los valores
  z3=r1;
  z4=r2;
  z5=r3;
  z6=r4;
  z1=1/(s*c1);
  z2=1/(s*c2);

  %Función de transferencia final
  disp('La función de transferencia es')
  Hs=collect(simple(subs(Hs)), s);
  pretty(Hs)


La función factor() se utiliza para factorizar lo más posible una función simbólica. La función disp() puede hacer que despliegue tanto un texto como alguna variable, pero no ambas a la vez. La función subs() hace la sustitución de los valores. La función collect() hace factorización por factor común la variable que nosotros indiquemos. Por últmo, la función pretty() hace que se vea bonito (al muy propio estilo de Matlab) una función simbólica.
Si corremos el código completo, lo que matlab nos dirá es

La función de transferencia es

                                                2 
             (c1 c2 r1 r2 r3 + c1 c2 r1 r2 r4) s 
  ----------------------------------------------------------- 
                  2 
  c1 c2 r1 r2 r3 s  + (c1 r2 r3 - c2 r1 r4 + c2 r2 r3) s + r3



Vivaa! Ya tenemos nuestra función de transferencia! :D
En el siguiente Post mostraré como hacerle para que de esta misma función que nos regresa Matlab, podamos dibujar diagramas de bode y demás. 
Si me equivoqué en algo, díganmelo :D
Por cierto, el código usado en Matlab se los dejo aquí. http://bit.ly/IjD7O2