Sobre la imprecisión de la transformada de fourier

oasys
#1 por oasys el 05/12/2016
Pensaba que con esta técnica se podía convertir cualquier sonido en espacio de tiempo a espacio de frecuencia, y volverlo a convertir mediante la inversa, con tanta fidelidad como datos se generasen, sin más limitación que la memoria y potencia.

Pero por lo que estoy viendo está superlimitado en sí mismo, si se aumenta la resolución de frecuencia se pierde resolución en el tiempo, y viceversa ¿no?
Subir
OFERTASVer todas
  • beyerdynamic DT-770 Pro
    138 €
    Ver oferta
  • -40%
    ¡Precio mínimo histórico! AKAI MPK 261
    298 €
    Ver oferta
  • -35%
    Set de grabación completo de Focusrite
    184 €
    Ver oferta
vagar
#2 por vagar el 05/12/2016
Los milagros no existen, o más bien, son relativos. Todo en esta vida tiene limitaciones, que sean o no significativas depende de las circunstancias.

Una señal se pueda transformar y reconstruir perfectamente mediante la transformada de Fourier y su transformada inversa si:

- Es limitada en banda.
- Se tiene precisión de representación infinita (no hay error de cuantificación).
- Se tiene todo el tiempo necesario para adquirir toda la señal antes de realizar la transformación y su inversión.

Supongo que por la "resolución de tiempo y frecuencia" te refieres a los efectos de las funciones de enventanado, para procesamiento de fragmentos de la señal en tiempo real.

En cualquier situación real siempre va a haber que llegar a compromisos, lo bueno es que hay gente muy inteligente dedicada a encontrar los mejores compromisos para cada caso.
Subir
carlos balabasquer
#3 por carlos balabasquer el 05/12/2016
No creo que la imprecisión se deba a la transformada de Fourier que es un desarrollo matemático.
Subir
oasys
#4 por oasys el 05/12/2016
carlos balabasquer escribió:
No creo que la imprecisión se deba a la transformada de Fourier que es un desarrollo matemático.


Es que el algoritmo utiliza un extraño mecanismo por el que el buffer de salida que es en frecuencias ha de ser del mismo tamaño que el de entrada, que es un buffer de muestras en el tiempo. De manera que si no la muestra no es muy grande te da un amasijo que no determina muy bien la amplitud de cada frecuencia individual.

Si la muestra es muy grande pues entonces sí, te puede dar todas las frecuencias que la componen, pero son una media de su amplitud, que no te dice la evolución de esa onda en el tiempo de esa muestra, por lo que no sé cómo luego se puede reconstruir.
Subir
vagar
#5 por vagar el 05/12/2016
oasys escribió:

Si la muestra es muy grande pues entonces sí, te puede dar todas las frecuencias que la componen, pero son una media de su amplitud, que no te dice la evolución de esa onda en el tiempo de esa muestra, por lo que no sé cómo luego se puede reconstruir.


Por supuesto que el espectro a largo plazo te dice la evolución de la onda en el tiempo, piénsalo como suma de ondas senoidales (que evolucionan en el tiempo) y se puede invertir la transformación perfectamente.

Lo que no te dice es la evolución de las componentes espectrales en el tiempo, que no es lo mismo.
Subir
oasys
#6 por oasys el 06/12/2016
#5

mi problema es que yo quiero seguir la evolución de una frecuencia en concreto, pero es como si no tuviera control sobre ellas frecuencias, si coges una muestra pequeña siempre te da todas mezcladas, no sé si me explico. Para ver una frecuencia que salga como un pico fino tengo que coger una muestra muy grande, pero entonces ya no sigo su evolución.

¿cómo se puede hacer entonces?
Subir
vagar
#7 por vagar el 06/12/2016
oasys escribió:
yo quiero seguir la evolución de una frecuencia en concreto


¿Con qué objeto?
Subir
oasys
#8 por oasys el 06/12/2016
#7

una frecuencia, un grupo, o un rango de frecuencias, por ejemplo para "ver" la envolvente de un armónico
Subir
vagar
#9 por vagar el 06/12/2016
¿Para qué te interesa esa información, por curiosidad?

