PiEfSi de speech recognition

Started by Drumpi, February 12, 2010, 06:17:19 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Del proyecto, palpable, lo único que hay es lo que habeis visto en la descarga... bueno, hay bastante más: se pueden mover las gráficas, desplazarnos a lo largo de la misma...
Si en septiembre/octubre/medio noviembre estuve repasando apuntes, leyendo acerca de la Beagle, instalando SO... y luego medio noviembre con el motor de scroll tileado y Venturer para GP2X, y para rematar, el Doggy!!! :P

Pero vamos, que para Junio espero que esté, por la cuenta que me trae (la fecha tope es septiembre). Lo que veo más complicado es conseguir la base de datos de palabras, pues la que viene en la memoria de Grisendo es en inglés, y estoy buscando una en español, y sólo encuentro algunas sin terminar.
Voy a ver si puedo generar alguna con cosas básicas (números y direcciones), y si se puede ampliar, mejor, pero yo no contaría con nada espectacular :S
Que el programa que estoy haciendo es para eso, para ver hasta qué punto puedo reconocer letras o sílabas, o tengo que tirar de librería que contenga palabras, y si dependerá mucho o poco de la persona que hable, cómo le afectaría el ruido... que no las tengo todas conmigo. Que no soy programador, que soy teleco, que lo mío es el HW ;D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Drumpi

Bueno, me acabo de quedar pillado:
He estado mirando el código de la FFT (sí, voy lento, pero es lo más que me dejan en casa, entre una cosa y otra), y no entiendo lo que quiere decir lo siguiente (lo marco en negrita)

/**********************************************************/
/* fft.c                                                  */
/* (c) Douglas L. Jones                                   */
/* University of Illinois at Urbana-Champaign             */
/* January 19, 1992                                       */
/*                                                        */
/*   fft: in-place radix-2 DIT DFT of a complex input     */
/*                                                        */
/*   input:                                               */
/* n: length of FFT: must be a power of two               */
/* [b]m: n = 2**m[/b]                                            */
/*   input/output                                         */
/* x: double array of length n with real part of data     */
/* y: double array of length n with imag part of data     */
/*                                                        */
/*   Permission to copy and use this program is granted   */
/*   under a Creative Commons "Attribution" license       */
/*   http://creativecommons.org/licenses/by/1.0/          */
/**********************************************************/


Creo entender que significa que asignemos a n el valor de 2^m (dos elevado a m) ¿no?
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

DCelso

#32
no, y para marcar en negrita dentro de un "quote" o "code" tienes que usar código html osea <b> y </n> :D.

Si te digo que * , además de ser un operador binario de multiplicacion es un operador unario para extraer el valor de un puntero ¿te aclaro la respuesta?

Si fuese código c sería 2 por el valor que hay en la direccion a la que apunta m.
Pero como está en un comentario pues puede que sea una representación de elevado a como tu comentas. Tendrías que asegurarte viendo el código fuente que vendrá más abajo.

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

je, en este caso significa potencia... recuerden que en el viejo Spectrum o ZX-8*, ** significa potencia... y en el texto de arriba dice claro, "n debe ser una potencia de 2"...

cuando se quieren expresar en formulas matematicas dentro en textos electronicos las potencias, se suele usar "**".

viene de muchos años atras, ya me siento un viejo... :(
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Yo me imaginaba eso, es que no hay más info en el código ya que m es un valor de entrada a la función.
Lo estuve buscando por internet, pero lo más que encontré era que el operador ** no se puede sobrecargar, o definir, o algo así.

No te sientas viejo, Splinter, acabas de demostrar ser el más sabio del lugar :)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Drumpi

Por cierto, he terminado las funciones que generan los gráficos de la FFT... pero no funciona bien, mañana toca debug a lo salvaje.
Es que por más que busco, no encuentro el significado de los valores de salida. Se que sale un vector de valores complejos, cuyos módulos son lo que ando buscando (la amplitud de cada frecuencia), pero eso no me indica la frecuencia a la que representa.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

