Sobre la imprecisión de la transformada de fourier

oasys
#16 por oasys el 07/12/2016
Si hubiera sacado conclusiones no lo hubiera consultado.

Yo ya tenía entendido que se podía reconstruir cualquier sonido con la inversa, pero no me cuadraba con lo de que no pudiera examinar una frecuencia determinada con precisión en un tiempo muy concreto. He examinado el algoritmo de la transformada discreta a ver si veía el problema, y ya lo he encontrado.

El problema partía de la base de que en todas las instrucciones de uso de la función FFT se indica que el buffer de entrada ha de ser el mismo de salida. De hecho en muchas funciones que he encontrado en internet y en librerías, se hace así. Supongo que es porque están diseñadas para espectograma, o no lo sé la verdad, no entiendo esa limitación. Sé que para la transformada rápida los tamaños han de ser potencia de 2, pero eso tampoco tendría que ser una limitación, se podría elegir 1, 2, 4, 8 frecuencias.

He buscado alguna información y he encontrado esto, a la pregunta de "Why output of FFT is same as input data size ?", una de las respuestas es esta:

I find it strange that libraries don't implement arbitrary bin counts, but I suppose I would shrug and say it's probably because they're written for people dealing with much more data than you.

El caso es que es lo que me estaba liando.

El problema de la resolución en esas implementaciones se debe a que utilizan un bucle que comprueba las frecuencias intermedias dividiendo el tamaño de la muestra. Así que de ese modo obtenías un número concreto y limitado de frecuencias intermedias del mismo tamaño que el buffer de entrada, y por tanto para obtener más cantidad de frecuencias intermedias (resolución), el buffer de muestras debía ser más grande, lo que hace perder precisión en el tiempo.

Supongo que se podrá hacer también con la FFT, pero yo lo he comprobado con la DFT que es más simple, lo que hace es multiplicar cada sample por el seno y coseno de una frecuencia * PI * 2, y lo suma a dos números, real e imaginario, que luego hay que convertir con la fórmula de la distancia (la del teorema de pitágoras), y te da la distancia (en este caso el nivel de la frecuencia).

Si se hace esa operación con una frecuencia concreta, y sobre cualquier número de muestras te da la amplitud con toda la precisión que tenga la muestra en el tiempo.

Así que creo que esto se ha resuelto, y ya soy feliz :-)
Subir
vagar
#17 por vagar el 07/12/2016
No hay diferencias funcionales entre la DFT y la FFT, la FFT es sólo un algoritmo para calcular la DFT de forma más eficiente. Da exactamente el mismo resultado que una DFT cruda, sólo que tarda menos en hacerlo.

No me queda claro si ves bien la diferencia entre "evolución temporal del valor de la señal" y "evolución temporal del espectro de la señal".

Para sacar con la DFT N puntos en frecuencia necesitas N puntos en el tiempo. Teniendo en cuenta que el espectro te sale simétrico, tienes N/2 puntos usables entre 0 y Fs. Por ejemplo, a Fs=44.1 kHz necesitarás 44100 muestras para obtener 44100 bandas (bins) que te dan la energía contenida entre 0 Hz y 1 Hz, entre 1 Hz y 2 Hz... hasta entre 22049 Hz y 22050Hz, y sus correspondientes valores de frecuencia negativa.

Si usas menos puntos (menos tiempo de señal) tendrás menos bandas de frecuencia (menos resolución espectral), y viceversa. Si quisieras más resolución espectral para esa ventana de tiempo podrías conseguirla sobremuestreando.

Este cálculo te da el espectro de ese cachito de señal ("contaminado" por la ventana que uses para recortarlo de la señal total).

Si ahora quieres analizar la evolución de cada una de esas bandas, lo puedes hacer con la resolución temporal que quieras. Por ejemplo, si mueves esa ventana de 44100 muestras una sola muestra en el tiempo, obtendrás un nuevo espectro simétrico de 44100 puntos que describe cómo ha cambiado en 1/44100 = 22.7 us. Si quisieras incluso más resolución temporal, pordrías hacerlo también sobremuestreando la señal.
Subir
oasys
#18 por oasys el 07/12/2016
El problema es que las implementaciones están diseñadas para cubrir todo el espectro, entonces para un espectro de 22050, se necesita al menos 44100 muestras, un segundo de tiempo a ese muestreo.

Pero es porque se presupone que puede haber una señal de hasta 1Hz, que no cabría en menos de un segundo.

Sin embargo se puede examinar por ejemplo una décima de segundo si ignoramos frecuencias menores de 10hz

Si ahora yo quiero examinar un grupo de armónicos de 100 a 200 hz, puedo incluso hacer la ventana más pequeña y centrarme en un tiempo concreto.

