Autor Tema: Ejemplos de filtros digitales con DSPIC30F4011  (Leído 24880 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado beatAurex1

  • PIC12
  • **
  • Mensajes: 78
    • Proyectos de Ingeniera -Control-Electrónica y desarrollo embebido.
Ejemplos de filtros digitales con DSPIC30F4011
« en: 05 de Enero de 2010, 06:10:07 »
Saludos al a comunidad.

Aqui ire subiendo unos ejemplos sobre el diseño e implementacion de filtros digitales IIR(Butterworth) en  un dspic 30f4011 asi como los resultados.

Desconectado ema

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1078
Re: Ejemplos de filtros digitales con DSPIC30F4011
« Respuesta #1 en: 05 de Enero de 2010, 15:21:01 »
 :-/ :-/ esperamos ansiosos estos valiosos aportes....

Saludos

Desconectado victorg_ldj

  • PIC10
  • *
  • Mensajes: 4
Re: Ejemplos de filtros digitales con DSPIC30F4011
« Respuesta #2 en: 26 de Enero de 2010, 03:29:09 »
Camarada veo que usas filtro digital con dspic una pregunta cual es el rango que debe tener mi señal de entrada.

Necesito adecuar la señal de la guitarra para filtrarla pero no consigo esa especificacion. Tratare de publicar algunas cosas estoy trabajando con 30f4013

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Ejemplos de filtros digitales con DSPIC30F4011
« Respuesta #3 en: 26 de Enero de 2010, 08:01:41 »
Donde estan los ejemplos?? :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado beatAurex1

  • PIC12
  • **
  • Mensajes: 78
    • Proyectos de Ingeniera -Control-Electrónica y desarrollo embebido.
Re: Ejemplos de filtros digitales con DSPIC30F4011
« Respuesta #4 en: 26 de Enero de 2010, 19:58:20 »
Y a aqui estan sorry.

 :oops:


Bueno Primero algo de teoria muy sencilla.

Los filtros están hechos para pasar algunas frecuencias de ciertas señales o detener otras.

Ambos filtros tanto analógicos como filtros digitales pueden ser considerados como una caja negra, con una señal de entrada y otra de salida

Tipos de filtros digitales.

Este tipo de filtros son usados para remplazar un filtro analógico, procesan la señal en el dominio del tiempo,
 donde las señales analógicas primero deben de ser muestreadas y digitalizadas en intervalos discretos usando un
convertidor analógico digital.


Ahí que tener precaución con este tipo de filtros debido a que la señal analógica es  muestreada 
ocasionando el efecto  de alaising, este ocurre cuando la señal analógica tiene un espectro de energía
a frecuencias cercanas a media frecuencia de muestreo, ocasionando que sea imposible recobrar
 la señal original cuando se quiere convertir de vuelta a  analógica.
Para
prevenir este efecto se debe filtrar la señal con una frecuenta mayor a la de filtrado.


Ahí dos tipos de filtros digitales : Filtros de respuesta al impulso finito (FIR) que son filtros 
no recursivos, y filtros de respuesta al impulso infinito( IIR) los cuales son recursivos debido a que
 parte de la señal de salida  se usa para realimentar la entrada.


Se dice que los filtros IIR son sensibles a los coeficientes del filtro usado para multiplicar factores,
debido a que al truncar los coeficientes puede resultar en una realimentación  positiva causando
oscilación, aparte de tener una respuesta de fase no lineal.

Método de diseño.

La mayoría de los filtros IIR son diseñados usando el modelo de un filtro analógico, entre los cuales  tenemos a  los tipo Butterworth, Chebyshev, Cauer(eliptico) y Chebyshev Inverso

Los ejemplos solo seran del tipo Butterworth


Una forma es usando la transformacion Bilineal usada para convertir la respuesta en frecuencia analógica a una respuesta en el dominio digital.

Donde para pasar del plano s --> a Z tenemos

\s = \frac{1-z^{-1}}{1+z^{-1}}


Los filtros Basicos IIR estan basados en  una estructura bicuadratica  con elementos de retraso  denotados como   
\z^{-1}
el cual  se encuentra en la función de transferencia de forma general denotada como:

\H(z)=\frac{A0+A1z^{-1}+A2z^{-2}...}{1-B1z^{-1}-B2z^{-2}...}
  ...1

Y su esctructura Bicadratica a manera de bloques es


Para el diseño de filtros de mas alto orden se diseñan mediante etapas bi-cuadráticas en cascada, donde cada una da una respuesta de segundo orden.

Por ejemplo si se requiere diseñar un filtro de orden 4 se usarían dos etapas bi-cuadráticas en serie.

Si se quisiera diseñar un filtro pasabajos de orden impar este  requeriría de una o mas etapas  de segundo orden , seguidas por la etapa de orden 1. Donde la etapa de primer orden es simplemente un retraso  con un coeficiente de retroalimentación como el que se muestra a continuación.


Donde la sección de primer orden  es lo mismo que las secciones bi-cuadráticas con coeficientes A1,A2 y B2 

Filtros Butterworth


Predeformación

Desafortunadamente  la transformación bilineal es una aproximación que no produce exactamente la respuesta en frecuencia requerida y se produce una distorsión por lo cual se modifica la transformación bilineal antes de aplicar la transformación  a H(s).

Esto lo podemos resumir en la siguiente tabla


Diseño de un filtro  Pasa-Bajos

Diseñar un filtro IIR pasa-bajos de segundo orden con una banda de paso de 3.4 Khz y una frecuencia de muestreo de 8kHz.

Por lo que para  la función de transferencia  analógica de un filtro butterworth de 2do orden esta dado por


La frecuencia de corte normalizada debido a la predeformación esta dada por.


Y la nueva transformación bilineal con la predeformación viene dada por la siguiente ecuación.


Usando las formulas de la tabla anteior
tenemos que


Y sustituyendo en la funcion de transferencia de segundo orden y reacomodando como en 1


A0=0.7157374
A1=1.4314748
A2=0.7157374
B1= 1.3489677
B2=  0.05139818

Donde
/z^{-1}
  representa n- retrasos de tiempo

Por lo que la ecuación en diferencias  es:



Desconectado beatAurex1

  • PIC12
  • **
  • Mensajes: 78
    • Proyectos de Ingeniera -Control-Electrónica y desarrollo embebido.
Re: Ejemplos de filtros digitales con DSPIC30F4011
« Respuesta #5 en: 26 de Enero de 2010, 20:22:46 »
Metodo Dos

Diseño Mediante Matlab

Matlab nos brinda la facilidad de poder realizar todo el calculo algebraico y proporcionarnos únicamente los coeficientes ya sea de un filtro analógico o digital  mediante los siguientes comandos.

[A,B] = BUTTER(N,Wn,'tipo de filtro')  

A, B son los coeficientes del filtro digital

N= Orden del filtro
Wn= frecuencia de corte normalizada


Usando el comando visto y los datos de diseño del ejemplo anterior tenemos.

N=2

y


Que son los ceoficientes que obtuvimos anteriormente.

Obtención de la respuesta en frecuencia del filtro

Para la respuesta en frecuencia del filtro digital empleamos el comando freqz

FREQZ(A,B,F,Fs)
F (in Hz),  frecuencia a probar(Hz)
Fs = frecuencia de muestreo (en Hz).

Freqz(A,B,5000,8000)




Implementación de Filtros Digitales.


El Diagrama de bloques básico de un filtro digital es el siguiente


Acondicionamiento de la señal


Para acoplar la señal de entrada se ha hecho uso de amplificadores operacionales para agregarle un ofsset de DC y reducirla a tensiones en un rango de 0 [V] para –Vcc y 5 [V] para +Vcc.


Donde el potenciómetro RV1 ajusta el offset de DC y RV2 ajusta la amplitud de la señal.

Y para la reconstrucción de la  Señal de Salida se hará uso de  un DAC de  8 bits (DAC0800).  Cuyo circuito es el siguiente.


Tomando en cuenta que la señal de entrada es de 20 Vpp tenemos que nuestra tensión de entrada en cualquier momento es


Programación del Filtro Digital  hasta aqui le dejo pendiente y al rato subo lo demas

Código: C
  1.  






« Última modificación: 26 de Enero de 2010, 21:10:05 por beatAurex1 »

Desconectado JOJOJORGE5

  • PIC16
  • ***
  • Mensajes: 167
Re: Ejemplos de filtros digitales con DSPIC30F4011
« Respuesta #6 en: 26 de Enero de 2010, 21:59:08 »
Wow exelente aporte :shock: :shock:

espero que no sea el ultimo y sigas continuando con la explicacion.

salu2:)

