Autor Tema: funcion PowerVector de libreria dsp  (Leído 6055 veces)

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

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
funcion PowerVector de libreria dsp
« en: 20 de Abril de 2008, 04:07:41 »
Hola foro, este es mi primer post en este foro, ya he leído bastante, gracias al foro pude armarme el GTP-USB-Lite, pronto viene el ICD2, y he aprendido un montón leyendo acá,  creo que es hora de pedirles ayuda :)


Resulta que quiero usar la función PowerVector que viene en la librería dsp (uso C30).

Código: C
  1. #include <p30f4011.h>
  2. #include <LCD Nokia C30.h>  //gracias a nocturno por esta  :mrgreen:
  3. #include <dsp.h>
  4.  
  5.  
  6. extern fractional VectorPower ( int numElems, fractional* srcV); // esta es la funcion en cuestion
  7. extern float Fract2Float (fractional aVal);                                  //si no hago esto, no puedo mostrar el resultado con printf
  8.  
  9. fractional v1[8]={0.1, 0.1, 0.1, 0.1 ,0.1, 0.1, 0.1 , 0.1};
  10. fractional* iptr;   //puntero iptr
  11.  
  12. fractional vrms;
  13.  
  14. int main(void)
  15. {
  16.         TRISE=0x0;              /Pto. E salida (aqui puse la LCD nokia)
  17.         TRISB=0xFFFF;           //Pto. B entrada
  18.         iptr=&v1;                      // dir de mem del vecor v1              
  19.        
  20.         #ifdef UsaNokiaLCD
  21.        
  22.         #endif
  23.         lcd_init();             // Inicialización LCD
  24.         ADC_Init();
  25.  
  26.        
  27.         while(1)
  28.         {
  29.         vrms=VectorPower(8, &iptr);
  30.         volts= Fract2Float (vrms);
  31.         printf("val= %.2f dBa" ,volts);
  32.         DelayMs(200);
  33.         }
  34. }

La definición de la función que da el 16-Bit Language Tools Libraries, es esta:resultado=sum(Vn^2), Vn son los elementos del vector.
El tema es que si hago la función anterior con el vector que ahí sale, da como resultado 0.01, siendo que debiera ser 0.08.

Creo que mi problema está en el manejo de los punteros, ya que no los tengo claros aún.
Espero  que puedan darme una mano con este tema,


Muchas gracias de antemano.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: funcion PowerVector de libreria dsp
« Respuesta #1 en: 20 de Abril de 2008, 05:30:21 »
No veo la implementación de la función VectorPower.
¿Qué archivos tienes agregados al proyecto?

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: funcion PowerVector de libreria dsp
« Respuesta #2 en: 20 de Abril de 2008, 05:59:18 »
¿No has olvidado poner esto?
#define DATA_TYPE       FLOATING

Si no está así, el tipo fractional será un entero, en lugar de un double.

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: funcion PowerVector de libreria dsp
« Respuesta #3 en: 20 de Abril de 2008, 14:30:34 »
Modulay:
Tengo los siguientes archivos agregados: libdsp-coff.a en Library

Nocturno: puse lo siguiente: #define fractional float;

pero el resultado sigue siendo el mismo,  de hecho aahora me da cero, están bien asignaos los punteros?

gracais

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: funcion PowerVector de libreria dsp
« Respuesta #4 en: 20 de Abril de 2008, 15:20:25 »
Quita esa línea y añade,antes de #include <dsp.h>, la línea que te ha indicado Nocturno

No obstante,el resultado que obtienes de 0.08 me parece coherente, ya que coincide con el sumatorio de los cuadrados de los elementos del vector.

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: funcion PowerVector de libreria dsp
« Respuesta #5 en: 20 de Abril de 2008, 15:53:03 »
¿No has olvidado poner esto?
#define DATA_TYPE       FLOATING

Si no está así, el tipo fractional será un entero, en lugar de un double.


No conozco esta función, pero creo que no estas creando bien los números pues estas usando punto flotante en un arreglo de números en punto fijo ... talvez puedas usar float2fractional( ) para cambiar el formato de los número a punto fijo...

Me pareció interesante lo que dijo el señor Nocturno ... Quizá Nocturno nos pueda explicar bien que significa su propuesta??


Control Automático, DSP & Microcontroladores

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: funcion PowerVector de libreria dsp
« Respuesta #6 en: 20 de Abril de 2008, 17:58:10 »
modulay: 0.08 es lo que espero, sin embargo sale 0.01, al poner la linea que propone nocturno antes de #include <dsp.h>, pero no compila

blackcat: yo entiendo que v1 tiene datos de tipo fraccional ¿está bien???

A las funciones de la librería dsp hay que entregarles datos en fraccional. entonces me gustaría conservar ese formato.

gracias

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: funcion PowerVector de libreria dsp
« Respuesta #7 en: 20 de Abril de 2008, 18:38:29 »
Pues a mí me compila ¿Qué error te da?

Por cierto,esta línea:

vrms=VectorPower(8, &iptr);

...se supone que debe ir así:

vrms=VectorPower(8, iptr);

Ya que iptr es un puntero a fraccional y no tiene sentido que mandes como parámetro su propia dirección de memoria,sino la dirección de memoria donde se encuentra el primer fraccional del array.


¿Y qué se supone que hace exactamente la función VectorPower? Porque parece que ya está compilada y no se puede mirar el código.

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: funcion PowerVector de libreria dsp
« Respuesta #8 en: 20 de Abril de 2008, 19:32:24 »
es que a mi tb me compila, pero no me da el resultado que necesito (0.08), sino que entrega 0.

