¿Cómo tomo la FFT de datos desigualmente espaciados?

55

The Fast Fourier Transform algoritmo calcula un Fourier descomposición bajo el supuesto de que sus puntos de entrada son equidistantes en el dominio del tiempo, . ¿Y si no lo son? ¿Hay otro algoritmo que podría usar, o de alguna manera podría modificar la FFT, para dar cuenta de lo que efectivamente es una frecuencia de muestreo variable?tk=kT

Si la solución depende de cómo se distribuyen las muestras, hay dos situaciones particulares en las que estoy más interesado:

  • Frecuencia de muestreo constante con jitter: donde δ t k es una variable distribuida aleatoriamente. Supongamos que es seguro decir | δ t k | < T / 2 .tk=kT+δtkδtk|δtk|<T/2
  • Muestras descartadas de una frecuencia de muestreo constante: donde n kZktk=nkTnkZk

Motivación: en primer lugar, esta fue una de las preguntas más votadas en la propuesta de este sitio. Pero además, hace un tiempo me involucré en una discusión sobre el uso de FFT (provocada por una pregunta sobre Stack Overflow ) en la que surgieron algunos datos de entrada con puntos muestreados de manera desigual. Resultó que las marcas de tiempo en los datos estaban mal, pero me hizo pensar en cómo uno podría abordar este problema.

David Z
fuente

Respuestas:

40

Existe una amplia variedad de técnicas para FFT no uniforme, y las más eficientes están destinadas exactamente a su caso: muestras cuasi uniformes. La idea básica es untar las fuentes muestreadas desigualmente en una cuadrícula uniforme ligeramente más fina ("sobremuestreada") a través de convoluciones locales contra los gaussianos. Luego se puede ejecutar una FFT estándar en la cuadrícula uniforme sobremuestreada, y luego se puede deshacer la convolución contra los gaussianos. Las buenas implementaciones son algo así como veces más caro que un FFT estándar en d dimensiones, donde C es algo cercano a 4 o 5.CddC

Recomiendo leer Acelerando la Transformada rápida de Fourier no uniforme por Greengard y Lee.

O(NdlogN)

Un punto importante es que todas las técnicas anteriores son aproximaciones que pueden hacerse arbitrariamente precisas a expensas de tiempos de ejecución más largos, mientras que el algoritmo FFT estándar es exacto.

Jack Poulson
fuente
9

En el procesamiento de señales, se evita el alias enviando una señal a través de un filtro de paso bajo antes del muestreo. Jack Poulson ya explicó una técnica para FFT no uniforme utilizando gaussianos truncados como filtros de paso bajo. Una característica inconveniente de los gaussianos truncados es que incluso después de haber decidido el espaciado de la cuadrícula para el FFT (= la velocidad de muestreo en el procesamiento de la señal), todavía tiene dos parámetros libres: el ancho del radio gaussiano y el truncamiento.

Por lo tanto, prefiero la función "hat" con un ancho de dos celdas de cuadrícula como filtro de paso bajo. Esto tiene el efecto de que el orden cero de Fourier es exacto, y que los órdenes inferiores de Fourier convergerán cuadráticamente. La transformación de Fourier de la función "hat" es fácil de calcular (es el cuadrado de la función sinc), lo que simplifica deshacer la convolución después de la FFT. Tenga en cuenta que la función "hat" es la convolución de la función característica de la celda unitaria (centrada) consigo misma. Se puede lograr cualquier tasa de convergencia deseada, convolucionando la celda unitaria más de una vez consigo misma, y ​​usando la función resultante en lugar de la función "sombrero".

Thomas Klimpel
fuente
6

Si está interesado en el software, puedo recomendarle la biblioteca NFFT (en C con una interfaz para MATLAB) que puede encontrar aquí . Tenga en cuenta que también hay una biblioteca PFFT para computación FFT paralela e incluso una biblioteca PNFFT para FFT paralelas no equiespaciales de los mismos desarrolladores .

Puñal
fuente
1
Hasta donde yo sé, PNFFT es la biblioteca más rápida para FFT paralelas 3D no uniformes.
Jack Poulson
El enlace para PNFFT parece estar roto.
Foad
2

Adición a la respuesta aceptada. Aquí hay un enlace a una implementación de código abierto del método de Greengard y Lee: https://finufft.readthedocs.io/en/latest/ Tiene envoltorios para C, fortran, MATLAB, octava y python. Creo que FINUFFT está escrito en C ++.

Se mantiene y utiliza en el instituto Courant de la NYU, SFU, el instituto Flatiron (obviamente), la Universidad de Texas Austin y la universidad estatal de Florida. Al menos estos son los que conozco.

Yo mismo estoy usando una versión anterior, porque soy vago. Ver: https://cims.nyu.edu/cmcl/nufft/nufft.html

Raibyo
fuente