Y esto es lo que entiendo y me extrañaba que no se pudiera hacer, precisión en tiempo y frecuencias en una sola captura, y he visto que se puede hacer, pero las implementaciones "normales" por lo que se ve pues no lo tienen en cuenta.

Tu dices que se puede reconstruir la señal a partir de sucesivas capturas de grandes muestras desplazadas en el tiempo, y supongo que así se puede hacer la reconstrucción, pero no es lo que a mí me intrigaba.
Subir
vagar
#19 por vagar el 07/12/2016
oasys escribió:

El problema es que las implementaciones están diseñadas para cubrir todo el espectro


Porque no se sabe a priori en qué parte del espectro puede alguien estar interesado, pero tú puedes hacer tu propia implementación selectiva si te merece la pena (lo más normal es que no te la merezca, porque las librerías están muy optimizadas algorítmicamente y con respecto al hardware).

dac5d83db38d0284477c382e26bbc94d167b597b

Ésta es la fórmula (no optimizada) de la DFT, simplemente calcúlala para los valores de k que consideres oportunos.

oasys escribió:
para un espectro de 22050, se necesita al menos 44100 muestras, un segundo de tiempo a ese muestreo.


Si quieres una resolución de 1 Hz. Si te vale con menos, te hacen falta menos. Por ejemplo, a partir de un buffer de 8 muestras sacarías un espectro con información agregada de las bandas 0-5512.5, 5512.5-11025, 11025-16537.5 y 16537.5-22050.

O podrías sobremuestrear x16 y te valdría 1/16 de segundo para conseguir las 44100 muestras necesarias para esa resolución de 1 Hz.

oasys escribió:

Pero es porque se presupone que puede haber una señal de hasta 1Hz, que no cabría en menos de un segundo.


En realidad no hace falta que quepa un periodo entero de la componente para poder detectar su presencia, pero es cierto que cuanto más periodos se tengan más fiable es su detección. En cualquier caso en aplicaciones de sonido las frecuencias inferiores a 20 Hz (T=50 ms) son irrelevantes.

oasys escribió:

Tu dices que se puede reconstruir la señal a partir de sucesivas capturas de grandes muestras desplazadas en el tiempo, y supongo que así se puede hacer la reconstrucción, pero no es lo que a mí me intrigaba.


El problema de la reconstrucción es poco relevante, porque sólo en situaciones muy raras se va a dar el caso de que sólo dispones de la representación espectral. La transformada inversa se suele usar cuando se hace procesamiento en el dominio de la frecuencia, y lo que reconstruyes no es la señal original, sino la señal procesada. En cualquier caso, para señales limitadas en banda siempre se puede reconstruir con total exactitud (salvo limitaciones tecnológicas, como errores de precisión) el fragmento de señal del que se tengan datos espectrales.

Y yo no lo digo, lo dice gente mucho mejor preparada que yo, me limito a transmitir lo aprendido de ellos, y ellos a transmitir lo que dicen las matemáticas que describen el proceso.
Subir
oasys
#20 por oasys el 18/12/2016
he visto que existe la STFT

https://en.wikipedia.org/wiki/Short-time_Fourier_transform

Pero sigue igual, el mismo rollo de la FT, no es perfecto, ni elegante, ni nada de lo que yo siempre he imaginado.

Alguien escribió:

One of the pitfalls of the STFT is that it has a fixed resolution. The width of the windowing function relates to how the signal is represented—it determines whether there is good frequency resolution (frequency components close together can be separated) or good time resolution (the time at which frequencies change). A wide window gives better frequency resolution but poor time resolution. A narrower window gives good time resolution but poor frequency resolution. These are called narrowband and wideband transforms, respectively.


Quizás es que yo me había montado la película por el hecho de que siempre he oído que Fourier decía que todo sonido se puede descomponer en ondas senoidales. Y yo me dije, esto es genial, para eso debe ser la transformada esa famosa!. Cojo un sonido y lo descompongo en 500 ondas o las que quiera según la precisión o rango de frecuencias que me interese, ondas que puedo examinar en cada millésma, eliminar, y modificar tranquilamente.

Pues no, no es para eso, a mí lo que me sale cuando paso la transformada es un batiburrillo de picos que te dicen que por ahí más o menos hay nivel, y luego encima con el tema de que hay que hacer una ventana para que sea continúa el destrozo ya es total.

O hay algo que todavía no he encontrado y se me escapa, o nos ha tomado el pelo el tal Fourier ese xD
Subir
Plodustol Pegalups
#21 por Plodustol Pegalups el 18/12/2016
oasys escribió:
O hay algo que todavía no he encontrado y se me escapa, o nos ha tomado el pelo el tal Fourier ese
Me da a mí que va a ser la opción A.
Subir
oasys
#22 por oasys el 20/12/2016
Bueno, pues según parece la técnica ideal sería el Sliding DFT