Puedes probar a pasar la señal por un filtro paso banda estrecho y después simplemente observar la envolvente en el tiempo de la señal resultante.
Subir
vagar
#10 por vagar el 06/12/2016
También puedes usar programas más específicos de análisis, por ejemplo SonicVisualiser tiene un modo de espectrograma que sólo te muestra los picos locales, seguramente te vaya bien para lo que quieres.
Subir
oasys
#11 por oasys el 06/12/2016
a ver, no lo necesito para nada específico, simplemente estoy experimentando y aprendiendo, y al programar una función que mostrase el espectrograma me di cuenta de que el análisis de la FFT era preciso en el tiempo o en la frecuencia, pero no en las dos cosas a la vez, lo que me ha había decepcionado un poco, y quería consultarlo porque igual se me escapa algo.

Y luego también me encuentro con la contradicción esa que dice que con la inversa se puede reconstruir exactamente, Pero muchos sonidos complejos tienen cientos o miles de frecuencias que pueden variar en un lapso de tiempo, por ejemplo sonidos percusivos o el ataque de un instrumento, cada armónico en su tiempo correspondiente, y para eso se necesitaría muchísima precisión en el tiempo y en la frecuencia cosa que no tiene el FFT. ¿habéis probado algún programa que haga una reconstrucción perfecta usando esa técnica?
Subir
vagar
#12 por vagar el 06/12/2016
No tiene por qué decepcionarte, es como si te decepciona que cuando usas un microscopio, cuanto más aumentas menos espacio cubres.

Piensa que para poder detectar componentes espectrales tienes que analizar cierta cantidad de tiempo, para que la periodicidad de la componente afecte a la transformada. El caso de análisis más rápido sería un buffer de una sola muestra, ya me dirás qué periodicidad va a salir ahí.

En cualquier caso puedes aumentar la precisión de muchas maneras, por ejemplo corriendo la ventana de análisis con solapamiento, o usando ventanas que minimicen la dispersión espectral.

Sigues confundiendo el espectrograma con el espectro. El espectrograma es la concatenación en el tiempo del espectro de una pequeña parte (ventana) de la señal total, para visualizar de forma aproximada la evolución del espectro a lo largo del tiempo.

En ninguna parte dice que del espectrograma se reconstruya la señal, la señal se reconstruye del espectro (magnitud y fase). La señal total se reconstruye perfectamente a partir del espectro total, y de cada línea vertical del espectrograma se puede reconstruir perfectamente el trocito de señal que se usó para calcularla. Si se sabe qué tipo de ventana y qué solapamiento se ha usado para calcular el espectrograma sí se podría calcular a partir de él la señal original.

Mira, una sesión del software de análisis matemático octave, el equivalente en software abierto a MatLab:

Alguien escribió:
octave:1> s=[0,1,2,3,4,5,6,7];
octave:2> f=fft(s)
f =

Columns 1 through 3:

28.0000 + 0.0000i -4.0000 + 9.6569i -4.0000 + 4.0000i

Columns 4 through 6:

-4.0000 + 1.6569i -4.0000 + 0.0000i -4.0000 - 1.6569i

Columns 7 and 8:

-4.0000 - 4.0000i -4.0000 - 9.6569i

octave:3> s2=ifft(f)
s2 =

0 1 2 3 4 5 6 7


Reconstrucción perfecta. :ook:
Subir
oasys
#13 por oasys el 07/12/2016
#12

sí, pero parece que en la práctica no es tan sencillo, imagina reconstruir una canción.

Tal vez se pueda matemáticamente, pero parece que sería más complejo que simplemente coger ventanas al azar o más o menos equilibradas, y habría que hacer muchos cálculos previos.

Sacado de wikipedia:

Alguien escribió:

Teorema de inversión

La idea básica del teorema de inversión es que dada una función f, la transformada de Fourier inversa aplicada a la transformada de Fourier de f resulta en la misma función original, en símbolos:

f ^ ˇ = f


Sin embargo, el resultado formulado de esta forma no es siempre válido, porque el dominio de la transformada de Fourier como lo hemos definido en el primer párrafo de este artículo no es invariante, o sea que la transformada de Fourier de una función integrable no es necesariamente integrable.