grisendo

#37
Se supone que tienes que hacer añadir ceros para hacer que el tamaño del vector entrada sea potencia de 2, y entonces hacer la FFT...

En las imágenes, el resultado es una matriz compleja cuadrada, donde las frecuencias altas estaban en el centro? esquinas?... creo que esquinas. De los valores complejos había que trabajar con su módulo (que era con lo que yo he trabajado únicamente) y con su fase.

Me imagino que en las ondas de sonido (unidimensionales), los valores de las frecuencias altas estarán en los lados de la onda compleja resultado, y los de las bajas en el centro... Entonces poniendo por ejemplo los valores centrales a cero estarías haciendo un filtro de paso alto, poniendo los valores laterales a cero, un filtro de paso bajo, etc...

Drumpi

No, si por la cantidad de valores no es, eso lo tengo controlado :D
Ya descubrí el problema, y es que al hacer los cálculos del módulo se me producía un overflow de datos y me daban números negativos que Bennu interpretaba como le daba la gana. He cambiado el tipo de datos de los arrays por floats y problema solucionado (aunque no me hace gracia trabajar con este tipo de datos).

El caso es que he obtenido una gráfica, creo entender que las frecuencias crecen de izquierda a derecha, porque he obtenido unos valores delta que muestran la clásica gráfica de una señal y sus diversos armónicos. Pero no termino de entenderla...
-La gráfica es casi idéntica, independientemente de la señal que pongo y de la posición inicial de análisis (aunque aun tengo que comprobar una cosa, porque hago un escalado en función del valor más grande, por lo que no veo los cambios globales).
-Veo las delta, pero no sé qué frecuencias representan. Según la cantidad de datos que analizo obtengo más o menos armónicos, pero no se el valor en la coordenada X.

En fin, ahora es cuando me toca emplear mi intuición y mis conocimientos de señales, pero entender esos valores de X sería una gran ayuda.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

grisendo

No sé con qué sonidos estás probando, pero si estás analizando siempre tu voz, lo más seguro que utilices el mismo tono. Intenta generar con algún aparato/aplicación señales sinusoidales de diferentes tonos (diferentes frecuencias) y ver qué resultados te salen en la transformada... o cantar xDD Creo que sonidos más graves tienen los mayores valores a la izquierda... ¿o la del sonido es simétrica como la de las imágenes?

Según tengo entendido, la FFT es periódica. No sé qué algoritmo utilizas exactamente para calcularla, pero creo que el resultado está normalizado. El hecho de que haya más valores intermedios (en el eje x) es porque se están utilizando más valores de cuantización, no sé si me explico... la onda completa de un sonido sería un periodo, si dura 1 segundo (T=1) esa onda es muy sencilla y puede expresarse en fourier con pocas frecuencias, si dura 100 años (T=100 años) esa onda es muy compleja (o puede serlo) y se necesita más precisión para representarla con fourier (mayor muestreo frecuencial).

Y luego para entender exactamente los valores X e Y hace falta ir un poquillo colocao, porque son todo exponenciales de complejos :D

No te fíes mucho de lo que te diga yo jeje, pero prueba cosas así para ver cómo funciona...
Si hay alguien que sepa más y ve que estoy metiendo la pata, que avise, porque estoy hablando de carrerilla xD

Drumpi

Hombre, no soy tonto: uso sonidos generados por mi editor de IT, concretamente el sonido de una ocarina, y el de una flauta. Uno de ellos representa una sinusoide, el otro son dos sinusoides sumadas ;D

Por lo que dices, me suena más a que la FFT podría ser la transformada de Fourier de una señal discreta, lo cual simplificaría las cosas y significa que la coordenada X indica un valor entre 0 y 2pi (tendría que repasar los apuntes para ver su significado real).

Pero bueno, mañana voy a coger y me voy a generar un wav A MANO de una sinusoide perfecta, a ver si me salta una única delta, como debería ser. Si no, tendré que crear un programa para generar señales a partir de su FFT :S