https://www.dsprelated.com/showarticle/776.php
Subir
Oudeis Eimi
#23 por Oudeis Eimi el 20/12/2016
#20

A ver, creo que entiendo tu problema, y si es así ya te han respondido, aunque quizá no en la forma que esperabas.

Tu problema es el siguiente: quieres obtener una representación de la variación en amplitud de cada armónico de una señal, más o menos lo que hace el oído, y has pensado que la transformada de Fourier (en particular en la implementación numérica conocida como FFT) era la herramienta para ello.

Como no sé de antemano cuál es tu nivel de conocimientos de mates y acústica, voy a intentar una explicación elemental - puede que resulte demasiado simple para ti, si es así discúlpame ;-)

A ver: ciertamente es posible analizar y reconstruir una señal (bajo ciertas condiciones matemáticas que en el mundo real se cumplen virtualmente siempre) como suma de lo que se llaman "funciones base", por ejemplo ondas senoidales. Es lo que afirma el teorema de Fourier, y es cierto.
Ahora bien, dicha representación no es lo que estás buscando, y no lo es por la razón siguiente (hablando para concretar de señales acústicas, que son funciones en el "espacio de tiempos", es decir, una función p(t)): lo que hace la transformada de Fourier es darte una representación P(w) en el espacio de frecuencias de TODA la señal original. Ahí por supuesto no tienes ninguna dependencia temporal, no hay detalles de cómo cambia la señal original en el tiempo (aunque se puede reconstruir a partir de su transformada realizando la operación inversa).

Por ejemplo, usando la FFT para concretar, lo que haces es muestrear la señal original para obtener una tabla pi, i = 1 ... N, con N valores (típicamente N es una potencia de 2 en el caso de la FFT, aunque no todos los algoritmos exigen esto), y aplicas el algoritmo FFT para obtener otra tabla Pk DEL MISMO TAMAÑO QUE LA ORIGINAL, es decir de N entradas (cada entrada aquí serán dos números en coma flotante ya que el resultado son números complejos). La nueva tabla Pk contiene toda la información contenida en la original pi, pero no puede obtenerse hasta haber analizado la señal original al completo.

Ahora bien, si lo que buscas es algo parecido a lo que hace el oído o muchos analizadores de espectro, esa técnica no te vale, ya que lo que necesitas es un análisis "instantáneo" de las frecuencias contenidas en la señal en cada instante determinado. Para ello hay varias técnicas, una de ellas consiste en seguir usando la FFT pero con un "ventaneado", es decir, para cada "instante" de la señal muestreada ti, correspondiente a la muestra pi, i = 1 ... N, tomas un "cachito" de la señal que contenga un número de muestras delante y detrás (ignoramos el problema del primer y el último punto). Cada pequeño segmento de muestra, lo que se llama una "ventana", contiene por tanto un trocito de la muestra original centrado en el instante que nos interesa (a veces se hace que la amplitud de las muestras iniciales y finales sea más pequeña que las del centro de la "ventana" para darles menos peso en el análisis posterior). Y a cada uno de esos trocitos se le somete a la FFT, obteniendo un "espectro" para ese instante.

Ahora bien, tal como comentas, existe una relación inversa entre la resolución espectral de cada ventana y su duración temporal. Esto es, cuanto más estrecha sea cada ventana, más resolución temporal tendrás pero menos detalle habrá en el espectro de esa ventana, y viceversa. Esto es una limitación no sólo de la técnica de Fourier propiamente dicha (aunque para estos usos existen otras más apropiadas que reducen algo este problema), sino del mundo en el que vivimos. Pero no tiene necesariamente que ser un problema en la práctica - el oído humano (y de cualquier otro animal) no posee resolución infinita ni en el tiempo ni en la frecuencia.

Ejemplo práctico: vas muestreando tu señal (previo filtrado) a 44 kHz y vas tomando una ventana cada décima de segundo, cada ventana va a medir una décima de segundo y tener 4400 muestras; si realizas una FFT sobre dicha ventana vas a obtener un espectro de 4400 puntos con una precisión de 10 Hz que se extiende de 0 a 22 kHz. 10 Hz no es una resolución tremenda, pero puede servir para visualizar un espectrograma (una representación frecuencia-tiempo) o para un analizador de espectro en "tiempo real", por ejemplo.
Subir
vagar
#24 por vagar el 20/12/2016
Sí es la herramienta para ello, pero hay que entenderla y saber manejarla, en lugar de poner a caldo al pobre Fourier. Ya se le ha explicado cómo ganar precisión, pero hasta que no se estudie bien la teoría no le va a servir.