Desconectado beatAurex1

  • PIC12
  • **
  • Mensajes: 78
    • Proyectos de Ingeniera -Control-Electrónica y desarrollo embebido.
Re: Ejemplos de filtros digitales con DSPIC30F4011
« Respuesta #7 en: 27 de Enero de 2010, 02:12:57 »
Antes de continuar se me olvido mencionar que las funciones de transferencia analogicas se pueden encontrar en tablas, pongo aqui algunos libros de los que me base.

BIBLIOGRAFIA

Analog and Digital Filter Design 2
Newnes
STEVE WINDER

The Circuits and Filters Handbook
Second Edition 
Wai-Kai Chen – 2002

Programming 16-Bit PIC Microcontrollers in C
Newnes
Lucio Di Jasio

Desconectado beatAurex1

  • PIC12
  • **
  • Mensajes: 78
    • Proyectos de Ingeniera -Control-Electrónica y desarrollo embebido.
Re: Ejemplos de filtros digitales con DSPIC30F4011
« Respuesta #8 en: 04 de Febrero de 2010, 21:06:39 »
Aqui los ejemplos puesto que me habia quedado sin red.

Código: C
  1. #include <p30f4011.h>             // Incluye la libreria del dsPIC30F4013.
  2.  
  3. _FOSC(CSW_FSCM_OFF & XT_PLL16);   // Usamos  oscilador
  4.                                   // externo de 7.3728 MHZ,
  5.                                   // multiplicado por 16, obtenindo un
  6.                                   // reloj interno a 117.9648 MHZ.
  7.                                
  8. _FWDT(WDT_OFF);                   // Watchdog timer disabled.
  9. _FBORPOR(PBOR_OFF & MCLR_EN);     // Brown-out reset disabled,
  10.                                   // MCLR reset enabled.
  11. _FGS(CODE_PROT_OFF);
  12.  
  13. float VIK,VIK1,VIK2,VOK,VOK1,VOK2;    // Variables de entrada y salida.
  14. float COEF1,COEF2,COEF3,COEF4,COEF5;  // Constantes asociadas a la ecuación en difernecias.
  15. float TEMP1,TEMP2,TEMP3,TEMP4,TEMP5;  // Manejo temporal del datos.
  16.  
  17.  
  18. unsigned int Vobin8;
  19. unsigned int Vobin;
  20. unsigned int  Dato;
  21. float factor1;
  22.  
  23. /////////////////////////////////////////////////////////////////////////////////////
  24. // RUTINA PARA INICIALIZAR EL CONVETIDOR ANALÓGICO-DIGITAL CON "AN8" COMO ENTRADA. //
  25. /////////////////////////////////////////////////////////////////////////////////////
  26.  
  27.  
  28. void ADC12_INI()
  29. {
  30.         ADCON1=0x0000;                // FORM=0   dato es entero sin signo
  31.                                   // ASAM=0   (inicia muestreo cuando este bit
  32.                                   //           sea habilitado).
  33.         ADCHS=0x0008;                 //  canal de entrada es PB8/AN8.
  34.         ADCON3=0x0008;                // Muestreo manual con reloj interno = 8 TCY. 152.586ns
  35.     ADCON2=0x0000;
  36.         ADCON1bits.ADON=1;            //  convertidor A/D on
  37. }
  38.  
  39.  
  40. //////////////////////////////////////////////////////////////////////
  41. // RUTINA PARA TRANSMITIR POR EL CONVERTIDOR D/A LA Vo(k) OBTENIDA. //
  42. //////////////////////////////////////////////////////////////////////
  43. void Transmite(void)
  44. {
  45.         Vobin=12.8*(VOK+10);      
  46.         Vobin8=(Vobin>>2);
  47.         LATB=Vobin8;       //Entregamos al puerto B el dato que ira al DAC
  48.    
  49.                                    
  50. }
  51.  
  52. main()
  53. {
  54.         ADPCFG=0XFEFF;                //  Puerto B (RB0-RB7) están
  55.                                                                   // están en modo digital, con excepción del bit RB8 que
  56.                                   // esta en modo analógico Vi(k)
  57.                                   //
  58.         ADC12_INI();                  // Inicializa el convertidor A/D.
  59.  
  60. TRISBbits.TRISB0=0;          
  61.         TRISBbits.TRISB1=0;
  62.         TRISBbits.TRISB2=0;
  63.         TRISBbits.TRISB3=0;
  64.         TRISBbits.TRISB4=0;
  65.         TRISBbits.TRISB5=0;
  66.         TRISBbits.TRISB6=0;
  67.         TRISBbits.TRISB7=0;
  68.         TRISBbits.TRISB8=1;                       // Configura el bit RB8 como entrada para poder leer el
  69.                                                                   // canal AN0 del convertidor A/D
  70.  
  71.  
  72. /* Condiciones Iniciales del Filtro */
  73.         VIK   = 0.0;                  // Vi(k)   = 0.0
  74.         VIK1  = 0.0;                  // Vi(k-1) = 0.0
  75.         VIK2  = 0.0;                  // Vi(k-2) = 0.0
  76.         VOK   = 0.0;                  // Vo(k)   = 0.0
  77.         VOK1  = 0.0;                  // Vo(k-1) = 0.0
  78.         VOK2  = 0.0;                  // Vo(k-2) = 0.0
  79.         /* Declaracion de Coeficientes de la Ecuacion en Diferencias */
  80.         COEF1 = 0.7157374;          
  81.         COEF2 = 1.4314748;
  82.         COEF3 = 0.7157374;
  83.         COEF4 = 1.3489677;
  84.         COEF5 = 0.5139818;
  85.         factor1=.078431372;
  86.        
  87.         //y[n]=0.7157374*x[n]+1.4315748*x[n-1]+0.7157374*x[n-2]-1.348967*y[n-1]-0.5139818*y[n-2]
  88.  
  89. /* Inicio de un Loop infinito. */
  90.         for(;;)                        
  91.         {
  92.                 ADCON1bits.SAMP=1;              // Inicia muestreo del A/D.
  93.                 Delay_1us();                    // Tiempo para que se valide el muestreo
  94.                                                
  95.                 ADCON1bits.SAMP=0;              // Empieza la conversión
  96.                                                                                
  97.                 while(!ADCON1bits.DONE);        // Acabo la conversión A/D?
  98.                 Dato=ADCBUF0;                   // Lee el convertidor A/Dy lo almacena en la variable dato.
  99.        
  100.                
  101.                 VIK=(factor1*Dato)-10;        //Convertimos a [V]
  102.  
  103.                 /* Armado de la ecuación en diferencias */
  104.                 TEMP1=COEF1*VIK;        
  105.                 TEMP2=COEF2*VIK1;        
  106.                 TEMP3=COEF3*VIK2;        
  107.                 TEMP4=COEF4*VOK1;        
  108.                 TEMP5=COEF5*VOK2;        
  109.                 VOK=TEMP1+TEMP2+TEMP3-TEMP4-TEMP5;  
  110.  
  111.  
  112.  
  113.  
  114.                
  115.                 Transmite();                    // Transmite Dato por el convertidor D/A
  116.                
  117.                         // Actualización de entradas y salidas para la próxima iteración.
  118.                 VIK2=VIK1;                // Vi(k-1)------------>Vi(k-2)
  119.                 VIK1=VIK;                 // Vi(k)-------------->Vi(k-1)
  120.                 VOK2=VOK1;                // Vo(k-1)------------>Vo(k-2)
  121.                 VOK1=VOK;                 // Vo(k)-------------->Vo(k-1)
  122.        Delay_50us();
  123.                                                      
  124.         }
  125. }

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Ejemplos de filtros digitales con DSPIC30F4011
« Respuesta #9 en: 05 de Febrero de 2010, 14:01:55 »
Hola!

