lunes, 23 de febrero de 2009

Hola Mundo con octave y c++

Requisitos:
Tener instalado octave, octave-headers y build-essential

En nuestro editor de texto predilecto (vim) escribimos lo siguiente


#include <octave/oct.h>
DEFUN_DLD(miHolaMundo, args, ,
"Sirve para imprimir un N Holas Mundo " )
{
unsigned int N = args(0).int_value(); //El argumento 0 lo convertimos a entero y
//se lo almacenamos en N

for(int i = 0; i<N;i++)
octave_stdout<<"Hola Mundo"<<endl;

return octave_value(0);
}

En la primera línea incluimos las cabeceras de octave y el la segunda definimos que nombre tendrá nuestra función. Guardamos el archivo con el mismo nombre de la función (miHolaMundo.cc) y compilamos

mkoctfile miHolaMundo.cc

Esto nos va a generar dos archivos:

miHolaMundo.o miHolaMundo.oct

donde miHolaMundo.oct es la función que acabamos de hacer.

Inicamos el octave y probamos:

octave:1> help miHolaMundo
Sirve para imprimir un Hola Mundo /home/s/proyectos/c/octave/miHolaMundo.oct

Additional help for built-in functions and operators is
available in the on-line version of the manual. Use the command
`doc ' to search the manual index.

Help and information about Octave is also available on the WWW
at http://www.octave.org and via the help@octave.org
mailing list.
octave:2>
octave:2> miHolaMundo(1)
Hola Mundo
ans = 0
octave:3> miHolaMundo(4)
Hola Mundo
Hola Mundo
Hola Mundo
Hola Mundo
ans = 0
octave:4>


El que sigue es parte del código para probar una Memoria RAM que esta dentro de un FPGA, lo recorte sólo para mostrar, como se usan Complejos y como se retorna a octave una o más variables. Esta función tiene como parametros de entrada un Vector Complejo, tamaño de la palabra y tamaño de la parte fraccional para convertir a punto fijo los valores del vector comlejo.



#include <octave/oct.h>
#include <iostream>
#include <fstream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <oct-rand.h>
#include <oct-cmplx.h>

//inline void dec2bin(unsigned int a,unsigned int width_word,char * cadena);
inline int to_fixed(double data_in, unsigned int QW,unsigned int QF);
inline double f2d(int Dfixed,unsigned QF);

DEFUN_DLD (MemTest,args, ,
"Probar RAM FPGA via RS232\n")
{

ComplexColumnVector Data = args(0).complex_column_vector_value();
int len = Data.length();
ComplexColumnVector DataF=Data;
ComplexColumnVector DataR=Data;
unsigned int QW=args(1).int_value();
unsigned int QF=args(2).int_value();

for (int i = 0; i<len;i++) {
real(DataF(i))=f2d(to_fixed(real(Data(i)),QW,QF),QF);
imag(DataF(i))=f2d(to_fixed(imag(Data(i)),QW,QF),QF);
};

octave_value_list retval;

retval(0) = octave_value(DataF);
retval(1) = octave_value(DataR);
return retval;
}

inline int to_fixed(double data_in, unsigned int QW,unsigned int QF)
{
int x_0=0,j=1;
//we need to convert to double to QW and QF because oct.h only have pow(double,double)
if(data_in<0){ int x_0=pow(2.0,double(QW)); };
return int(x_0+pow(2.0,double(QF))*data_in);
}
inline double f2d(int Dfixed,unsigned QF)
{
return double(Dfixed)/(pow(2.0,double(QF)));
}

Compilamos con mkoctfile y probamos

octave:1> x=randn(4,1)+j*randn(4,1)
x =

-0.80972 + 3.54049i
-0.38686 - 0.35778i
-0.45699 + 0.05577i
-0.48280 + 1.01243i

octave:2> MemTest(x,13,10)
ans =

-0.80957 + 3.54004i
-0.38672 - 0.35742i
-0.45605 + 0.05566i
-0.48242 + 1.01172i

octave:3> [y z]=MemTest(x,13,10)
y =

-0.80957 + 3.54004i
-0.38672 - 0.35742i
-0.45605 + 0.05566i
-0.48242 + 1.01172i

z =

-0.80972 + 3.54049i
-0.38686 - 0.35778i
-0.45699 + 0.05577i
-0.48280 + 1.01243i



Como se puede ver, el primer resultado que nos regresa nuestra función es equivalente en punto fijo de 13 bits de los cuales 10 bits son para la parte fraccional y 1 para el signo.

lunes, 16 de febrero de 2009

Mi Escritorio Ubuntu en la Acer One

Por fin tengo este juguetito para divertirme un rato y este es mi ubuntu con el compiz


Acer One:
Intel(R) Atom(TM) N270 a 1.6 Ghz
RAM: 1Gb
HD: 120 Gb

En el fondo se ve el Firefox, el gimp y la terminal ejecutando el comando top