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
...
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
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!