Para este “hito” nos plantemos los siguientes objetivos:
- “Dar la vuelta” al ecualizador gráfico.
- Corregir el error de la fft, explicado en el blog anterior.
- Comprobar el correcto funcionamiento de la fft (y un poco de todo el programa)
mediante la respuesta activa del ecualizador gráfico.
Comenzamos “dando la vuelta” al ecualizador. Para ello lo que hicimos fue calcular el número
de pixeles que tiene la pantalla del dispositivo android disponibles para pintar, es decir, sin
contar los pixeles dedicados a los botones. A partir de ese valor calculamos la nueva esquina
superior del cuadrado, restándole a éste la longitud del rectángulo a pintar (la energía media
de la banda de frecuencias) empezándose así a dibujar las barras del ecualizador desde arriba.
El resto de parámetros permanecieron iguales. Este primer objetivo nos costó poco resolverlo.
El siguiente paso fue más complicado ya que no entendíamos porque la primera fft que se
realizaba nos daba valores correctos (valores en el rango de lo esperado) pero las siguientes
fft, el valor real de la fft de cada muestra crecía exponencialmente con valores negativos hasta
al final desbordar el float. Hicimos diferentes pruebas para reconocer que era lo que causaba
el error. La prueba que nos hizo descubrir cuál era el error, fue realizar la fft repetidas veces al
mismo array de muestras grabadas, sin darnos cuenta de que el método de la fft nos devolvía
la fft en ese mismo array, y observamos que ocurría lo mismo arriba explicado. Por tanto,
deducimos que lo que pasaba en nuestro caso era que no cambiaba el valor del array de las
muestras grabadas inicialmente, el cual introducimos como parámetro al método, sino que
siempre era la mismo, ya que el código de realiza fft era con lenguaje C y utilizaba punteros,
y al volver a llamar al método de la fft se quedaba con el array anterior introducido como
parámetro el cual contienía ahora la fft, realizándose así la fft de la fft de la ftt…de la muestra
incial grabada, sin utilizar el resto de muestras lo que era nuestro propósito.
Para solucionarlo, lo que hicimos fue crear el array de muestras grabadas dentro del
propio “while” donde se realiza todo el cálculo de la fft, energías y frecuencias y cambiar el
archivo C para que en vez de usar punteros a arrays usara esos mismos arrays. Ahora si nos
daba valores coherentes pero la aplicación cerraba alrededor de los 10 segundos sin previo
aviso. Pensamos que era problema de tiempo de ejecución como por ejemplo que no le daba
tiempo al método a realizar todos los cálculos antes de coger la siguiente muestra. Probamos
diversas soluciones como: cambiar las dimensiones de los arrays, comentar los códigos
cuyo tiempo de ejecución pudiese ser mayor… Después de todas estas pruebas nos dimos
cuenta de que el problema de que se cerrase la aplicación (sin previo aviso) no era de falta de
tiempo sino de falta de memoria. El dispositivo al quedarse sin memoria disponible cerraba la
aplicación. Este exceso de “gasto” de memoria era porque en cada vuelta de while se creaba
un nuevo array de muestras. Investigamos distintos métodos para solucionar este apartado
pero al final lo que hicimos fue asignar el valor null al array al final del código del while y luego
liberar memoria para que así lo eliminase con la instrucción: “System.gc();”.
Una vez hecho esto, el programa funcionaba sin ningún problema por tiempo indefinido, y
pudimos comprobar mediante sonidos que introducíamos en el micrófono del dispositivo
android que todo el proceso (incluido la fft) era correcto, porque las barras del ecualizador
gráfico se movían coherentemente a los sonidos.
El aspecto de la aplicación es el siguiente:
Una vez conseguidos los objetivos arriba mencionados y que
funcionará todo, nos propusimos los siguientes objetivos:
- - Calcular los parámetros de vibración, para ya
llevar a cabo la acción final de vibrar con ellos.
- - Ver qué frecuencia de vibración puede reconocer
nuestro sentido táctil.
- - Mejorar las barras del ecualizador gráfico:
quitar la continua, quitar el ruido(30 dB), escalar el resto de dB para que se
aprecie mayor cambio de energías en las bandas, colores…
No hay comentarios:
Publicar un comentario