7 votos

FFT de forma de onda con paso de tiempo no constante

Tengo una forma de onda de la que me gustaría obtener la transformada de Fourier. Sin embargo, el simulador que generó la forma de onda utiliza un algoritmo adaptativo para determinar el paso de tiempo de cada cálculo.

Supongo que puedo regularizar el paso de tiempo en primer orden creando una nueva base de tiempo y calculando para cada punto de la nueva base una interpolación lineal a partir de los dos puntos más cercanos de la secuencia original, pero esto parece poco elegante y potencialmente incorrecto.

También me planteé ampliar la secuencia original con el paso de tiempo más pequeño posible, replicar los puntos de datos para rellenar los datos que faltan (creando pasos) y filtrar la transformada de Fourier resultante por encima de cierta frecuencia (o simplemente ignorar los datos por encima de cierta frecuencia).

Cualquiera de los dos probablemente funcione con los datos que tengo, ya que están muy sobremuestreados para el rango de frecuencias que me interesa, pero me preocupa que ambos provoquen distorsiones si no fuera así.

¿Existe un método mejor?

6voto

alex Puntos 131

Puede que haya literatura sobre esto, y no soy un experto, pero creo que hay un método sencillo para calcular directamente lo que quieres:

En primer lugar, la FFT no es más que un algoritmo rápido para la DFT. Para el siguiente método, tendrá que calcular directamente los coeficientes de la DFT. Recordemos la fórmula para un solo coeficiente (ligeramente modificada de Wikipedia para que coincida con lo que digo a continuación):

$$X_k := \frac{1}{N} \sum_{n=0}^{N-1} x_n e^{-\pi i k \frac{2n+1}{N}}$$

Esto se puede interpretar como una discretización de la integral (espero haberlo entendido bien):

$$Y_k := \int_0^1 y(t) e^{-2 \pi i k t} dt$$

En $x$ es un $N$ -tupla, $y$ se supone que es la función continua en $[0,1]$ que $x$ se aproxima. Cada $n=0,\dots,N-1$ está asociado al intervalo $[a_n,b_n]:=[\frac{n}{N},\frac{n+1}{N}]$ por lo que la unión de todos los intervalos es $[0,1]$ . También tiene sentido suponer que existe un $t_n\in[0,1]$ tal que $x_n = y(t_n)$ , digamos $t_n := \frac{a_n + b_n}{2}$ . (Esto es lo que he utilizado implícitamente en la primera fórmula, convirtiéndola en una aproximación de la suma del punto medio. Por favor, pregunte si esto no está claro).

Ahora, la entrada que tienes es básicamente una discretización diferente $z$ de $y$ que es un $M$ -tupla ( $M$ siendo posiblemente diferente de $N$ ), y donde $a_m$ , $b_m$ y $t_m$ para $m=0,\dots,M-1$ vienen dadas por su variable timestep. (Usted mismo tiene que decidir si se dan los límites del intervalo o los puntos de medición; sin embargo, tiene que asegurarse de que $a_0=0$ y $b_{M-1}=1$ .) Lo que necesitas es una suma que discretice adecuadamente la integral anterior, que sería (esperemos, de nuevo):

$$Z_k := \sum_{m=0}^{M-1} (b_m-a_m) z_m e^{-2 \pi i k t_m}$$

Si el paso de tiempo es completamente variable, se pueden obtener coeficientes distintos de cero para valores arbitrariamente grandes. $k$ pero puedes dejar de calcular donde quieras, por supuesto.

Ahora bien, calcular estas sumas no es tan rápido como una FFT, pero hay varias cosas que se pueden hacer para que sea computacionalmente factible. Lo más importante es calcular los senos y cosenos sólo una vez para cada $m$ es decir, iterar sobre $m$ a nivel exterior, no $k$ . Debe precalcular las tablas seno/coseno si tiene una "resolución de tiempo" fija de la que cada paso de tiempo es un múltiplo; de lo contrario, utilice implementaciones seno/coseno que favorezcan la velocidad frente a la precisión.

Si quieres solapamiento entre "ventanas" DFT consecutivas (no estoy seguro de si esta es la palabra correcta aquí), hay una manera de reutilizar la parte de cada suma que está en ambas ventanas. Otra forma de reducir la sobrecarga de tiempo es utilizar diferentes longitudes de ventana para cada coeficiente, lo que le da una resolución de frecuencia variable (por ejemplo, logarítmica). No tengo tiempo para explicar esto ahora, pero puedes enviarme un correo para más detalles a SebastianR@gmx.de si realmente quieres implementar esto.

3voto

Rob Cooper Puntos 15945

Si conoce a priori que la señal es dispersa en el dominio de Fourier (suma de unas pocas sinusoides), puede intentar detección por compresión técnicas (por ejemplo, Basis Pursuit) para determinar la transformada de Fourier.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X