Autor Tema: vectores y matrices, librería dsp.h  (Leído 9452 veces)

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

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
vectores y matrices, librería dsp.h
« en: 27 de Enero de 2007, 22:42:55 »
 hola amigos del foro, ahora estoy revisando la librería dsp.h incluida en el C.30 y tratando de manejar la parte de vectores y matrices, la exlicación de esta librería se encuentra en la misma dsp.h o en el manual de C30 dado por Microchip, lo pueden descargar de aquí.

https://ssl.rapidshare.com/cgi-bin/collectorszone.cgi?savedfiles=1&forbiddenfiles=0

 El ejemplo que estoy poniendo, dos operaciones con vectores y una con matrices, lo he hecho de acuerdo a como me pide la librería dsp.h, declarando los vectores y matrices y llamando a las funciones, sin embargo no compila, pienso que debo estar cometiendo un error al llamar a las funciones o al declarar mal los vectores o matrices.

 Si porfavor lo podrían compilar  a ver que error estoy cometiendo.

 El ejemplito es este:

Código: [Seleccionar]
#include <p30f4011.h>
#include <dsp.h>

int main(void)
{
 // dos operaciones con vectores
 // ----------------------------

 // copiar vectores
 fractional dstV[4]
 fractional srcV[4] = {1.1, 2.2, 3.3, 4.4};
 int n=3;
 // dstV[n] = srcV[n]  ;n=<0,3>
 VectorCopy (n, *dstV, *srcV);

 // sumar vectores
 int n1=4; 
 fractional dst1V[5];
 fractional srcV1[5] = {4.2, 5.3, 4.9, -2.5, 8.4};
 fractional srcV2[5] = {8.9, 2.8, -4.9, -2.3, 4.8};
 // dst1V[n] = srcV1[n]+srcV2[n]  ;n1=<0,4>
 // If the absolute value of srcV1[n] + srcV2[n] is larger than 1-2^-15,
 // this operation results in saturation for the n-th element.
 VectorAdd (n, *dst1V, *srcV1, *srcV2);
 
 // una operaciones con matrices
 // ----------------------------
 // One word of memory (two bytes) is used to store the value of each element,
 // and this quantity must be interpreted as a fractional value in Q.15 format.

 // Matriz transpuesta
 int numRows=3;
 int numCols=3;
 fractional dstM[3][3];
 fractional srcM[3][3] = {1, 2, 3 ;4, 5, 6 ;7, 8, 9};
 // dstM[i][j] = srcM[j][i], 0 = i < numRows, 0 = j < numCols.
 MatrixTranspose (numRows, numCols, *dstM, *srcM);

 // gracias.

}
control de movimiento

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: vectores y matrices, librería dsp.h
« Respuesta #1 en: 28 de Enero de 2007, 03:34:01 »
Renatox, para programar en C hay que tener muy en cuenta los signos de puntuación. Cualquier pequeño cambio de uno por otro da al traste con una compilación.

Los errores que he corregido en tu programa:
- faltaba ";" en la línea 10
- habías metido dos ";" en vez de "," en la línea 35

Una vez hecho eso, ya sale:
BUILD SUCCEEDED: Sun Jan 28 07:33:55 2007

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: vectores y matrices, librería dsp.h
« Respuesta #2 en: 01 de Febrero de 2007, 19:37:46 »
 Nocturno, hize lo que me dijiste y ahora si me compila, pero me salen varios "warning", lo que me sale en la compilación es esto:

Código: [Seleccionar]
Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-gcc.exe" -mcpu=30F4011 -c -x c "pruebas dsp.c" -o"pruebas dsp.o" -g

pruebas dsp.c: In function `main':
pruebas dsp.c:14: warning: passing arg 2 of `VectorCopy' makes pointer from integer without a cast
pruebas dsp.c:14: warning: passing arg 3 of `VectorCopy' makes pointer from integer without a cast
pruebas dsp.c:24: warning: passing arg 2 of `VectorAdd' makes pointer from integer without a cast
pruebas dsp.c:24: warning: passing arg 3 of `VectorAdd' makes pointer from integer without a cast
pruebas dsp.c:24: warning: passing arg 4 of `VectorAdd' makes pointer from integer without a cast

Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-gcc.exe" -Wl,"F:\Microchip\dsPIC\dsp\pruebas dsp.o","C:\Archivos de programa\Microchip\MPLAB C30\lib\libp30F4011-elf.a","C:\Archivos de programa\Microchip\MPLAB C30\lib\libp30F4011-coff.a","C:\Archivos de programa\Microchip\MPLAB C30\lib\libdsp-coff.a","C:\Archivos de programa\Microchip\MPLAB C30\lib\libpic30-coff.a",-L"C:\Archivos de programa\Microchip\MPLAB C30\lib",--script="C:\Archivos de programa\Microchip\MPLAB C30\support\gld\p30f4011.gld",-o"pruebas.cof",-Map="pruebas.map"

Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-bin2hex.exe" "pruebas.cof"