seguiré probando otras opciones


Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: funcion PowerVector de libreria dsp
« Respuesta #9 en: 20 de Abril de 2008, 20:13:40 »
modulay: 0.08 es lo que espero, sin embargo sale 0.01, al poner la linea que propone nocturno antes de #include <dsp.h>, pero no compila

¿compila o no compila?

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: funcion PowerVector de libreria dsp
« Respuesta #10 en: 20 de Abril de 2008, 22:13:52 »
Hola ... tenes problemas de puntero y el formato de los números, entiendo que usas fractional pero veo con las sentencias FLOATING o FRACTIONAL solo cambias de flotante o fijo .. es decir  .. el preprocesador de C cambiara (en el momento de compilar) la palabra fractional por double  o por int segun lo detalla este fragmento del archivo dsp.h:

Código: [Seleccionar]
/* Local types. */

/* Type definitions. */
#ifndef fractional                      /* [ */

#if     DATA_TYPE==FLOATING             /* [ */
typedef double          fractional;
#else   /* ] */
typedef int             fractional;
#endif  /* ] */

Ahora... la libreria dsp solo sirve con int con fraccionales en formato fixed Q15 y algunas funciones creo que con double .. bueno este texto extraído del manual de la libreria DSP lo deja bien claro:

A fractional vector is a collection of numerical values, the vector elements, allocated
contiguously in memory, with the first element at the lowest memory address. One word
of memory (two bytes) is used to store the value of each element, and this quantity
must be interpreted as a fractional number represented in the 1.15 data format.


En resumen .. no podes usar double o float .. además te recomiendo que todo lo hagas en fixed pues el micro esta optimizado para eso y no para flotantes!  :(  Se que es mas complicado pero solo asi le sacarás mas provecho al dsPIC.

Intente tu programita usando int .. es decir: #define DATA_TYPE FRACTIONAL

Código: [Seleccionar]
fractional v1[8];
char length = sizeof( v1 ) / 2;

while( length )
{
length--;
v1[ length ] = Float2Fract( 0.1 );
}

float vrms = Fract2Float( VectorPower(8, v1) );

y el resultado de vrms me dio exactamente 0.08001709 ... si no me crees te dejo una imagen ...



ahora en vez del ciclo while utiliza Float2Frac() para llenar tu tablita con los valores correctos .. observa en la simulación que 0.1 se representa como 0x0CCD

Punteros:

Para arreglos el puntero es igual si pones  v1 o &v1[0]

Para variables debes poner siempre &

Saludos!
« Última modificación: 21 de Abril de 2008, 00:09:05 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: funcion PowerVector de libreria dsp
« Respuesta #11 en: 21 de Abril de 2008, 02:01:37 »
Pues acabo de probarlo y confirmo desde la A a la Z todo lo que dice blackcat.
- no hay que usar DATA_TYPE FLOATING
- hay que quitar el & en la llamada a VectorPower
- hay que definir el array haciendo conversión Float2Fract de cada parámetro

Tu código original queda así. Lo he probado y va perfecto:
Código: C
  1. fractional v1[8]={Float2Fract(0.1),Float2Fract(0.1),Float2Fract(0.1),Float2Fract(0.1),Float2Fract(0.1),Float2Fract(0.1),Float2Fract(0.1),Float2Fract(0.1)};
  2. fractional* iptr;   //puntero iptr
  3. fractional vrms;
  4.  
  5. iptr=&v1;                      // dir de mem del vecor v1              
  6. float volts;
  7.        
  8. while(1) {
  9.         vrms=VectorPower(8, v1);
  10.         volts= Fract2Float (vrms);
  11.         SalidaPor=VFD;
  12.         printf("\fval= %2.2f" ,volts);
  13.         delay_ms(200);
  14. }

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: funcion PowerVector de libreria dsp
« Respuesta #12 en: 21 de Abril de 2008, 03:55:02 »
Muchas gracias por la aclaración sobre el uso de la librería blackcat, espero poder seguir contando con la ayuda de uds para aprender a domar estos bicharracos, he probado el código que propone nocturno y va de maravillas.

A fin de semestre, cuando termine el proyecto, lo pondré a disposición de todos (se trata de un sonómetro), quizás si se puede lo voy subiendo poco a poco
a medida que avance en él.

Me surge otra pregunta: Si los datos que conforman el vector v1 provienen del CAD, y lo tengo configurado para que el resultado venga en fraccional, el uso es directo cierto??

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: funcion PowerVector de libreria dsp
« Respuesta #13 en: 21 de Abril de 2008, 04:34:12 »
Claro, el vector almacena el dato en fractional, si no necesitas convertir desde float puedes meterlo directamente.

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: funcion PowerVector de libreria dsp
« Respuesta #14 en: 21 de Abril de 2008, 16:39:33 »
Si claro ... el ADC tiene un modo que convierte el dato obtenido a tipo fractional Q15, solo verifica si lo ocupas con signo o sin signo .. PERO debes procurar que el resultado de la operacion no de mayor que 1 (0x3FFFh) porque si no ocurre un desbordamiento !!! este es el problemita del punto fijo!  :shock: :shock:

Lo que yo hago es dejar el modo de conversion a integral y con signo, luego hacer un corrimiento de 5 bits hacia la izquierda despues de la conversion... eso seria una representacion Q14 es decir número desde -2 a 1.9999; tambien podes hacer Q13 (-4 a 3.999), Q12 (-8 a 7.999) etc etc ...

En mi aplicación uso Q14 y me funciona muy bien


Saludos!
 

« Última modificación: 22 de Abril de 2008, 01:20:45 por blackcat »
Control Automático, DSP & Microcontroladores


 

anything