Bueno, para el que quiera echarle un vistazo, aquí teneis esto:
http://drumpi.se32.com/cosas/test.rar
No es gran cosa: desde el prg principal se carga un wav y se le calcula la FFT. Podeis cargar los wavs que querais y calcularle su FFT, yo prefiero hacerlo con el comando RUN desde la ventana de debug (debeis tener en primer plano el gráfico DEL WAV si quereis calcularle la FFT).
Dentro del programa, podeis usar el botón izquierdo del ratón para desplazar las ventanas y traerlas al frente, el botón central os permite desplazaros a lo ancho del wav, y cada segundo recalcula la FFT correspondiente a partir de la posición actual. Calcula la FFT para 1024 puntos.

El código es un poco "extraño", he intentado modularizarlo lo máximo posible (se resume en manejar una estructura que contiene dos tipos definidos por mi, una con los datos del wav y otro con los de la FFT... y aparte una lista de procesos que maneja, cada uno, una gráfica, que puede ser de un WAV o una FFT). Si alguien ve un error, espero que me lo comente, el código de la FFT prácticamente lo he copiado linea por linea y aun no me he puesto a hacer cálculos "a mano" (lo que sería una locura, la verdad).

En fin, espero que los que hayan entendido algo de lo que he dicho le vean algo más de sentido que yo.
PD: incluyo los wav con los que estoy probando.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Drumpi

Juer, me tiene frito.
No se por qué pero no me cuadran los resultados.

Finalmente sí, he mirado por internet y lo que se obtiene parece ser que es la transformada de Fourier para una señal discreta, por lo que los valores corresponden a un ciclo entre 0 y 2pi (pues después se repiten)... pero eso no me dice los valores de frecuencia, sigo buscando... y no quiero tener que instalar Matlab.

De todas formas, para probar he cogido y me he creado mi propio wav (sí, he hecho un sonido desde cero, a mano). Con una señal a cero me devuelve lo esperado, todo a cero. Si tiene un valor constante, me devuelve lo de siempre: una delta con sus armónicos... menos uno. Con una señal sinusoidal me devuelve lo de siempre, y con una suma de sinusoides (dos notas) igual, no hay cambios. No se si es que lo que vi en internet, de que se cuela un fenómeno ondulatorio de baja frecuencia sin saber por qué es lo que me está fastidiando o que no hago bien la transformada, no lo se.

Ahora investigo si puedo obtener los valores de frecuencia o si voy a tener que usar Matlab para hacer el análisis (aunque de todas formas, voy a tener que implementarlo luego todo en C, por lo que me da lo mismo) :S
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Drumpi

Bueno, he dado un pasito más:
He hallado un error en el código y lo he arreglado. Lo he subido a
http://drumpi.se32.com/cosas/prueba.rar
Con todo listo para funcionar.

La señal ya sale algo más normal, parece ser que sale una señal sinc, que se debe a tomar un número finito de valores... creo.
Lo que no entiendo es que, calculando la FFT, a pesar de que MACHACO los valores, aunque la señal se halle en el mismo punto, la FFT cambia y crece sin parar. Creía que era algo del funcionamiento del seno y del coseno (por eso de que devuelven números enteros en milésimas) pero entonces las gráficas devuelven cosas más raras aún :S

A ver si encontrais vosotros algún error, porque creo que es cosa del código, no de la teoría.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Windgate

Ojo, ojo, seno y coseno en Bennu devuelven float, entre -1.0 y 1.0 pero float, ¿No tendrás algún fallo ahí, no?

Por mi experiencia seno y coseno son suficientemente precisos... Aunque nunca me he puesto a dibujar gráficas, vaya.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

No esaba seguro y contemplé las dos posibilidades, aun así, lo repasaré, porque creo que hay algo que no anda muy fino en las conversiones FLOAT<->INT, o los INT no son tan precisos como requiere el programa, no lo se seguro, ya informaré sobre ello.
De todas formas, el código está ahi, por si alguien se anima a revisarlo ;D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)