Loaded F:\Microchip\dsPIC\dsp\pruebas.cof.

BUILD SUCCEEDED: Thu Feb 01 11:45:56 2007

Los archivos .h y de cabecera que adheri son estos:

- En Source Files.- pruebas dsp.c
- En Header Files.- dsp.h
- En Library Files.- libpic30-coff.a   libp30f4011-coff.a   libpic30f4011-elf.a   libdsp-coff-a 
- En linker Scripts.- p30f4011.gld

 El archivo corregido es este:

Código: [Seleccionar]
#include <p30f4011.h>
#include <dsp.h>

int main(void)
{
 // dos operaciones con vectores
 // ----------------------------

 // copiar vectores
 fractional dstV[4] ;
 fractional srcV[4] = {0.1, 0.2, 0.3, 0.4};
 int n=3;
 // dstV[n] = srcV[n]  ;n=<0,3>
 VectorCopy (n, *dstV, *srcV);

 // sumar vectores
 int n1=4; 
 fractional dst1V[5] ;
 fractional srcV1[5] = {0.2, 0.3, 0.4, -0.5, 0.4};
 fractional srcV2[5] = {0.4, 0.5, -0.5, -0.31, 0.2};
 // dst1V[n] = srcV1[n]+srcV2[n]  ;n1=<0,4>
 // If the absolute value of srcV1[n] + srcV2[n] is larger than 1-2^-15,
 // this operation results in saturation for the n-th element.
 VectorAdd (n1, *dst1V, *srcV1, *srcV2);
 
 // una operaciones con matrices
 // ----------------------------
 // One word of memory (two bytes) is used to store the value of each element,
 // and this quantity must be interpreted as a fractional value in Q.15 format.

 // Matriz transpuesta
 int numRows=3;
 int numCols=3;
 fractional dstM[3][3] ;
 fractional srcM[3][3] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9};
 // dstM[i][j] = srcM[j][i], 0 = i < numRows, 0 = j < numCols.
 MatrixTranspose (numRows, numCols, *dstM, *srcM);

}

 Cambié los valores de los vectores porque en el formato Q15 no se permite números que estén fuera del rango -1 a 1, los vectores resultado o destino tampoco deben de salirse de este rango.

 Cuando lo simulo paso a paso los resultados son siempre cero, no cambian, ahora que estaré haciendo mal.
« Última modificación: 01 de Febrero de 2007, 20:10:27 por renatox_ »
control de movimiento

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: vectores y matrices, librería dsp.h
« Respuesta #3 en: 01 de Febrero de 2007, 19:42:37 »
 Por ejemplo si se tienen muestras que van desde los rangos de -10 a 10, entonces para poder almacenarlos en un vector hay que dividir todos los valores entre 10 para que estén en el rango de -1 a 1, y procurando que las operaciones entre vectores y matrices no pasen de este rango.
control de movimiento

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: vectores y matrices, librería dsp.h
« Respuesta #4 en: 02 de Febrero de 2007, 02:00:18 »
Asegúrate que "fractional" es un tipo que admita decimales, como float o double.
Creo recordar que viene definido en dsp.h

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: vectores y matrices, librería dsp.h
« Respuesta #5 en: 23 de Febrero de 2007, 03:07:29 »
 :-/ hola, por fin he dado mis primeros pasos en el manejo de la librería dsp.

La librería dsp utiliza el formato fractional para realizar todas sus funciones, es decir utilizan el formato 1.15 o Q15, que quiere decir que un bit (bit 16) es usado para representar la parte entera y los otros 15 bits la parte fraccionaria. Si el bit 16 es 1 el número es negativo y si es cero es positivo.

 Pueden ver la diferencia entre los dos formatos:

- Tipo entero 16 bit -> -32768 a 32767
- Tipo fraccionario -> -1 a 1-(2^-15)  con resolución = 3.052*10^-5

 esto quiere decir que,

<0x0000;0x7FFF> = <0;32767> = <0;0.999969482>, y
<0x8000;0xFFFF> = <32768;65535> = <-1;(0-2^-15)>

Aquí está un pequeño programa de ejemplo para copiar vectores.

Código: [Seleccionar]
#include <p30f4011.h>
#include <uart.h>
#include <libpic30.h>
#include "dsp.h"

