Autor Tema: Uso de VectorCorrelation de la libreria DSP de microchip para DSPIC33F  (Leído 5896 veces)

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

Desconectado lidia

  • PIC10
  • *
  • Mensajes: 7
Hola a todos!

Soy nueva en el foro y también en el trabajo con los dspic. Estoy trabajando con el dspic33FJ256GP710. Necesito hacer la correlación entre dos vectores de longitud N, y estoy probando con la librería dsp de microchip. He hecho un pequeño algoritmo de prueba, y el problema es que el vector de resultados siempre me da cero, tengan el valor que tengan los vectores a los que quiero calcular la correlación, ¿Sabría alguien decirme porqué pasa esto o qué significa este resultado? Muhas gracias!

Pongo el algoritmo de prueba a continuación:

Código: [Seleccionar]
int N=5;
int i;
fractional origen[N];    //Declaro vectores
fractional origen2[N];
fractional resultado[N+N-1];

for(i=0;i<N;i++){     //Da valores a los vectores origen
origen2[i]=i;
origen[i]=i;
}

fractional *porigen=&origen;   //Punteros a direccion de memoria donde se almacenan vectores
fractional *presultado=&resultado;
fractional *porigen2=&origen2;

presultado=VectorCorrelate(N,N,presultado,porigen2,porigen); // llamada a librería

Un saludo!!!!
« Última modificación: 03 de Junio de 2010, 11:40:01 por un Moderador, Razón: Se agrega código [] »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Uso de VectorCorrelation de la libreria DSP de microchip para DSPIC33F
« Respuesta #1 en: 03 de Junio de 2010, 11:41:49 »
Hola, yo pensaría que un fractional es un número menor a 1 y en formato fixed point. Lo que tú estás cargando son enteros del 1 al 5. Checa eso.

Desconectado lidia

  • PIC10
  • *
  • Mensajes: 7
Re: Uso de VectorCorrelation de la libreria DSP de microchip para DSPIC33F
« Respuesta #2 en: 07 de Junio de 2010, 05:13:35 »
Hola!! Gracias por responder tan pronto!!!! :)

He probado a cambiar los datos del vector origen poniéndoles valores de entre -1 y 1 y he puesto DATA_TYPE como FLOATING y el resultado de la correlación sigue siendo cero. Si pruebo a hacerle a esos datos la conversión a Q15 como he visto por otros temas del foro,  me da un resultado distinto de cero pero que tampoco se interpretar. Además, si dejo la declaracion de tipos y los vectores de entrada tal como al principio, (origen=[0 1 2 3 4 ]) y solo cambio la rutina y en vez de usar VerctorCorrelate pruebo por ejemplo con VectorAdd que hace la suma, todo funciona correctamente, así que no se si no estoy usando correctamente el tipo fractional o hay algun fallo de otro tipo. :?

La declaración del tipo fractional es la siguiente:

/* Type definitions. */

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

con:

#define FLOATING        -1                      /* using floating type */
#define FRACTIONAL       1                      /* using fractional type */
#ifndef DATA_TYPE                      
#define DATA_TYPE       FRACTIONAL              /* default */
#endif


Saludos!!!!
« Última modificación: 07 de Junio de 2010, 08:47:59 por lidia »

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: Uso de VectorCorrelation de la libreria DSP de microchip para DSPIC33F
« Respuesta #3 en: 07 de Junio de 2010, 11:22:28 »
Lidia:

hay una función que es para transformar números  a fractional creo que es FloattoFract(), tienes que usar esa forma para llenar tus vectores de prueba.


Yo tuve el mismo problema cuando estaba probando la rutina de la FFT. http://www.todopic.com.ar/foros/index.php?;topic=21400.0

suerte!

Desconectado lidia

  • PIC10
  • *
  • Mensajes: 7
Re: Uso de VectorCorrelation de la libreria DSP de microchip para DSPIC33F
« Respuesta #4 en: 07 de Junio de 2010, 13:22:36 »
Muchas gracias por la ayuda, he estado probando con esas funciones, de forma aislada bien, pero no he conseguido buenos resultados todavia al usarlas junto con la suma de vectores, por ejemplo. De todas formas seguiré por ese camino!

Dejo ahí el código de prueba por si alguien ve el error!

Código: [Seleccionar]
int main(void)
{
int N=4;
int i,j;
float valor=0,dato;
//DATA_TYPE FLOATING;
fractional origen[N];
fractional origen2[N];
fractional resultado[N+N-1];
int M=sizeof(origen);

for(i=0;i<N;i++){
origen2[i]=Float2Fract(valor);
origen[i]=Float2Fract(valor);
valor=valor+0.1;
}
fractional *porigen=&origen;
fractional *presultado=&resultado;
fractional *porigen2=&origen2;

presultado=VectorAdd(N,presultado,porigen2,porigen);

for (j=0;j<N;j++)
   {
     resultado[j] = Fract2Float(resultado[j]);  
   }
}
« Última modificación: 07 de Junio de 2010, 13:47:38 por un Moderador, Razón: Se agregan corchetes code »

Desconectado lidia

  • PIC10
  • *
  • Mensajes: 7
Re: Uso de VectorCorrelation de la libreria DSP de microchip para DSPIC33F
« Respuesta #5 en: 16 de Junio de 2010, 09:08:24 »
Buenas!!!

Ya calculo correctamente la correlación entre dos señales, efectivamente se trataba de un error al usar el tipo fractional junto con la necesidad de crear los datos en la zona correcta de memoria, pero ahora tengo el problema de que durante el cálculo de la correlación no se atienden las interrupciones (concretamente de un botón de reset que he implementado), creo que se deshabilitan internamente al iniciar la correlación usando la intrucción "push CORCON". ¿Es correcto?

Gracias de antemano por su ayuda!!!!!!!!!!!
« Última modificación: 17 de Junio de 2010, 05:22:54 por lidia »

Desconectado seba85

  • PIC10
  • *
  • Mensajes: 28
Re: Uso de VectorCorrelation de la libreria DSP de microchip para DSPIC33F
« Respuesta #6 en: 08 de Agosto de 2013, 21:04:18 »
Hola Lidia!
Hace rato que ando buscando como hacer que me calcule bien la correlación de dos vectores y veo que lo pudiste solucionar!
Si me podes dar una ayuda porque me da cualquier valor, aca esta parte del codigo:

fractional x[4]={Q15(0.1),Q15(0.2),Q15(0.3),Q15(0.4)};
fractional h[3]={Q15(0.1),Q15(0.2),Q15(0.3)};
fractional z[6];

fractional *px=&x;
fractional *ph=&h;
fractional *pz=&z;

pz=VectorCorrelate(4,3,pz,px,ph);
 
   for(j=0;j<7;j++){
   w=Fract2Float(z[j]);
      GotoxyLCD(1,2);
      sprintf(buffer2,"z=%f  %d ",w,t);
      putsLCD(buffer2);

      __delay_ms(500);}

lo que me debería dar es:  0    0.0300    0.0800    0.1400    0.2000    0.1100    0.0400 aproximadamente
pero me da:                      0.029     0.29    0.25    0    0    0.79
Agradecería mucho que me ayudes porque hace rato que vengo quemandome la cabeza con esto!
Gracias!


 

anything