Sobre la imprecisión de la transformada de fourier

Oudeis Eimi
#31 por Oudeis Eimi el 22/12/2016
#30

Claro, según tires de transformada o de series (señales generales o perfectamente periódicas).

Estaba refiriéndome a que la señal original se puede reconstruir a partir de su serie o transformada. Sigo con la duda de si el compañero se queda con una impresión equivocada de la técnica de Fourier.
Subir
OFERTAS Ver todas
  • -6%
    Elektron Digitakt II (B-Stock)
    939 €
    Ver oferta
  • -29%
    Behringer X-Touch Compact
    263 €
    Ver oferta
  • -20%
    Technics SL-1200M7 Lamborghini
    1.199 €
    Ver oferta
oasys
#32 por oasys el 23/12/2016
#29

sí, una función ya hecha, o librería, en C/C++

Todas las funciones que he visto de FFT se le pasa un vector de números complejos con los datos de la onda y te devuelve otro del mismo tamaño en todo el rango de frecuencias, tantas como muestras tiene la onda. A partir del número imaginario se obtiene la amplitud de cada frecuencia.

Supongo que el número real, que no uso, es el que sirve para reconstruir la onda en el tiempo. Pero no de cada frecuencia o armónico, si no como un todo.

Así que supongo que la solución sería realizar el mismo cálculo pero solo sobre cada frecuencia individual por separado, y obtener su envolvente a partir del número real.

Pero también sería problemático porque como se ha comentado no existen frecuencias puras, por lo que habría que calcular muchísimas para encontrar las de mayor amplitud. Así que habría que hacer cálculos previos para buscar las frecuencias más probables o vete a saber.

Vamos... que es demasiado embrollo.
Subir
Oudeis Eimi
#33 por Oudeis Eimi el 24/12/2016
oasys escribió:
Todas las funciones que he visto de FFT se le pasa un vector de números complejos con los datos de la onda y te devuelve otro del mismo tamaño en todo el rango de frecuencias, tantas como muestras tiene la onda. A partir del número imaginario se obtiene la amplitud de cada frecuencia.


Bueno, realmente no es así Tú le pasas como entrada un array de números reales, la onda muestreada, y te devuelve uno de complejos, su DFT. Es el módulo de cada complejo el que te da la amplitud en frecuencia, no sus partes real o imaginaria por separado.

oasys escribió:
Supongo que el número real, que no uso, es el que sirve para reconstruir la onda en el tiempo. Pero no de cada frecuencia o armónico, si no como un todo.

Así que supongo que la solución sería realizar el mismo cálculo pero solo sobre cada frecuencia individual por separado, y obtener su envolvente a partir del número real.


No, no. Necesitas comprender las matemáticas implicadas si quieres hacer algo con esto, simplemente suponer cosas y aplicar las librerías a ciegas no te va a llevar a ningún sitio (útil).

Aparte, para lo que quieres, insistimos, necesitas ventanear la entrada. Como veo que esto es algo que te confunde, mañana si tengo tiempo postearé algo de código para que veas en qué consiste más claramente.

oasys escribió:
Pero también sería problemático porque como se ha comentado no existen frecuencias puras, por lo que habría que calcular muchísimas para encontrar las de mayor amplitud. Así que habría que hacer cálculos previos para buscar las frecuencias más probables o vete a saber.

Vamos... que es demasiado embrollo.


No, no. Mañana si tengo tiempo, o el domingo, postearé código usando la técnica para obtener algo parecido a lo que buscas, para que lo veas con más claridad. No es tan embrollado para nada, es simplemente que tienes un lío considerable ;-)
Subir
Oudeis Eimi
#34 por Oudeis Eimi el 25/12/2016
#33

Vale, adjunto código comentado en Mathematica para generar un espectro frente al tiempo y un espectrograma, utilizando una aplicación elemental del ventaneado (simplemente subdividir el array de muestras en subarrays que no se solapan).

Espectro frente al tiempo en YouTube:
https://youtu.be/ZpIYDcwaZqI

(Primero corre hacia delante y luego hacia atrás, cosas del Mathematica)

En el espectrograma (en el PDF adjunto) el tiempo corre de arriba a abajo, la frecuencia de izquierda a derecha.

Si no controlas la sintaxis del Mathematica, te puedo poner el ejemplo equivalente en Python o Matlab.
Archivos adjuntos ( para descargar)
Vowels.aifc
Aplicación de FFT.pdf
Subir
oasys
#35 por oasys el 28/12/2016
no lo pillo, veo que divides el sonido en varios de 0,1 seg. y calculas la transformada para cada uno de ellos. Y no veo nada más especial. si eso pues explicame un poco más lo que hace, pero creo que hasta ahí llegué, y en este caso lo que conseguiría es una precisión de 0,1 segundos para una división de frecuencias de 0,1 x 44100, bueno en realidad la mitad porque la transformada te devuelve una mitad útil y la otra simétrica.
Subir
Oudeis Eimi
#36 por Oudeis Eimi el 29/12/2016
#35

No hace nada más especial, porque es una aplicación muy muy elemental de la técnica del ventaneado - en este caso, con ventanas rectangulares no solapadas de 0.1 segundos de duración. También se puede hacer de forma más sofisticada, con ventanas solapadas (Sliding DFT) y/o con ventanas no rectangulares (que den más peso a algunas muestras que a otras dentro de cada ventana), pero en todas estas técnicas vas a encontrar la misma limitación: existe una relación inversa entre las resoluciones temporal y espectral. En mi ejemplo, si tomo una ventana de 0.1 segundos de duración, mi resolución espectral va a ser de 1 / 0.1s = 10 Hz. Esto es así y no hay otra, no tanto por limitaciones en la técnica de Fourier, sino por razones físicas: existe un "principio de indeterminación" entre el tiempo y la frecuencia, y cuanto mejor determinemos una de estas magnitudes peor determinaremos la otra.

Esto se puede "solventar" tirando de series de Fourier, pero éstas sólo sirven para señales perfectamente periódicas - sin variación tímbrica ni variación en amplitud fuera de modulaciones periódicas.

Pero para lo que creo que tú buscas, lo mejor es un sistema de filtros pasabanda, seguidos cada uno por un detector de envolvente: esto lo que hace es aislar sobretonos (que pueden ser armónicos o no) y detectar su envolvente de amplitud. Esto es la etapa de análisis que realiza el oído, o también un vocoder, así que puedes encontrar ejemplos en cualquier fuente que implemente un vocoder.
Subir
Hilos similares
Nuevo post

Regístrate o para poder postear en este hilo