Autor Tema: Filtros IIR y FIR  (Leído 22749 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Filtros IIR y FIR
« en: 19 de Mayo de 2007, 22:05:24 »
Hola ...

   Estan muy interesante las librerias que incluye el C30 sobre la utilizacion de filtros IIR y FIR, me parece que las rutinas estan bastante optimizadas pero el unico problema es que he estado tratando de ponerlas a funcionar y no puedo  :(   ... El problema es que uno puede diseñar el filtro y programar las constantes pero como diablos hago para poder modificar las constantes sin utilizar ese el .s que incluyen los ejemplos  :x .. en la explicacion de la libreria veo que se utilizan structs pero cuando trato de cambiar alguna constante o intento inicializar las constantes sin el .s  el compilador me da error ...

Alguien ha tratado, ha tendo exito? Mi proyecto es que por medio del puerto serie pueda cambiar las constantes y modificar la funcionalidad del filtro.

Gracias por las respuestas!
Control Automático, DSP & Microcontroladores

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Filtros IIR y FIR
« Respuesta #1 en: 20 de Mayo de 2007, 01:25:08 »
J:D :D :D JAJAJAJAJA :D :D :D ... No habia invocado la libreria ... :D :D :D JAAJAJAJJA  :D :D :D...

   Para a los que les pasen :shock:: Deben incluir la libreria  libdsp-coff  en la carpeta Library Files de su proyecto ... :D :D :D :D
Control Automático, DSP & Microcontroladores

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Filtros IIR y FIR
« Respuesta #2 en: 20 de Mayo de 2007, 01:27:39 »
Me alegro que lo tengas resuelto ya. Me gustaría que contaras qué tal funciona eso de los filtros cuando lo tengas; no hago más que oír hablar de ellos y jamás los he visto en acción.

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Filtros IIR y FIR
« Respuesta #3 en: 20 de Mayo de 2007, 04:43:53 »
Con mucho gusto pondre el proyecto cuando lo termine .. ahorita estoy batallando con eso porque los coeficientes del filtro son en punto fijo, eso tiene el problema de que se puede producir overflow facilmente entonces hay estrategias para escojer los coeficientes sin afectar la funcionalidad del filtro ... estoy buscando aplicaciones gratuitas que me faciliten esa funcion
Control Automático, DSP & Microcontroladores

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Filtros IIR y FIR
« Respuesta #4 en: 20 de Mayo de 2007, 15:19:26 »
Probaste con matlab?

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Filtros IIR y FIR
« Respuesta #5 en: 20 de Mayo de 2007, 15:22:37 »
Excelente idea blackcat22 yo también me apunto, quiero hacer mi filtro IIR estoy revisando la librería dsp.h y el ejm.

Saludos
control de movimiento

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Filtros IIR y FIR
« Respuesta #6 en: 20 de Mayo de 2007, 20:43:35 »
Hola gente  :-/ les comparto el ejemplo que hice para utilizar el filtro IIR transpuesto, tambien inclui las funciones en matlab que permiten calcular los coeficientes al formato 1.15 ... el ejemplo solo tiene una etapa IIR de orden 2 y calcula una muestra pero modificarlo es muy sencillo solo se necesita leer un poco el manual de la librerias, ademas el formato para utilizar otros filtros FIR, IIR canonico es muy similar  ... Les recomiendo que simulen siempre porque a lo que lei estos filtros son propensos a overflow  :( ;

   Si tienen alguna modificacion o mejora no duden en compartirla  :D
Control Automático, DSP & Microcontroladores

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Filtros IIR y FIR
« Respuesta #7 en: 22 de Mayo de 2007, 18:23:27 »
 Hola amigos, este sería la primera parte para desarrollar mi filtro, la solución teórica. Las especificaciones de este filtro son:

* Filtro digital IIR
* Pasa alto tipo Chebycheb de orden 2
* Frecuencia de corte fc=200Hz
* Frecuencia de muestreo fm=5000Hz

 El desarrollo es este: (tengo que ponerlo como imagen porque el editor no me acepta fórmulas)



Luego tenemos las ecuaciones en diferencias:



Wc= 2pi*fc
Td=tiempo de muestreo

En la librería dsp para filtro hay tres tipos que son:

Código: [Seleccionar]
[b]IIR Canonic[/b]
Description: IIRCanonic applies an IIR filter, using a cascade of canonic (direct
form II) biquadratic sections, to the sequence of source samples. It
places the results in the sequence of destination samples, and updates
the delay values.

Código: [Seleccionar]
[b]IIR Lattice[/b]
Description: IIRLattice uses a lattice structure implementation to apply an IIR
filter to the sequence of source samples. It then places the results in
the sequence of destination samples, and updates the delay values.

Código: [Seleccionar]
[b]IIR transposed[/b]
Description: IIRTransposed applies an IIR filter, using a cascade of transposed
(direct form II) biquadratic sections, to the sequence of source
samples. It places the results in the sequence of destination samples,
and updates the delay values

Cúal de estos sería el más adecuado para mi filtro?
control de movimiento

abransito

  • Visitante
Re: Filtros IIR y FIR
« Respuesta #8 en: 04 de Julio de 2007, 19:46:09 »
Saludos desde Mexico, acabo de programar una aplicacion de diseño de fitros FIR (PumaFIR) y estoy por implementarlos en FPGA, pero tambien quiero que corran bajo los DSPic, lo que quiero y como soy nuevo en el foro, es el formato que utiliza el compilador MPLAB con el C30 para poder darle a la funcion de exportacion de datos el formato correcto y ponerlo directamente en el editor.

Perdon por no saber de esto todavia es que estoy ocupado con el (PumaIIR) aparte de estar tratando de hacer una driver USB para la familia 18F.

Gracias por cualquier informacion en español; despues pongo imagenes del PumaFIR. Hasta luego.

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Filtros IIR y FIR
« Respuesta #9 en: 05 de Julio de 2007, 21:21:51 »
Hola muy interesante la aplicacion en FPGA me han contado compañeros que el Xilinx creo un plug in para el Simulink de MATLAB que permite crear proyectos en forma grafica .. algo asi como el niple ( pero de verdad !! JAJAJA mentira  :D :D) ... el formato de los coeficientes son en punto fijo que me imagino va a ser la forma en que desarrollaras las operaciones MAC ... este formato en punto fijo se llama 1.15 .. es decir un bit de signo y los 15 restantes para decimales, te recomendaria que mejor desarrollaras una unidad de punto flotante ... mas espacio pero mas eficiente
Control Automático, DSP & Microcontroladores

Desconectado papapitufo

  • PIC10
  • *
  • Mensajes: 17
Re: Filtros IIR y FIR
« Respuesta #10 en: 30 de Julio de 2007, 09:08:43 »
Teoricamente el software de Mikro para DSPIC tiene una aplicación para diseñar filtros. Todo parece muy bonito pero por ahora no he conseguido nada que valga mucho la pena.

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Filtros IIR y FIR
« Respuesta #11 en: 30 de Julio de 2007, 11:49:54 »
El que mejor funciona creo .. es MATLAB ... hace poco compre el Digital FilterLAB de Microchip y no me gusto mucho ... con MATLAB podes simular mejor
Control Automático, DSP & Microcontroladores

Desconectado papapitufo

  • PIC10
  • *
  • Mensajes: 17
Re: Filtros IIR y FIR
« Respuesta #12 en: 30 de Julio de 2007, 17:48:22 »
Si me pudieras guiar un poco te estaría eternamente agradecido.

Un saludo

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Filtros IIR y FIR
« Respuesta #13 en: 30 de Julio de 2007, 20:52:53 »
Hola  :)

  Dentro de este mismo tema adjunte un proyecto que muestra como ejemplo el uso del filtro digital pero en C30, sinceramente nunca he utilizado MikroBasic pero lo basico para realizar filtros digitales es igual que en cualquier lenguaje ... supondria que esa libreria o rutina que estas utilizando calcula una muestra o varias segun alguna especificacion que le des .. en C30 es necesario especificar cuantas muestras vamos a calcular. Por lo general, solamente se calcula una muestra cuando la aplicacion DSP es online, ejemplo: reemplazar un filtro analogico por uno digital ... el procesamiento es offline se utiliza mucho cuando ya tenemos el vector de datos de entrada tal como una imagen guardada en memoria o una cancion mp3 y para darle velocidad a la aplicacion calculamos varias muestras dependiendo del tamaño del vector ... a veces se usa un combinado de los dos ... tal es el caso cuando queremos hacer una analisis FFT, para calcular la FFT de una señal necesitamos de una ventana de datos  ... Supongo que estas utilizando un procesamiento online que es lo mas comun, en este caso, nuestra rutina solamente calcularia una muestra ... ahora despues de calcular una muestra debemos tomar otra y otra y otra pero separadas con un tiempo constante ... si queremos filtrar señales de hasta 20kHz debemos muestrear al menos al doble, es decir a 40kHz, esto lo hacemos generando una interrupcion con el timer, lo ajustamos a que genere una interrupcion cada 25us. Esto ya nos representa una GRAN limitacion de calculo, debemos aseguarar el calculo del filtro junto con las conversiones A/D y D/A esten dentro de ese intervalo de tiempo, si se pasa ... a la mi@#@ el filtro  :5] ...

Creo que ya sabes de eso y no quiero aburrirte ...

Yo utilizo matlab para calcular el filtro ... C30 solo me permite sistemas de orden 2 o con la siguiente forma

       b0 + b1 * z^-1 + b2 * z^-2
H = ----------------------------------   
        1  + a1 * z^-1 + a2* z^2

RECORDANDO: Los coeficientes a1 y a2 se deben poner negativos (no se porque C30 lo especifica asi) debo verificarlo con mas profundidad

En el caso de que especifiquemos los coeficientes b0,b1,b2,a1,a2 como filtro pasobajo este seria de -40dB/D ..  Pero podemos poner mas sistemas en serie especificando mas coeficientes ... esto se llama la implementacion digital en serie y se utiliza de esta manera para evitar errores por redondeo

Digital FilterLAB realiza el calculo de los coeficientes directamente y crea la rutina en C, solamente hay que poner que filtro y cuales son las frecuencias de corte que queremos, no me gusto porque hace un colocho de rutinas y al final no se entiende nada ... en MATLAB uso la funcion BUTTER, digamos que quiero un filtro pasobajo de orden 2 (-40dB/dec) con frecuencia de corte en 20kHz ... digitamos lo siguiente

>>[b, a] = butter(2, 0.9999)

2 porque es el orden del sistema y 0.99999 porque significa un medio de la frecuencia de muestreo, 20kHz, la frecuencia de muestreo es 40kHz, si ponemos 0.5 la frecuencia de corte del filtro seria 10kHz .. no se si me entiendes??

Ya tenemos los coeficientes a y b, podemos verificar la funcionalidad del filtro poniendo

>>fvtool(b, a)

Inmediatamente se abre un entorno gráfico con la respuesta en frecuencia del filtro, note que la escala va de 0 a 1 donde uno representa 20kHz, tambien observe que las frecuencias mayores a 20kHz no son representables, por lo que si nuestra señal a filtrar tiene componentes superiores a 20kHz no se filtraran como pasa en un filtro analogo y sucederá un fenomeno llamado aliasing que mas bien amplifara algunas componentes superiores a 20kHz, es por ello que se debe poner un filtro antialiasing pasa bajos (analogo porque no queda de otra) despues de la señal que deseamos muestrear, en otras palabras

  SEÑAL --> Filtro AntiAlias(analogo paso bajos a 20kHz) --> ADC --> dsPIC

Es de pensar, que talvez nuestro filtro de 20kHz se esta solucionando con un filtro analogo y no tendra mucha gracia la aplicacion del fltro digital pero es solo un ejemplo y esta frecuencia seria la maxima permitida en nuestro sistema.
 
Ahora  :o solamente debemos pasar los coeficientes al formato de punto fijo 1.15 que para tal te podes bajar la funcion en matlab que realiza eso. La funcion esta dentro de este foro ... esta en el archivo filtro.rar ... lo descomprimis y en la carpeta funciones matlab

>> iir_trans(b, a)

coeficientes =

0x4000, 0x7FFF, 0x8001, 0x4000, 0xC001

Estan en este orden:  b0, b1, a1, b2, a2

NOTAS:

Si vez la ayuda de BUTTER podemos crear filtros digitales pasoalto, muesca, pasabanda, etc, tambien hay otras funciones para filtros de bessel, Chebyshev, etc

Tambien esta el toolbox de MATLAB llamado fdatool

>>fdatool

Este toolbox ya es un poco mas elaborado .. pero lo interesante es que podemos calcular cualquier filtro digital especificando los parametros necesarios e inmediatamente obtenemos el orden del filtro (recomendado) y los coeficientes en sistemas de orden 2

C30 utiliza punto fijo, esto para darle velocidad al calculo, un filtro de orden 2 a 30MIPS tarda aproximadamente 5us calculando una muestra, para el dsPIC filtrar señales de 20kHz es un gran esfuerzo, ya filtrar señales mayores mejor nos pasamos a Texas Instruments que realiza las operaciones con punto flotante y a una mayor velocidad de procesamiento (150MIPS y 32bits por ahi leí) 

Te recomiendo extremadamente que simules el filtro y compares los resultados con MATLAB ... me imagino que MikroBasic puede simular  :?

SALUDOS y espero que te sirva ... Intentare poner un ejemplo del proyecto completo!
 
« Última modificación: 18 de Diciembre de 2007, 22:31:44 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Filtros IIR y FIR
« Respuesta #14 en: 07 de Agosto de 2007, 13:01:08 »
Hola Blackcat, los coeficientes del denominador tienen que estar con signo opuesto.

       b0 + b1 * z^-1 + b2 * z^-2
H = ----------------------------------   
        1  + a1 * z^-1 + a2* z^-2

entonces:

y(z)*(1  + a1 * z^-1 + a2* z^-2)=x(z)*(b0 + b1 * z^-1 + b2 * z^-2)

y(z)+a1*y(z)*z^-1+a2*y(z)*z^-2=b0*x(z)+b1*x(z)*z^-1+b2*x(z)*z^-2

entonces despejando:

y(z)=b0*x(z)+b1*x(z)*z^-1+b2*x(z)*z^-2-a1*y(z)*z^-1-a2*y(z)*z^-2

por propiedad de desplazamiento de la transformada z: x(n-N)=zinv[x(z)*z^-N]
entonces:

y(n)=b0*x(n)+b1*x(n-1)+b2*x(n-2)-a1*y(n-1)-a2*y(n-2)

saludos
control de movimiento


 

anything