Autor Tema: FILTROS FIR SIN LIBRERIA , todo en c  (Leído 13560 veces)

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

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: FILTROS FIR SIN LIBRERIA , todo en c
« Respuesta #15 en: 16 de Octubre de 2008, 01:11:57 »
Claro que si merece la pena ... la libreria C de filtros IIR y FIR  tarda unos cuantos microsegundos en comparación a la realizacion en punto flotante  ... las rutinas de la libreria estan muy bien optimizadas y se saca el máximo provecho al dsPIC .. recordemos que el dsPIC incorpora la funcion MAC y operaciones aritmeticas leyendo dos sitios de memoria al mismo tiempo (memoria X y Y) ..

En cuanto a la resolución ... se podria decir que es muy buena, yo lo he utilizado para control automático en sistemas de orden 8 y cascadas de sistemas en orden 2 y todo perfecto .. .. solo hay que tener claro que el rango de operacion debe ser entre -1 a 1 ..

Respecto a las multiplicaciones .. si es extraño como microchip no ha hecho una libreria de matematicas para multiplicaciones en fraccionario 1.15 ... por ahi andan unas rutinas de funciones trigonometricas pero hace mucha falta una de operaciones básicas ...  yo me hice mi propia rutinita de multiplicacion ... claro en ensamblador ...

Primero esta el archivito .s que contiene la rutina de multiplicacion:

Código: ASM
  1. ;
  2. ; file: mult16x16.s
  3. ;
  4.  
  5. .global _mult15
  6.  
  7. _mult15:
  8.  
  9. MUL.SS  W0, W1, W0
  10.  
  11. RLC     W0, W0
  12. RLC     W1, W1
  13.  
  14. MOV     W1, W0
  15.  
  16. return
  17. .end


Ahora si quiero colocarla en código C .. importo el archivo y declaro lo siguiente:

Código: [Seleccionar]
extern int mult15(int, int);

... un programita de ejemplo ...

Código: C
  1. extern int mult15(int, int);
  2.  
  3. void  main (void)
  4. {
  5.  
  6.         fractional numeroA = 0x7FFF;   // 1.0 en fraccional
  7.         fractional numeroB = 0x3FFF;   // 0.5 en fraccional
  8.         fractional resultado;
  9.  
  10.         resultado = mult15( numeroA, numeroB );
  11.  
  12.         while(1);
  13. }

El valor de resultado fue 0x3FFE ... un pequeño error pero asi es este formato ..  :?
« Última modificación: 02 de Noviembre de 2008, 01:42:22 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado latha

  • PIC10
  • *
  • Mensajes: 21
Re: FILTROS FIR SIN LIBRERIA , todo en c
« Respuesta #16 en: 16 de Octubre de 2008, 06:10:44 »
Perdona mi ignorancia, pero con esa rutina no deberias multiplicar enteros con signo??, de todos modos voy a probar tal como lo tienes ahi, y luego en caso de necesidad usare la instruccion MPY con una previa carga del registro CORCON correspondiente.

Saludos desde Malaga. Raúl.

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: FILTROS FIR SIN LIBRERIA , todo en c
« Respuesta #17 en: 16 de Octubre de 2008, 13:08:12 »
el codigo que te mande si que trabaja con fraccionales 1.15. Bueno, xa el compilador son enteros, pero se tratan como fraccionales. Las operaciones + y - con fraccionles son iguales que con enteros. es en las operaciones de multiplicacion y division donde cambia un poco la cosa.
Los fraccionales tienen un rango entre +1 y -1 entonces la multiplicacion de 2 numeros fraccionales no padra ser mayor que el mayor de los dos multiplicandos.

La ventaja de trabajar con enteros es que es totalmente independente de la plataforma, en mi caso es imprescindible xq estoy trabajando con pic24.

Código: C
  1. long sum = 0; int x[10], h[10];
  2. for( i = 0 ; i < 10 ; i++)
  3.     sum += (long)x[i] * (long)h[i];
  4. sum >>= 15;// "reescala el resultado a un rango entre +1 y -1", solo se realiza la ultima vez

las operacion long += long * long se hace en unos 10 ciclos y acceder a los indices y controlar las iteraciones en otros 20 asi que no me importa mucho el tiempo que tarde en hacer las multiplicaciones puesto que ya tarda bastante en acceder a los indices y demas.

Si miras el codigo equivalente a hacer las multiplicaciones en C no son mucho mas de 5 instrucciones. y escalar los resultados solo es necesario una vez al terminar el bucle....

En mi opinion es mas rentable optimizar el codigo utilizando las opciones del compilador y dejar un codigo clarito y portable en C, y si nuestra aplicacion es mas exigente utilizamos un dsPIC y las librerias que proporciona microchip.

Editado por Nocturno: he incluido Geshi en el código porque se veía mal
« Última modificación: 16 de Octubre de 2008, 14:02:27 por un Moderador »

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: FILTROS FIR SIN LIBRERIA , todo en c
« Respuesta #18 en: 16 de Octubre de 2008, 23:10:06 »
Perdona mi ignorancia, pero con esa rutina no deberias multiplicar enteros con signo??, de todos modos voy a probar tal como lo tienes ahi, y luego en caso de necesidad usare la instruccion MPY con una previa carga del registro CORCON correspondiente.

Saludos desde Malaga. Raúl.

