TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: blackcat 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!
-
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
-
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.
-
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
-
Probaste con matlab?
-
Excelente idea blackcat22 yo también me apunto, quiero hacer mi filtro IIR estoy revisando la librería dsp.h y el ejm.
Saludos
-
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
-
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)
(http://img340.imageshack.us/img340/7793/iir1ed9.jpg)
Luego tenemos las ecuaciones en diferencias:
(http://img404.imageshack.us/img404/8773/iir2jm6.jpg)
Wc= 2pi*fc
Td=tiempo de muestreo
En la librería dsp para filtro hay tres tipos que son:
[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.
[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.
[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?
-
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.
-
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
-
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.
-
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
-
Si me pudieras guiar un poco te estaría eternamente agradecido.
Un saludo
-
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!
-
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
-
AHH si parece muy razonable ... Como la función MAC solo suma entonces la resta debe hacerse de manera implícita ( poniendo números negativos ) ... Perdón por la tardanza pero hasta ahora lo leí!! :D :D :D
-
Hola a todos, ya se que este post tiene más de 2 años pero a ver si me podeis aclarar una duda. Con este post he aprendido ha implementar un filtro digital en un dsPIC30F (muy buen post) y todo funciona muy bien cuando filtro la entrada del ADC con una muestra (filtro ONLINE) y un filtro butterworth de 2 orden, el problema biene cuando quiero aplicar el mismo filtro a dos entradas del ADC. En este caso los valores que obtengo no tiene ningun sentido.
¿se puede utilizar el mismo filtro para usar en diferentes entradas? o ¿es necesario crear un filtro para cada entrada a filtrar?
yo he probado ha hacer dos filtros y aplicara cada uno a una entrada del ADC y funciona.
un saludo y gracias.
-
Hola a todos, ya se que este post tiene más de 2 años pero a ver si me podeis aclarar una duda. Con este post he aprendido ha implementar un filtro digital en un dsPIC30F (muy buen post) y todo funciona muy bien cuando filtro la entrada del ADC con una muestra (filtro ONLINE) y un filtro butterworth de 2 orden, el problema biene cuando quiero aplicar el mismo filtro a dos entradas del ADC. En este caso los valores que obtengo no tiene ningun sentido.
¿se puede utilizar el mismo filtro para usar en diferentes entradas? o ¿es necesario crear un filtro para cada entrada a filtrar?
yo he probado ha hacer dos filtros y aplicara cada uno a una entrada del ADC y funciona.
un saludo y gracias.
Hola!
Di debes crear un filtro por cada entrada analogica, Esto es por el filtro guarda datos de muestras pasadas y resultados pasados para calcular el resultado actual.
Saludos!
-
gracias por responder Blackcat, entonces con lo que me has comentado he intentado unir todo los filtros en un mismo archivo para evitar declarar 2 veces las mismas constantes y no se si se puede hacer esto por que de ASM no estoy puesto y no lo puedo probar en la placa todavia.
yo he utlizado el FILTER DESIGNER de microchip y obtengo el archivo *.s que contiene los coeficientes y la inicialización:
; ;;;;;;;;;;;;;;;;;;;;FILTRO ADC 1
.section .data
.global _FPB_1_Filter
_FPB_1_Filter:
.hword FPB_BUTTNumSections-1
.hword FPB_BUTTCoefs
.hword 0xFF00
.hword FPB_BUTTStates1
.hword FPB_BUTTStates2
.hword 0x0000
;;;;;;;;;;;;;;;;;;;;FILTRO ADC 2
.section .data
.global _FPB_2_Filter
_FPB_2_Filter:
.hword FPB_BUTTNumSections-1
.hword FPB_BUTTCoefs
.hword 0xFF00
.hword FPB_BUTTStates1
.hword FPB_BUTTStates2
.hword 0x0000
de esta forma reutilizo los parametros del filtro para el resto. Compilar compila ¿creesque esto es viable? la semana que viene lo podré probar y comento
Y algo que no entiendo:
para crear la estrutura en C30 yo utilizo:
IIRTransposedStruct FPB_1_Filter, FPB_2_Filter
¿y se debe nombrar con el mismo nombre que en el archivo *.s ? pero en el archivo .s el nombre del filtro es "_FPB_2_Filter" y en C "FPB_2_Filter" esto siempre es así en ASM o lo estoy haciendo mal.
un saludo y gracias
-
Buenas,
también hace un tiempo del último del último mensaje, pero creo que va en este hilo.
Muchas gracias Blackcat por tu aporte para trasformar los coeficientes de Matlab, pero me surge un problema.
Simplemente quiero hacer un IIRCanonic con la librería, y me piden dos parámetros, ganancia inicial y escalado en la salida, pero cuando obtengo los coeficientes con Matlab, me salen dos ganancias (una para cada sección) y la ganancia de salida.
Y me he atascado un poco y no sé como implementarlo. Supongo que la ganancia de salida será el escalado, pero de las dos ganancias de las secciones no sé cómo ponerlas si sólo tengo la opción de una ganancia inicial.
Muchas gracias de antemano y un saludo.