El ejemplo me parece bien ... pero ¿Cual es el tiempo de muestreo que considerarste para calcular el filtro y como considera el micro ese tiempo?

Saludos!
Control Automático, DSP & Microcontroladores

Desconectado beatAurex1

  • PIC12
  • **
  • Mensajes: 78
    • Proyectos de Ingeniera -Control-Electrónica y desarrollo embebido.
Re: Ejemplos de filtros digitales con DSPIC30F4011
« Respuesta #10 en: 05 de Febrero de 2010, 20:57:33 »
La frecuencia de muestreo es 8 Khz  o 125 us ( lo defini en el ejemplo) . con el mplab observe  cuanto tardaba desde que inicia el for  hasta  que entrega el dato al dac y actualiza  las entradas, y le sume 50 us mas para completar los 125us del tiempo  de muestreo, je este no es le metodo mas optimo es la primera vez que hago filtros digitales y uso algun dspic :(, pero tambien supongo que  podria hacer una interrupcion por timer cada 125 us para tomar el dato  .

Ah y si me olvidaba unos conceptos importantes referentes a la pregunta

La tasa o frecuencia de muestreo es el número de muestras por unidad de tiempo que se toman de una señal continua para producir una señal discreta, durante el proceso necesario para convertirla de analógica en digital.

Y aun mas importante

Teorema de muestreo de Nyquist-Shannon
Para poder replicar con exactitud la forma de una onda es necesario que la frecuencia de muestreo sea superior al doble de la máxima frecuencia a muestrear.  fuente wikipedia Teorema de Nyquist



Cualquier correcion o mejora al ejemplo es bienvenido.

Saludos
« Última modificación: 05 de Febrero de 2010, 21:05:14 por beatAurex1 »

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Ejemplos de filtros digitales con DSPIC30F4011
« Respuesta #11 en: 06 de Febrero de 2010, 11:53:15 »
Hola!

Si deberias usar una interrupcion, en vez de delays ... eso es un error muy comun.

El problema esta que los calculos en punto flotante no tienen un tiempo de ejecución fijo, por lo que el tiempo de muestreo siempre oscilará un poco, el efecto se verá en que el ancho de banda de 4kHz del sistema se aumentará o disminuirá ...

El efecto de ese diseño en audio nunca lo he investigado; sin embargo, en control automatico tiene el efecto de que el controlador solo funciona en determiandos intervalos acompañado (si el sistema es mecánico o en parte) de terribles vibraciones y en el peor caso entrar en resonancia e incontrolabilidad.

Tambien deberias considerar, el punto fijo en las operaciones, el dsPIC tiene instrucciones que son optimizadas para eso, tambien hay una libreria de operaciones.

Felicidades por tu interes y muy buen aporte.

Saludos!  
« Última modificación: 06 de Febrero de 2010, 11:56:04 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado beatAurex1

  • PIC12
  • **
  • Mensajes: 78
    • Proyectos de Ingeniera -Control-Electrónica y desarrollo embebido.
Re: Ejemplos de filtros digitales con DSPIC30F4011
« Respuesta #12 en: 09 de Febrero de 2010, 01:43:34 »
Gracias por la Info blackcat muy intersante los efectos que mencionas en controladores, crees que usando el formato Q15 se obtengan mejores resultados? Yo apenas ando entendiendo ese formato. saludos!

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Ejemplos de filtros digitales con DSPIC30F4011
« Respuesta #13 en: 09 de Febrero de 2010, 13:13:56 »
He obtenido buenos resultados con filtros IIR de 2 y 4 orden ... con filtros de 8 orden recuerdo que no salia bien.

Saludos!
Control Automático, DSP & Microcontroladores

Desconectado D3GMK

  • PIC10
  • *
  • Mensajes: 3
Re: Ejemplos de filtros digitales con DSPIC30F4011
« Respuesta #14 en: 13 de Febrero de 2010, 19:22:00 »
 :-/ que bien esta el tema
es la primeravez que participo en un foro y me alegra que sea este
me interesa pues estoy viendo un curso de digitalizacion de senales
y vamos a empezar a manejar el dsPic
pues estare visitandolos muy freceuntemente y si puedo aportar lo hare! con todo gusto
bien por ahora no es mas ........  :)