martes, 20 de marzo de 2012

SIGUIENTE PASO


Objetivos:
- Importar un código en lenguaje C a nuestra aplicación android, mediante Cygwin y la herramienta NDK-build.
-Realizar la FTT de la señal grabada, calcular la energía de cada frecuencia de ésta y obtener la banda de frecuencia que contiene la mayor energía.

Lo primero que hicimos fue descargarnos una herramienta que fuese capaz de construir una librería android “.so” a partir de un código en lenguaje C, que fue el NDK-build. Para poder generarla necesitamos también instalar un terminal, en este caso, el Cygwin.

Todo esto era necesario ya que el código en C tenía un método que realizaba la FFT de una señal a partir de sus muestras y era justo lo que necesitábamos. La otra opción era realizarlo mediante el filtrado de la práctica normal pero la FFT nos abría un abanico de funcionalidades.

Lo primero que tuvimos que hacer fue crear un directorio “jni” dentro de nuestro proyecto “AudioSense”. En este directorio incluimos tanto el archivo “.mk”, donde definimos el nombre de la librería “.so” a crear y la ruta del fichero C, como el fichero C, a partir del cual creamos la librería y el cual contiene el método de la FFT.

Desde Cygwin, situados dentro de la carpeta “jni” arriba nombrada, ejecutamos el NDK-build, el cual nos genera en ese proyecto la librería deseada.

Para un correcto funcionamiento, en el código, tuvimos que declarar el método como “native” además de cargar la librería.

El primer problema que nos encontramos es que al “llamar” a la método realfft()  compilaba pero no era reconocido en la ejecución.

Para solucionar esto tuvimos que añadir algunos prefijos al nombre del método  para fijar mejor su ubicación y que fuese “reconocido” (y también a los métodos llamados dentro de éste) y añadir varios argumentos  al propio método (JNIEnv y jobject).

Volvimos a realizar el proceso arriba explicado desde el Cygwin y el método ya era reconocido tanto en la compilación como en la ejecución.

Una vez hecho todo esto, obtuvimos la FFT de la señal  mediante el método realfft(), al cual le pasábamos como argumento 257 muestras de la señal grabada. Este método nos devuelve 128 valores de la FFT de la señal repartidos entre 0 y 4KHz (tanto su parte real como su parte imaginaria).

A partir de estos valores, calculamos la energía en cada frecuencia y luego obtuvimos, mediante una media ponderada, la “frecuencia central” de la banda que acumula mayor energía. Mediante el valor de esta “frecuencia central”  y la energía total calcularemos los parámetros de vibración.

Nuestro siguiente objetivo es un ecualizador gráfico para comprobar la funcionalidad de todo lo arriba explicado.

No hay comentarios:

Publicar un comentario