Vamos a ver si entendi ... pero con solo poner int el compilador supone que es entero con signo ... es igual que poner signed int... para poner enteros sin signo se utiliza unsigned int ...

Esa rutina la utilizo mucho y siempre me ha funcionado .. aqui otros resultados:


numeroA = 0x8001 ... que es -1.0 en fraccional
numeroB = 0x3FFF ... que es 0.5 en fraccional

resultado fue: 0xC001 ... lo que corresponde a -0.5 ... ahora hagamos -0.5 x -0.5 .. deberia ser 0.25 .. que en fraccional es 0x1FFF .. entonces:

numeroA = 0xC001 ... que es -0.5 en fraccional
numeroB = 0xC001 ... que es -0.5 en fraccional

resultado fue: 0x1FFF .. como fue de esperar ... !! ...  :)


Recuerda que para pasar de flotante a fraccionario y viceversa .. podes usar las funciones:

Float2Fract y Fract2Float

de la libreria DSP de microchip ...

Mi idea en este caso es hacer las multiplicaciones con el menor código posible .. en total realizar la multiplicación y mover el resultado a resultado tardó 0.3us

Si tienes alguna mejora ... me gustaria tu sugerencia!

Saludos!!








Control Automático, DSP & Microcontroladores

Desconectado latha

  • PIC10
  • *
  • Mensajes: 21
Re: FILTROS FIR SIN LIBRERIA , todo en c
« Respuesta #19 en: 18 de Octubre de 2008, 10:32:33 »
hola a todos, el problema con tu rutina no era que no entendiese entre enteros con o sin signo, solo que la instruccion ensablador que usabas no diferenciaba de entero o fractional, hice la simulacion y no lo consegui, use la multiplicacion MPY y lo carge en el Acumulador A, para luego sacarlo fuera de la funcion en ensablador, y si logre la multiplicacion en flotante que tanto me costo, seguramente tengo algo mal definido y la instruccion MUL solo entendia de enteros.

Pongo aqui la rutina que es basicamente la tuya.

.global _multfractional

_multfractional

PUSH CORCON
MOV #0x0010,W3
MOV W3,CORCON
MOV W0,W4
MOV W1, W5
MPY W4*W5,A
SAC A,W0
POP CORCON
return
.end

Un saludo desde Malaga.

P.D: El filtro FIR con enteros y usando long para guardar el resultado con el posterior desplazamiento va de escandalo, pero para un filtro IIR donde los coeficientes ya no son todos del mismo orden necesitaba hacerlo en fractional para que todos los numeros sean menores que uno, y tampoco me servia usar flotantes puesto que con tres multiplicaciones en flotante, el paso de muestras entre el codec y el dspic a traves del bus SPI se me dejaba de funcionar.

Cuando acabe todo el proyecto no tengo problemas en mandar info a quien este interesado.

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: FILTROS FIR SIN LIBRERIA , todo en c
« Respuesta #20 en: 18 de Octubre de 2008, 14:15:35 »
Entiendo que queres multiplicar datos en formato fractional esto es números desde -1 hasta 0.999969482 ... ahora para que los enteros?? el problema básico es que no encuentro una forma rápida y optimizada de realizar multiplicaciones ... revise y simule tu código y obtuve buenos resultados ... ese código tiene mas lógica...  lo que no me queda claro es para que habilitas la supersaturacion 9.31 ..

Seria interesante hacer multiplicaciones en Q16 ... microchip incorpora ya unas funciones para esto .. dejo un  ejemplo tomado del pdf 16-BIT LANGUAGE TOOLS
LIBRARIES
que se encuentra en la carpeta C:\Program Files\Microchip\MPLAB C30\docs de la version 8.14 de MPLAB

_Q16mac
Description: This function multiplies the two 32-bit inputs, x and y, and accumulates
the product with prod. The function takes care of saturating the result
in case of underflow or overflow.


 
« Última modificación: 18 de Octubre de 2008, 15:15:46 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado latha

  • PIC10
  • *
  • Mensajes: 21
Re: FILTROS FIR SIN LIBRERIA , todo en c
« Respuesta #21 en: 19 de Octubre de 2008, 07:22:26 »
HOLA, Activar la supersaturacion, pues sinceramente estaba tan cansado de configurar el CORCON que lo vi en un ejemplo y lo puse asi , jeje, lo unico interesante era hacer las multiplicaciones en fractional y con signo y sabia que con 0x0010 estaba conseguido eso.

El tema de los enteros fue en referencia a la ayuda aportada por un compañero solo comentaba que iva estupendamente para los FIR.

P.D: No tengo ese MPLAB ,¿como puedo acceder a esa info, sin tener esa version de MPLAB?.

Saludos desde Malaga.

Raúl.

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: FILTROS FIR SIN LIBRERIA , todo en c
« Respuesta #22 en: 19 de Octubre de 2008, 16:26:40 »
De igual forma ... se abre la carpeta donde esta el mplab y busca la carpeta de docs ...

Otro asunto es que no configure CORCON con el valor de 0x0010 .. lo deje como 0x0024 .. es decir el valor original y me funciona igual ...

En cuanto a la supersaturacion no la creo necesaria pues en "teoria" las multiplicaciones en de dos terminos en fractional no deberia saturar ...

Saludos!!

Control Automático, DSP & Microcontroladores