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