domingo, 5 de mayo de 2013

Entrada 11: Adaptación de scripts de Matlab a Octave I - Abril 2013

Durante las últimas semanas (desde Semana Santa hasta finales de Abril) nos hemos repartido el trabajo y nos hemos enfocado en hacer una interfaz gráfica y adaptar los algoritmos a Octave.

Yo (Diego) me estoy encargando de arreglar las incompatibilidades entre Matlab y Octave. El objetivo es prescindir de Matlab, ya que al hacerlo en Octave podremos (en principio) ejecutar todo desde la Raspberry Pi, sin necesitar el servidor; y por otro lado no necesitaremos software privativo (bastante caro, además).

Para corregir los errores hemos ido ejecutando el programa principal, sacando la salida del programa (la cual estaba redirigida a /dev/null) por pantalla y viendo qué funciones daban problemas, buscando los fallos y por último, corrigiéndolos.


HDF5

El primer fallo apareció a la hora de tratar con ficheros hdf5. Este tipo de ficheros se utilizan para guardar grandes cantidades de información estructurada (por ejemplo en variables). Matlab tiene un conjunto de funciones dedicadas a cargar (hdf5read), escribir (hdf5write) u obtener información (hdf5info) de estos ficheros. Estas funciones no están implementadas en Octave, por lo que tuvimos que buscar una forma alternativa para manejar este formato.

Googleando, encontramos que Octave sí que podía trabajar con ficheros hdf5, es más, estaban más integrados que en Matlab, ya que simplemente usando la función load (fichero), se cargaban las variables. A la hora de guardar los datos, igual (añadiendo la opción -hdf5 y diciendo qué variables quieres que guarde): save -hdf5 fichero variables. Aquí apareció otro problema, ya que necesitábamos guardar el fichero con el nombre del archivo de audio del cual se había hecho la parametrización, pero en Octave, al guardar no deja poner como nombre de fichero una variable (ya que no la sustituye por su valor). La solución fue crear un string con el comando a ejecutar creado a partir de la función sprintf y ejecutarlo.

Por último, necesitábamos usar la función hdf5info para comprobar si el fichero tenía una variable en concreto. Como load carga por defecto todas las variables, sustituimos la sentencia que contiene hdf5info por una comprobación de que la variable no sea 0 (previamente hemos creado la variable y la hemos igualado a 0).

Así, los cambios son:

  • hdf5read y hdf5info:
-Versión Matlab

MMF.ALFA=double(hdf5read(file, '/ALFA')');
MMF.COV=double(hdf5read(file, '/COV'));
MMF.MEAN=double(hdf5read(file, '/MEAN'));

MMFinfo=hdf5info(file);
Datasets={MMFinfo.GroupHierarchy.Datasets.Name};

if any(ismember(Datasets,'/hlda'))
   MMF.hlda=double(hdf5read(file, '/hlda'));
end
-Versión de Octave
hlda=0;
load (file) MMF.ALFA=double(ALFA); 
MMF.COV=double(COV); 
MMF.MEAN=double(MEAN);   
if(hlda!=0)      
    MMF.hlda=double(hlda);   
end
  • hdf5write:
-Versión Matlab

hdf5write(statsfile, '/N', single(N),'/F', single(F(:)));

-Versión Octave
str = sprintf("save -hdf5 %s N F", statsfile);
eval(str);
 

No hay comentarios:

Publicar un comentario