Programación Específica > Microcontroladores
Adaptar Variables A La Función Del Filtro
Bixix:
Hola gente!! :P
Creo que sé porqué al llamar a la función
FIR_FIR150_5500be.filter(arrayEntrada, arraySalida, 1, &FIR_FIR150_5500be);
el programa no funcióna..
Las variables arrayEntrada y arraySalida son de tipo float , y txBuf y rxBuf son de tipo int.
Entonces he intentado buscar información y me he encontrado con esta tabla adjunta, que relaciona fractional con integer...
Yo me pregunto si float=fractional...
Gracias!! :hola:
Platypus:
Hola, :hola:
fractional es distinto a float aunque la longitud en bits puede ser la misma. El float es de 32 bits y se representa según el formato IEEE 754 (1 bit para signo, 8 bits de exponente y el resto para la mantisa). El fractional de C30 es de 16 bits de los cuales uno de ellos es para signo al igual que los de la tabla que adjuntas, y permite representar los valores que ves en dicha tabla. Tal vez te preguntes qué sentido tiene representar valores comprendidos entre +1 y casi -1, pues en el caso de los dsPIC es, por ejemplo, para optimizar las funciones trigonométricas puesto que su resultado está comprendido entre esos valores y de esta forma se obtiene una buena resolución sin penalizar el tiempo de ejecución.
Ten en cuenta que los tipos de datos no son los mismos para ANSI C que para el C del dsPIC que estás utilizando (por ejemplo un int en ANSI C es de 32 bits mientras que en el C30 el int es de 16 bits).
Si quieres saber más sobre tipos de datos de C30 te recomiendo que consultes
MPLAB® C30 User’s Guide en la cual te vienen definidos los tipos de datos y otras muchas cosas más sobre C para dsPIC.
Un saludo. :)
Bixix:
gracias, pero...
MPLAB C30
/* CORCON: CPU Mode control Register */
extern volatile unsigned int CORCON __attribute__((__near__));
typedef struct tagCORCONBITS {
unsigned IF :1; /* Integer/Fractional mode */
unsigned RND :1; /* Rounding mode */
unsigned PSV :1; /* Program Space Visibility enable */
unsigned IPL3 :1;
unsigned ACCSAT :1; /* Acc saturation mode */
unsigned SATDW :1; /* Data space write saturation enable */
unsigned SATB :1; /* Acc B saturation enable */
unsigned SATA :1; /* Acc A saturation enable */
unsigned DL :3; /* DO loop nesting level status */
unsigned :4;
} CORCONBITS;
extern volatile CORCONBITS CORCONbits __attribute__((__near__));
Has utilizado alguna vez la funcion
FIR_FIR150_5500be.filter(arrayEntrada, arraySalida, num samples, &FIR_FIR150_5500be);
Los arrays tienen que ser float, pero el txBuf y rxBuf son de 16 bits!!
Si float es de 32 ?
meter información de 16 bits en un array de 32 bale, pero cómo meto info de 32 bits en 16 sin perder información?
gracias!!
Platypus:
Hola :hola:
no conozco esa función porque no es de las librerías que suministra el fabricante en C, o si lo es yo no la tengo. En las funciones que conozco sobre llamadas a filtros, los datos de los arrays de entrada y salida no son float (32 bits IEEE 754) sino fractional (16 bits) y los datos arrayEntrada y arraySalida en realidad son punteros (en C30 son de 16 bits) a fractional que si son de 16 bit al igual que TXBUFx y RXBUFx. La longitud en bits de los punteros y la longitud en bits de los datos a los que apuntan no tienen porque ser iguales.
No se si te has colado pero no entiendo :blink: a que viene lo siguente...
Bixix Escrito el 11/03/2005, 12:33 PM
--- Citar ---/* CORCON: CPU Mode control Register */
extern volatile unsigned int CORCON __attribute__((__near__));
typedef struct tagCORCONBITS {
unsigned IF :1; /* Integer/Fractional mode */
unsigned RND ]
De todos modos si me pasas el prototipo de la función FIR_FIR150_5500be tal vez puedo ser más concreto y decirte algo más sobre los tipos de datos de dicha función.
Un saludo. :)
--- Fin de la cita ---
Platypus:
Pensándolo mejor <_< , lo de CORCON debe de ser por el bit IF; pues no tiene nada que ver con el tipo de dato que se declara sino con el modo de operación de la DSP (en concreto en la multiplicación). Si es '1' se opera con enteros y si es '0' con fraccionales.
Espero que te lo aclare. Saludos. :D
Navegación
[#] Página Siguiente
Ir a la versión completa