extern int __C30_UART;

void configUSART2()
{
  //9600 baudios, 8bits,
}

int main(void)
{
 configUSART2();
 _TRISD1=0;
 float x[4];
 unsigned int j;

 __C30_UART=2;  //Para utilizar la USART2.
 // copiar vectores
 fractional srcV[4] = {Q15(-1.0), Q15(-0.00004), Q15(-0.45), Q15(0.3345)};
 fractional dstV[4];
 int n=4;
 // dstV[n] = srcV[n]  ;n=<0,3>
 VectorCopy (n, dstV, srcV);

 for (j=0;j<=3;j++)
  {
     x[j] = Fract2Float(dstV[j]);               // demora 6061 ciclos de instrucción
     printf("Valor variable x[%u]= %.5f \n\r",j,x[j]);
  }

 while (1)
  {
     _RD1=1;
  }
}


 La función ( x[j]=Fract2Float(dstV[j]) ), incluida en la librería dsp, realiza el cambio del formato Fractional a Float, de esta forma el vector que aparece en el hiperterminal será:

x[4] = {-1.0, -0.00004, -0.45, 0.3345};     

 Este vector ya es de tipo float, luego de esto se puede hacer el escalamiento correspondiente para que estos datos decimales representen otra vez a nuestras variables originales.

 Para correr este programa es necesario hacer una pequeña modificación en el archivo dsp.h en esta parte,

/* Generic function prototypes. */
#define Q15(X) \
   ((X < 0.0) ? (int)(32768*(X) - 0.5) : (int)(32767*(X) + 0.5)) ;

 Deben quitarle el punto y coma final.

 Al parecer a los programadores del C30 se les pasó este pequeño detalle, que piensan corregir para la versión V3.00.

 Para más información pueden entrar a este enlace,

http://forum.microchip.com/tm.aspx?m=229790

Estaré atento a sus consultas.
 
Saludos.

control de movimiento

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: vectores y matrices, librería dsp.h
« Respuesta #6 en: 23 de Febrero de 2007, 18:31:53 »
 La instrucción Fract2Float() toma 6061 ciclos de intrucción, esto es demasiado, ahorramos tiempo utilizando la librería dsp, pero cuando cambiamos de formato lo malogra todo, lo mismo que nada.

 Esta instrucción demora tanto porque en una de sus operaciones incluye la función  "pow(x,y)", esta función la probé con pow(2,3) en otro programa, que puse en este subforo de dspic, y demora más de 5000 ciclos, pero esto tiene solución. Pongo aquí el código contenido en el archivo Frct2Flt.c .

Código: [Seleccionar]
/* Local headers. */
#include "dsp.h" /* testing interface */

/*...........................................................................*/


float Fract2Float ( /* Converts fractional into float */
   fractional aVal /* fract value in range {-1, 1-2^-15} */
) {

#if DATA_TYPE==FRACTIONAL /* [ */

   /* Local declarations. */
   
   // este es el culpable de tanta demora.
   double scale = pow (2.0, -15.0); /* 2^(-15) */
   
   long int fullRange = 1L<<16; /* 2^(16) */
   long int halfRange = 1L<<15; /* 2^(15) */
   double decimalVal = 0.0;

   /* Convert. */
   if (aVal >= halfRange) {
      aVal -= fullRange;
   }
   decimalVal = ((double) aVal)*scale;

   /* Return decimal value in floating point. */
   return ((float) decimalVal);

#else /* ] [ */

   /* Return input value in floating point. */
   return ((float) aVal);

#endif /* ] */

} /* end of Fract2Float */

 La solución sería no usar esta intrucción, y usar directo el valor del resultado, es decir;

Código: [Seleccionar]
comentar:
// double scale = pow(2.0, -15.0);
comentar;
// decimalVal = ((double) aVal)*scale;
y reemplazarlo por;
   decimalVal = ((double) aVal)*0.000030517578125;

 Luego de esto hay que llevar los archivos dsp.h y Frct2Flt.c, ya modificados, a nuestra carpeta de proyecto, y adherir dsp.h a "Header Files" y Frct2Flt.c a "Source Files". Con esta modificación la instrucción Fract2Float()  demora solo 265 ciclos de instrucción.

 Lo comprobé con el hiperterminal y me manda el vector correcto.
control de movimiento

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: vectores y matrices, librería dsp.h
« Respuesta #7 en: 24 de Febrero de 2007, 02:17:35 »
Excelente solución de ahorro de ciclos. Es curioso que la propia Microchip cometa esos errores "de bulto".


 

anything