Para formular el teorema de inversión necesitamos encontrar espacios de funciones que sean invariantes bajo la transformada de Fourier. De hecho, hay numerosas posibilidades, la más natural del punto de vista técnico siendo el espacio de Schwartz de funciones φ rápidamente decrecientes. Sin embargo aquí tomamos un camino más directo para formular un enunciado:

Teorema. El espacio de funciones complejas f definidas en la recta tales que f y la transformada de Fourier de f sean integrables, es invariante tanto por la transformada de Fourier que por la transformada de Fourier inversa. Además para una función f en este espacio, vale el teorema de inversión (1).

Otra posibilidad para formular un teorema de inversión se fundamenta en el hecho de que la transformada de Fourier tiene muchas extensiones naturales.


no me he enterao de na....
Subir
vagar
#14 por vagar el 07/12/2016
No te preocupes, que cualquier canción es tan fácilmente reconstruible como la secuencia que te he puesto. Es tan sencillo como cargar una canción en WAV en octave o MatLab, pasarle la FFT y luego la inversa y compararla con la original. Te van a salir iguales, ya te lo digo, pero mejor es que lo pruebes por ti mismo para convencerte.

Alguien escribió:

octave:1> format free
octave:2> s=wavread("prueba.wav");
octave:3> length(s)
ans = 170854
octave:4> s2=s(1:65536);
octave:5> f=fft(s2);
octave:6> s3=ifft(f);
octave:7> disp(s(1:10)')
-0.00125122
-0.00177002
-0.00210571
-0.00189209
-0.00140381
-0.00088501
-0.000640869
-0.0010376
-0.00137329
-0.00189209

octave:8> disp(s3(1:10)')
(-0.00125122,-0)
(-0.00177002,8.87182e-18)
(-0.00210571,1.18602e-17)
(-0.00189209,7.59958e-18)
(-0.00140381,1.59242e-19)
(-0.00088501,-8.14507e-18)
(-0.000640869,1.74912e-18)
(-0.0010376,5.6243e-18)
(-0.00137329,7.94178e-18)
(-0.00189209,9.35124e-19)



Los resultados de la transformada inversa tienen una microscópica componente compleja (17-19 decimales, entre -340 y -380 dBFS) debida a los inevitables errores de cálculo digital en precisión finita, que en cualquier caso se descartaría porque sólo se toma la parte real.

No le busques tres pies al gato con cosas que no entiendes de la Wikipedia. Para poder muestrearlas sin aliasing, las señales hay que limitarlas en banda, es decir, pasarlas por un filtro paso bajo de frecuencia de corte inferior a la mitad de la frecuencia de muestreo. Esto hace que estas funciones no tengan discontinuidades ni saltos bruscos, lo cual las hace suaves y perfectamente transformables en un sentido o en otro.

Estudia bien la teoría y la práctica antes de saltar a conclusiones, cuando una tecnología se usa es porque gente más inteligente que tú y que yo la ha diseñado y ha comprobado su efectividad, hay que ser humildes y entender que si algo nos parece raro lo más normal es que sea porque hay algo que estamos comprendiendo mal.
Subir
vagar
#15 por vagar el 07/12/2016
Si quieres un espectrograma con precisión temporal y en frecuencia es, efectivamente, cuestión de echarle recursos. Bájate SonicVisualiser, carga un sonido y crea un espectrograma. Después, en las propiedades del espectrograma elige una ventana de 32768 muestras y un solapamiento del 93,75% (la ventana corre 1/16 de su tamaño).

Eso te va a dar un espectro de 32768/2 = 16384 puntos, que a una frecuencia de muestreo de 44.1 kHz es 16384/22050 = 0.75 puntos por hercio aproximadamente, usando por defecto una ventana de Hanning para reducir el manchado espectral. El solapamiento de 32768/16 = 2048 puntos hace que la resolución temporal del análisis sea 2048/44100 = 46 ms.

Esos son los máximos del programa, en el improbable caso de que necesitaras más precisión se podría conseguir con un desarrollo a medida.

http://www.sonicvisualiser.org/doc/reference/2.4.1/en/#spectrogram
Subir
Hilos similares
Nuevo post

Regístrate o para poder postear en este hilo