Una transformada rápida de Fourier ( FFT ) es un algoritmo que calcula la transformada discreta de Fourier (DFT) de una secuencia, o su inversa (IDFT). El análisis de Fourier convierte una señal de su dominio original (a menudo tiempo o espacio) a una representación en el dominio de la frecuencia y viceversa. La DFT se obtiene descomponiendo una secuencia de valores en componentes de diferentes frecuencias. [1] Esta operación es útil en muchos campos, pero calcularla directamente a partir de la definición suele ser demasiado lento para ser práctico. Una FFT calcula rápidamente dichas transformaciones factorizando la matriz DFT en un producto de factores dispersos (en su mayoría cero). [2] Como resultado, logra reducir la complejidad de calcular la DFT de , que surge si uno simplemente aplica la definición de DFT, a , donde n es el tamaño de los datos. La diferencia en velocidad puede ser enorme, especialmente para conjuntos de datos largos donde n puede estar en miles o millones. En presencia de un error de redondeo , muchos algoritmos FFT son mucho más precisos que evaluar la definición DFT de forma directa o indirecta. Existen muchos algoritmos FFT diferentes basados en una amplia gama de teorías publicadas, desde la aritmética simple de números complejos hasta la teoría de grupos y la teoría de números .
Las transformadas rápidas de Fourier se utilizan ampliamente en aplicaciones de ingeniería, música, ciencia y matemáticas. Las ideas básicas se popularizaron en 1965, pero algunos algoritmos ya se habían derivado en 1805. [1] En 1994, Gilbert Strang describió la FFT como "el algoritmo numérico más importante de nuestra era", [3] [4] y fue incluida en los 10 mejores algoritmos del siglo XX por la revista IEEE Computing in Science & Engineering . [5]
Los algoritmos FFT más conocidos dependen de la factorización de n , pero hay FFT con complejidad para todos, incluso primos , n . Muchos algoritmos FFT dependen solo del hecho de que es una raíz primitiva n 'ésima de la unidad , y por lo tanto se pueden aplicar a transformadas análogas sobre cualquier cuerpo finito , como las transformadas de teoría de números . Dado que la DFT inversa es la misma que la DFT, pero con el signo opuesto en el exponente y un factor 1/ n , cualquier algoritmo FFT se puede adaptar fácilmente para ella.
El desarrollo de algoritmos rápidos para DFT se remonta al trabajo inédito de Carl Friedrich Gauss de 1805 sobre las órbitas de los asteroides Pallas y Juno . Gauss quería interpolar las órbitas a partir de observaciones de muestra; [6] [7] su método era muy similar al que sería publicado en 1965 por James Cooley y John Tukey , a quienes generalmente se les atribuye la invención del algoritmo FFT genérico moderno. Si bien el trabajo de Gauss fue anterior incluso a los resultados de 1822 de Joseph Fourier , no analizó la complejidad del método y, finalmente, utilizó otros métodos para lograr el mismo fin.
Entre 1805 y 1965, otros autores publicaron algunas versiones de FFT. Frank Yates publicó en 1932 su versión llamada algoritmo de interacción , que proporcionaba un cálculo eficiente de las transformadas de Hadamard y Walsh . [8] El algoritmo de Yates todavía se utiliza en el campo del diseño estadístico y el análisis de experimentos. En 1942, GC Danielson y Cornelius Lanczos publicaron su versión para calcular la DFT para la cristalografía de rayos X , un campo en el que el cálculo de las transformadas de Fourier presentaba un formidable cuello de botella. [9] [10] Si bien muchos métodos en el pasado se habían centrado en reducir el factor constante para el cálculo aprovechando las "simetrías", Danielson y Lanczos se dieron cuenta de que se podía utilizar la "periodicidad" y aplicar un "truco de duplicación" para "duplicar [ n ] con solo un poco más del doble de trabajo", aunque al igual que Gauss no hicieron el análisis para descubrir que esto conducía al escalamiento. [11]
James Cooley y John Tukey redescubrieron de forma independiente estos algoritmos anteriores [7] y publicaron una FFT más general en 1965 que es aplicable cuando n es compuesto y no necesariamente una potencia de 2, además de analizar la escala. [12] A Tukey se le ocurrió la idea durante una reunión del Comité Asesor Científico del Presidente Kennedy donde un tema de discusión involucraba la detección de pruebas nucleares por parte de la Unión Soviética mediante la instalación de sensores para rodear el país desde el exterior. Para analizar la salida de estos sensores, se necesitaría un algoritmo FFT. En la discusión con Tukey, Richard Garwin reconoció la aplicabilidad general del algoritmo no solo a los problemas de seguridad nacional, sino también a una amplia gama de problemas, incluido uno de interés inmediato para él, determinar las periodicidades de las orientaciones de espín en un cristal 3-D de helio-3. [13] Garwin le dio la idea de Tukey a Cooley (ambos trabajaban en los laboratorios Watson de IBM ) para su implementación. [14] Cooley y Tukey publicaron el artículo en un tiempo relativamente corto de seis meses. [15] Como Tukey no trabajaba en IBM, se puso en duda la patentabilidad de la idea y el algoritmo pasó al dominio público, lo que, a través de la revolución informática de la década siguiente, convirtió a FFT en uno de los algoritmos indispensables en el procesamiento de señales digitales .
Sean números complejos . La DFT se define mediante la fórmula
donde es una raíz n- ésima primitiva de 1.
Para evaluar esta definición directamente se requieren operaciones: hay n salidas X k , y cada salida requiere una suma de n términos. Una FFT es cualquier método para calcular los mismos resultados en operaciones. Todos los algoritmos FFT conocidos requieren operaciones, aunque no se conoce ninguna prueba de que una complejidad menor sea imposible. [16]
Para ilustrar los ahorros de una FFT, considere el recuento de multiplicaciones y adiciones complejas para los puntos de datos. La evaluación directa de las sumas de la DFT involucra multiplicaciones complejas y adiciones complejas, de las cuales las operaciones se pueden ahorrar eliminando operaciones triviales como multiplicaciones por 1, dejando alrededor de 30 millones de operaciones. En contraste, el algoritmo de Cooley-Tukey de base 2, para n una potencia de 2, puede calcular el mismo resultado solo con multiplicaciones complejas (de nuevo, ignorando las simplificaciones de multiplicaciones por 1 y similares) y adiciones complejas, en total alrededor de 30.000 operaciones, mil veces menos que con la evaluación directa. En la práctica, el rendimiento real en las computadoras modernas suele estar dominado por factores distintos a la velocidad de las operaciones aritméticas y el análisis es un tema complicado (por ejemplo, consulte Frigo & Johnson , 2005), [17] pero la mejora general de a permanece.
La FFT más utilizada es el algoritmo Cooley-Tukey. Se trata de un algoritmo de divide y vencerás que descompone recursivamente una DFT de cualquier tamaño compuesto en DFT más pequeñas de tamaño , junto con multiplicaciones por raíces complejas de la unidad, tradicionalmente llamadas factores de twiddle (según Gentleman y Sande, 1966). [18]
Este método (y la idea general de una FFT) se popularizó gracias a una publicación de Cooley y Tukey en 1965, [12] pero más tarde se descubrió [1] que esos dos autores habían reinventado juntos e independientemente un algoritmo conocido por Carl Friedrich Gauss alrededor de 1805 [19] (y posteriormente redescubierto varias veces en formas limitadas).
El uso más conocido del algoritmo Cooley-Tukey es dividir la transformada en dos partes de tamaño n/2 en cada paso, y por lo tanto está limitado a tamaños de potencia de dos, pero cualquier factorización se puede utilizar en general (como lo sabían tanto Gauss como Cooley/Tukey [1] ). Estos se denominan casos de base 2 y base mixta , respectivamente (y otras variantes como la FFT de base dividida también tienen sus propios nombres). Aunque la idea básica es recursiva, la mayoría de las implementaciones tradicionales reorganizan el algoritmo para evitar la recursión explícita. Además, debido a que el algoritmo Cooley-Tukey divide la DFT en DFT más pequeñas, se puede combinar arbitrariamente con cualquier otro algoritmo para la DFT, como los que se describen a continuación.
Existen otros algoritmos FFT además de Cooley-Tukey.
Para con coprimos y , se puede usar el algoritmo de factor primo (Good–Thomas) (PFA), basado en el teorema del resto chino , para factorizar la DFT de manera similar a Cooley–Tukey pero sin los factores twiddle. El algoritmo de Rader–Brenner (1976) [20] es una factorización similar a Cooley–Tukey pero con factores twiddle puramente imaginarios, reduciendo las multiplicaciones a costa de mayores adiciones y una estabilidad numérica reducida ; luego fue reemplazado por la variante de base dividida de Cooley–Tukey (que logra el mismo conteo de multiplicaciones pero con menos adiciones y sin sacrificar la precisión). Los algoritmos que factorizan recursivamente la DFT en operaciones más pequeñas distintas de las DFT incluyen los algoritmos de Bruun y QFT. (Los algoritmos Rader–Brenner [20] y QFT se propusieron para tamaños de potencia de dos, pero es posible que se puedan adaptar a n compuestos generales . El algoritmo de Bruun se aplica a tamaños compuestos pares arbitrarios). El algoritmo de Bruun , en particular, se basa en interpretar la FFT como una factorización recursiva del polinomio , aquí en polinomios de coeficientes reales de la forma y .
Otro punto de vista polinomial es explotado por el algoritmo FFT de Winograd, [21] [22] que factoriza en polinomios ciclotómicos —estos a menudo tienen coeficientes de 1, 0 o −1, y por lo tanto requieren pocas multiplicaciones (si es que hay alguna), por lo que Winograd puede usarse para obtener FFT de multiplicación mínima y a menudo se usa para encontrar algoritmos eficientes para factores pequeños. De hecho, Winograd demostró que la DFT puede calcularse solo con multiplicaciones irracionales, lo que conduce a un límite inferior alcanzable probado en el número de multiplicaciones para tamaños de potencia de dos; esto se produce a costa de muchas más adiciones, una compensación que ya no es favorable en los procesadores modernos con multiplicadores de hardware . En particular, Winograd también hace uso del PFA, así como de un algoritmo de Rader para FFT de tamaños primos .
El algoritmo de Rader , que explota la existencia de un generador para el grupo multiplicativo módulo primo n , expresa una DFT de tamaño primo n como una convolución cíclica de tamaño (compuesto) n – 1 , que luego se puede calcular mediante un par de FFT ordinarias a través del teorema de convolución (aunque Winograd utiliza otros métodos de convolución). Otra FFT de tamaño primo se debe a LI Bluestein, y a veces se denomina algoritmo chirp-z ; también reexpresa una DFT como una convolución, pero esta vez del mismo tamaño (que se puede rellenar con ceros hasta una potencia de dos y evaluar mediante FFT de Cooley–Tukey de base 2, por ejemplo), a través de la identidad
La transformada rápida de Fourier hexagonal (HFFT) tiene como objetivo calcular una FFT eficiente para los datos muestreados hexagonalmente utilizando un nuevo esquema de direccionamiento para cuadrículas hexagonales, llamado Direccionamiento de Conjunto de Arreglos (ASA).
En muchas aplicaciones, los datos de entrada para la DFT son puramente reales, en cuyo caso las salidas satisfacen la simetría.
y se han diseñado algoritmos FFT eficientes para esta situación (véase, por ejemplo, Sorensen, 1987). [23] [24] Un enfoque consiste en tomar un algoritmo ordinario (por ejemplo, Cooley–Tukey) y eliminar las partes redundantes del cálculo, ahorrando aproximadamente un factor de dos en tiempo y memoria. Alternativamente, es posible expresar una DFT de entrada real de longitud par como una DFT compleja de la mitad de la longitud (cuyas partes reales e imaginarias son los elementos pares/impares de los datos reales originales), seguida de operaciones de posprocesamiento.
Se creía que las DFT de entrada real se podían calcular de manera más eficiente mediante la transformada Hartley discreta (DHT), pero posteriormente se argumentó que normalmente se puede encontrar un algoritmo DFT de entrada real (FFT) especializado que requiera menos operaciones que el algoritmo DHT (FHT) correspondiente para la misma cantidad de entradas. [23] El algoritmo de Bruun (arriba) es otro método que se propuso inicialmente para aprovechar las entradas reales, pero no ha demostrado ser popular.
Existen otras especializaciones de FFT para los casos de datos reales que tienen simetría par/impar , en cuyo caso se puede ganar otro factor de aproximadamente dos en tiempo y memoria y la DFT se convierte en la( s) transformada(s) discreta(s) de coseno / seno ( DCT / DST ). En lugar de modificar directamente un algoritmo de FFT para estos casos, las DCT/DST también se pueden calcular a través de FFT de datos reales combinadas con preprocesamiento y posprocesamiento.
Una cuestión fundamental de interés teórico desde hace mucho tiempo es demostrar límites inferiores a la complejidad y el número exacto de operaciones de las transformadas rápidas de Fourier, y aún quedan muchos problemas abiertos. No se ha demostrado rigurosamente si las DFT realmente requieren operaciones (es decir, de orden o mayor), incluso para el caso simple de potencia de dos tamaños, aunque no se conocen algoritmos con menor complejidad. En particular, el número de operaciones aritméticas suele ser el foco de tales preguntas, aunque el rendimiento real en las computadoras modernas está determinado por muchos otros factores, como la optimización de la memoria caché o la canalización de la CPU .
Siguiendo el trabajo de Shmuel Winograd (1978), [21] se conoce un límite inferior estricto para el número de multiplicaciones reales requeridas por una FFT. Se puede demostrar que solo se requieren multiplicaciones reales irracionales para calcular una DFT de longitud de potencia de dos . Además, se conocen algoritmos explícitos que logran este recuento (Heideman y Burrus , 1986; [25] Duhamel, 1990 [26] ). Sin embargo, estos algoritmos requieren demasiadas adiciones para ser prácticos, al menos en computadoras modernas con multiplicadores de hardware (Duhamel, 1990; [26] Frigo y Johnson , 2005). [17]
No se conoce un límite inferior estricto para el número de adiciones requeridas, aunque se han demostrado límites inferiores bajo algunas suposiciones restrictivas sobre los algoritmos. En 1973, Morgenstern [27] demostró un límite inferior para el recuento de adiciones para algoritmos donde las constantes multiplicativas tienen magnitudes acotadas (lo que es cierto para la mayoría de los algoritmos FFT, pero no para todos). Pan (1986) [28] demostró un límite inferior asumiendo un límite en una medida de la "asincronicidad" del algoritmo FFT, pero la generalidad de esta suposición no está clara. Para el caso de la potencia de dos n , Papadimitriou (1979) [29] argumentó que el número de adiciones de números complejos logradas por los algoritmos Cooley-Tukey es óptimo bajo ciertas suposiciones sobre el gráfico del algoritmo (sus suposiciones implican, entre otras cosas, que no se explotan identidades aditivas en las raíces de la unidad). (Este argumento implicaría que se requieren al menos adiciones reales, aunque este no es un límite estricto porque se requieren adiciones adicionales como parte de las multiplicaciones de números complejos). Hasta el momento, ningún algoritmo FFT publicado ha logrado menos de adiciones de números complejos (o su equivalente) para n de potencia de dos .
Un tercer problema es minimizar el número total de multiplicaciones y sumas reales, a veces llamada "complejidad aritmética" (aunque en este contexto es el recuento exacto y no la complejidad asintótica lo que se está considerando). Nuevamente, no se ha demostrado un límite inferior estricto. Sin embargo, desde 1968, el recuento publicado más bajo para la potencia de dos n se logró durante mucho tiempo mediante el algoritmo FFT de base dividida , que requiere multiplicaciones y sumas reales para n > 1. Esto se redujo recientemente a (Johnson y Frigo, 2007; [16] Lundy y Van Buskirk, 2007 [30] ). Se demostró que un recuento ligeramente mayor (pero aún mejor que el radix dividido para n ≥ 256 ) era demostrablemente óptimo para n ≤ 512 bajo restricciones adicionales en los algoritmos posibles (gráficos de flujo similares a radix dividido con factores multiplicativos de módulo unitario), por reducción a un problema de teorías de módulo de satisfacibilidad solucionable por fuerza bruta (Haynal y Haynal, 2011). [31]
La mayoría de los intentos de reducir o demostrar la complejidad de los algoritmos FFT se han centrado en el caso de datos complejos ordinarios, porque es el más simple. Sin embargo, las FFT de datos complejos están tan estrechamente relacionadas con algoritmos para problemas relacionados, como las FFT de datos reales, las transformadas de coseno discretas , las transformadas de Hartley discretas , etc., que cualquier mejora en una de ellas conduciría inmediatamente a mejoras en las otras (Duhamel y Vetterli, 1990). [32]
Todos los algoritmos FFT discutidos anteriormente calculan la DFT exactamente (es decir, ignorando los errores de punto flotante ). Sin embargo, se han propuesto algunos algoritmos "FFT" que calculan la DFT aproximadamente , con un error que puede hacerse arbitrariamente pequeño a expensas de mayores cálculos. Tales algoritmos intercambian el error de aproximación por mayor velocidad u otras propiedades. Por ejemplo, un algoritmo FFT aproximado de Edelman et al. (1999) [33] logra menores requisitos de comunicación para computación paralela con la ayuda de un método multipolar rápido . Una FFT aproximada basada en wavelets de Guo y Burrus (1996) [34] tiene en cuenta entradas/salidas dispersas (localización de tiempo/frecuencia) de manera más eficiente de lo que es posible con una FFT exacta. Otro algoritmo para el cálculo aproximado de un subconjunto de las salidas de la DFT se debe a Shentov et al. (1995). [35] El algoritmo de Edelman funciona igualmente bien para datos dispersos y no dispersos, ya que se basa en la compresibilidad (deficiencia de rango) de la matriz de Fourier en sí misma en lugar de la compresibilidad (esparcimiento) de los datos. Por el contrario, si los datos son dispersos (es decir, si solo k de n coeficientes de Fourier son distintos de cero), entonces la complejidad se puede reducir a , y se ha demostrado que esto conduce a aceleraciones prácticas en comparación con una FFT ordinaria para n / k > 32 en un ejemplo de n grande ( n = 2 22 ) utilizando un algoritmo aproximado probabilístico (que estima los coeficientes k más grandes con varios decimales). [36]
Los algoritmos FFT tienen errores cuando se utiliza aritmética de punto flotante de precisión finita, pero estos errores son típicamente bastante pequeños; la mayoría de los algoritmos FFT, por ejemplo Cooley–Tukey, tienen excelentes propiedades numéricas como consecuencia de la estructura de suma por pares de los algoritmos. El límite superior del error relativo para el algoritmo Cooley–Tukey es , comparado con para la fórmula DFT ingenua, [18] donde 𝜀 es la precisión relativa de punto flotante de la máquina. De hecho, los errores de raíz cuadrada media (rms) son mucho mejores que estos límites superiores, siendo solo para Cooley–Tukey y para la DFT ingenua (Schatzman, 1996). [37] Estos resultados, sin embargo, son muy sensibles a la precisión de los factores de twiddle utilizados en la FFT (es decir, los valores de la función trigonométrica ), y no es inusual que las implementaciones de FFT imprudentes tengan una precisión mucho peor, por ejemplo, si utilizan fórmulas de recurrencia trigonométrica inexactas . Algunas FFT distintas de Cooley-Tukey, como el algoritmo Rader-Brenner, son intrínsecamente menos estables.
En la aritmética de punto fijo , los errores de precisión finita acumulados por los algoritmos FFT son peores, con errores rms crecientes como en el algoritmo Cooley-Tukey (Welch, 1969). [38] Lograr esta precisión requiere una cuidadosa atención al escalamiento para minimizar la pérdida de precisión, y los algoritmos FFT de punto fijo implican un reescalamiento en cada etapa intermedia de las descomposiciones como Cooley-Tukey.
Para verificar la corrección de una implementación de FFT, se pueden obtener garantías rigurosas en el tiempo mediante un procedimiento simple que verifica las propiedades de linealidad, respuesta al impulso y desplazamiento temporal de la transformación en entradas aleatorias (Ergün, 1995). [39]
Los valores de las frecuencias intermedias pueden obtenerse mediante diversos métodos de promediado.
Como se define en el artículo DFT multidimensional , la DFT multidimensional
transforma una matriz x n con un vector de índices de dimensión d mediante un conjunto de d sumas anidadas ( para cada j ), donde la división se realiza elemento por elemento. De manera equivalente, es la composición de una secuencia de d conjuntos de DFT unidimensionales, realizadas a lo largo de una dimensión a la vez (en cualquier orden).
Este punto de vista compositivo proporciona inmediatamente el algoritmo DFT multidimensional más simple y más común, conocido como el algoritmo fila-columna (después del caso bidimensional, a continuación). Es decir, uno simplemente realiza una secuencia de d FFT unidimensionales (por cualquiera de los algoritmos anteriores): primero se transforma a lo largo de la dimensión n 1 , luego a lo largo de la dimensión n 2 , y así sucesivamente (en realidad, cualquier orden funciona). Se demuestra fácilmente que este método tiene la complejidad habitual, donde es el número total de puntos de datos transformados. En particular, hay n / n 1 transformaciones de tamaño n 1 , etc., por lo que la complejidad de la secuencia de FFT es:
En dos dimensiones, x k puede verse como una matriz , y este algoritmo corresponde a realizar primero la FFT de todas las filas (resp. columnas), agrupar las filas transformadas resultantes (resp. columnas) juntas como otra matriz, y luego realizar la FFT en cada una de las columnas (resp. filas) de esta segunda matriz, y agrupar de manera similar los resultados en la matriz de resultados final.
En más de dos dimensiones, suele ser ventajoso que la localidad de caché agrupe las dimensiones de forma recursiva. Por ejemplo, una FFT tridimensional podría realizar primero FFT bidimensionales de cada "rebanada" planar para cada n 1 fijo , y luego realizar las FFT unidimensionales a lo largo de la dirección n 1. De manera más general, un algoritmo asintóticamente óptimo que ignora la caché consiste en dividir recursivamente las dimensiones en dos grupos y que se transforman recursivamente (redondeando si d no es par) (consulte Frigo y Johnson, 2005). [17] Aún así, esto sigue siendo una variación sencilla del algoritmo de fila-columna que, en última instancia, requiere solo un algoritmo FFT unidimensional como caso base, y aún tiene complejidad. Otra variación es realizar transposiciones de matriz entre las transformaciones de dimensiones posteriores, de modo que las transformaciones operen sobre datos contiguos; esto es especialmente importante para situaciones de memoria distribuida y fuera del núcleo donde acceder a datos no contiguos consume mucho tiempo.
Existen otros algoritmos FFT multidimensionales que son distintos del algoritmo fila-columna, aunque todos ellos tienen complejidad. Quizás el algoritmo FFT sin fila-columna más simple es el algoritmo FFT vector-raíz , que es una generalización del algoritmo Cooley-Tukey ordinario donde uno divide las dimensiones de la transformada por un vector de raíces en cada paso. (Esto también puede tener beneficios de caché). El caso más simple de vector-raíz es donde todas las raíces son iguales (por ejemplo, vector-raíz-2 divide todas las dimensiones por dos), pero esto no es necesario. El vector-raíz con solo una única raíz no unitaria a la vez, es decir , es esencialmente un algoritmo fila-columna. Otros métodos más complicados incluyen algoritmos de transformada polinómica debido a Nussbaumer (1977), [40] que ven la transformada en términos de convoluciones y productos polinómicos. Consulte Duhamel y Vetterli (1990) [32] para obtener más información y referencias.
Mohlenkamp [41] describió una generalización a los armónicos esféricos en la esfera S 2 con n 2 nodos , junto con un algoritmo que se conjetura (pero no se ha demostrado) que tiene complejidad; Mohlenkamp también proporciona una implementación en la biblioteca libftsh. [42] Rokhlin y Tygert describen un algoritmo esférico-armónico con complejidad. [43]
El algoritmo de plegado rápido es análogo a la FFT, excepto que opera sobre una serie de formas de onda agrupadas en lugar de una serie de valores escalares reales o complejos. La rotación (que en la FFT es la multiplicación por un fasor complejo) es un desplazamiento circular de la forma de onda del componente.
Varios grupos también han publicado algoritmos "FFT" para datos no equiespaciados, como se revisó en Potts et al. (2001). [44] Dichos algoritmos no calculan estrictamente la DFT (que solo se define para datos equiespaciados), sino más bien alguna aproximación de la misma (una transformada de Fourier discreta no uniforme o NDFT, que a menudo se calcula solo de manera aproximada). De manera más general, existen varios otros métodos de estimación espectral .
La FFT se utiliza en software de grabación digital, muestreo, síntesis aditiva y corrección de tono . [45]
La importancia de la FFT se deriva del hecho de que ha hecho que trabajar en el dominio de frecuencia sea tan factible computacionalmente como trabajar en el dominio temporal o espacial. Algunas de las aplicaciones importantes de la FFT incluyen: [15] [46]
Una aplicación original de la FFT en finanzas, particularmente en la valoración de opciones, fue desarrollada por Marcello Minenna. [48]
Algoritmos relacionados con FFT:
Implementaciones de FFT:
Otros enlaces:
{{cite book}}
: CS1 maint: location missing publisher (link){{cite book}}
: CS1 maint: location missing publisher (link)