La Sliding DFT es una DFT enventanada de toda la vida, da exactamente los mismos resultados que una DFT o una FFT, se trata simplemente de una técnica numérica para optimizar el cálculo en el caso particular de que la ventana se deslice de muestra en muestra.
Subir
1
Oudeis Eimi
#25 por Oudeis Eimi el 21/12/2016
vagar escribió:
Sí es la herramienta para ello, pero hay que entenderla y saber manejarla, en lugar de poner a caldo al pobre Fourier. Ya se le ha explicado cómo ganar precisión, pero hasta que no se estudie bien la teoría no le va a servir.


Correcto, no me he expresado bien, quería decir que no es lo que él quiere si no aplica el enventanado ;-)

También se ha mencionado antes lo de aplicar pasabandas, iba a añadir que una serie de filtros pasabandas de análisis, tipo vocoder, modelarían mucho mejor el sistema de resonadores del oído, pero igual sería liar la cosa demasiado...
Subir
vagar
#26 por vagar el 21/12/2016
oasys escribió:

Quizás es que yo me había montado la película


Exacto.

oasys escribió:
Fourier decía que todo sonido se puede descomponer en ondas senoidales.


Por ejemplo, Fourier jamás dijo algo así.

Estás confundiendo la serie de Fourier con la integral (transformada) de Fourier. La segunda es una generalización matemática de la primera a señales no periódicas, considerando el dominio de la frecuencia como una variable continua, no discreta.

Las señales periódicas de pureza matemática tal que son susceptibles de ser formuladas como una serie armónica de Fourier son abstracciones difíciles de encontrar en el mundo físico; quizá en la mecánica cuántica (por eso se usan para definir la unidad de tiempo) o como resultado de una síntesis (y aun en sonidos sintetizados hay dispersión espectral por la inevitable inestabilidad o jitter de los osciladores electrónicos). En el mundo real las míticas "Frecuencias" son como Los Reyes Magos o Papá Noel, no existen. Siempre va a haber imprecisiones que dispersen la energía en un rango más o menos estrecho del espectro continuo de frecuencias, al que llamamos banda.

El análisis espectral es un artificio matemático que nos facilita analizar y manipular ciertas propiedades interesantes de una señal que se desarrolla en el tiempo. Pero normalmente de lo que tiene sentido hablar es, no de frecuencias, sino de bandas de frecuencias, más o menos estrechas.

En el caso de análisis espectral digital (transformada discreta de Fourier) puedes aumentar la resolución todo lo que quieras, tanto en frecuencia como en tiempo, a base de echarle recursos utilizando, por ejemplo, sobremuestreo. Otra cosa es que el resultado te sirva para algo práctico.

Échale por ejemplo un vistazo al manual del visualizador de espectrograma de Izotope, que es bastante versátil:

https://s3.amazonaws.com/izotopedownloads/docs/rx5/Spectrogram_and_Waveform.html
Subir
1
oasys
#27 por oasys el 22/12/2016
La verdad, no tengo ganas de enredarme más en temas tan complejos, ya he visto que no hay solución concreta, si no que se divide en diferentes soluciones con diversos algoritmos y procedimientos que hay que adaptar para cada problema, etc.

Me gustaba la idea de que se pudiera coger un sonido, pasarlo por una función que la descompusiera en un número determinado de ondas, tantas como precisión se quiera, y que esas ondas al sumarlas se obtuviera el sonido original, o al menos aproximado dependiendo de la precisión solo limitada por el tiempo de cómputo, la precisión decimal, y la memoria, sin necesidad de tantas ventanas, slidings, procedimientos, y trucos. Así era como lo imaginaba.
Subir
Oudeis Eimi
#28 por Oudeis Eimi el 22/12/2016
oasys escribió:
Me gustaba la idea de que se pudiera coger un sonido, pasarlo por una función que la descompusiera en un número determinado de ondas, tantas como precisión se quiera, y que esas ondas al sumarlas se obtuviera el sonido original


Y así es.
Subir
Oudeis Eimi
#29 por Oudeis Eimi el 22/12/2016
#28

Añado a mi escueta respuesta: así es, pero si no te basta con usar una aplicación ya hecha, y lo que buscas es hacerlo tú mismo, entonces tienes que entender las matemáticas necesarias. Que se pueden encontrar en cualquier libro de análisis de primero o segundo de cualquier carrera técnica, y por supuesto en Google ;-)
Subir
vagar
#30 por vagar el 22/12/2016
Oudeis Eimi escribió:


Y así es.


Solo en casos excepcionales, como he comentado antes. Lo normal es que el contenido en frecuencia adopte una distribución continua, no discreta.
Subir
Respuesta rápida

Regístrate o para poder postear en este hilo