Sie sind auf Seite 1von 32

Tratamiento matemático de señales y sistemas 2004-05

Transformada discreta de Fourier


Transformada rápida
(Material elaborado por Alfonsa Garcı́a López y Fráncisco Garcı́a Mazarı́o)

Introducción
A principios del siglo XIX, a partir de problemas fı́sicos como la vibración de una
cuerda o la propagación del calor, Joseph Fourier desarrolló una teorı́a matemática sobre la
representación de funciones por medio de series trigonométricas, que más tarde terminarı́a
en llamarse Análisis de Fourier.
A lo largo del siglo XIX, con la aportación importante de otros muchos matemáticos,
como Dirichlet o Riemann (y pese a la oposición de otros, todo hay que decirlo), se fue
formalizando toda la teorı́a. Con la llegada del siglo XX, la integral de Lebesgue permitió
plantear los problemas de un modo diferente, dando lugar a nuevos resultados y a nuevos
puntos de vista.
Sin embargo, si durante casi 200 años el Análisis de Fourier no ha pasado de ser un
importante campo de estudio dentro de la matemática, con aplicaciones a la fı́sica o a otras
ciencias, a partir del año 1965 la historia cambia por completo. Ese año, Cooley y Tukey
(ver [5]) publicaron un método para calcular transformadas de Fourier que significaba un
ahorro de tiempo importante respecto de todos los métodos conocidos hasta entonces, y que
posteriormente se denominarı́a transformada rápida de Fourier (o FFT, por sus iniciales
en inglés).
Este descubrimiento significó que muchos problemas, de muy diversos campos, que
antes no podı́an resolverse por la complicación de los cálculos de los coeficientes de Fourier,
ahora están al alcance de la mano. O que se hayan encontrado en los últimos años muchas
nuevas aplicaciones, insospechadas hasta entonces.
Entre estas aplicaciones, una de las más importantes es la del procesamiento de señales
digitales.
El primero en trabajar en este campo fue E. Oran Brigham (ver [3]), que escribió
el primer libro sobre transformada rápida de Fourier, gracias al cual muchos ingenieros
aprendieron los fundamentos de esta herramienta.
El estudio de señales aparece en una gran variedad de campos, y las ideas y técnicas
asociadas juegan un papel importante en áreas tan diversas de la ciencia como las co-

1
municaciones, la aeronáutica, la astronomı́a, el diseño de circuitos, acústica, sismologı́a,
ingenierı́a biomédica, procesamiento de voz . . .
Algunos ejemplos relacionados con el tratamiento de señales pueden ser:
– Diseño de transmisores y receptores de radio y televisión.
– Diagnóstico automático de electrocardiogramas.
– Restauración de señales que han sido degradadas, bien en la trasmisión de la voz
con interferencias (por ejemplo para aislar la voz del piloto del ruido de la cabina), o
bien en la recuperación y mejora de grabaciones antiguas (musicales, por ejemplo).
– Restauración de imágenes en general (por ejemplo, las imágenes enviadas por son-
das o satélites espaciales).
– Análisis de promedios de ı́ndice bursátil, con vistas a efectuar pronósticos económi-
cos . . .
Una idea de la importancia del algoritmo de Cooley y Tukey la da la cantidad de libros
que se han publicado en los últimos años (la mayorı́a, en inglés) sobre las transformadas
de Fourier (ver [4], [7], [10] o [21]), o incluso algunos únicamente sobre la transformada
rápida de Fourier (ver por ejemplo [3] o [15]). También es fácil encontrar recientemente el
citado algoritmo en muchos libros dedicados a algoritmos en general, buscándose además
continuas mejoras para su implementación de una manera más eficiente (ver [2], [6], [11],
[12] o [19]), en libros sobre análisis de señales digitales (ver [13], [14], [16] o [17]), o incluso
en libros sobre cálculo cientı́fico o simbólico (véase [8] o [20]).
En estas notas, vamos a dedicar una parte importante al estudio y aplicación de dicho
algoritmo. Pero antes de entrar en ello, veremos lo que son las series de Fourier y la
transformada discreta de Fourier, empezando con un repaso de los conceptos básicos de
operaciones con números complejos.

1. Números complejos
En el cuerpo IR de los números reales no tienen solución determinadas ecuaciones
polinómicas como x2 +1 = 0. Para resolver este problema se hace necesaria una ampliación
de los números reales introduciendo un nuevo elemento, i, que verifique dicha ecuación, y
construyendo un nuevo cuerpo que contenga a IR y a este elemento.

1.1. Definición (Forma binómica de un número complejo).


Un número complejo en forma binómica es una expresión z = x + yi, donde i es la unidad
imaginaria, que verifica i2 = −1, y x e y son números reales, que se denominan respecti-
vamente parte real de z y parte imaginaria de z, denotándose
x = Re z y = Im z.

1.2. Operaciones elementales con números complejos.


Dados los números complejos en forma binómica z1 = x1 + y1 i y z2 = x2 + y2 i, se define
z1 ± z2 = (x1 ± x2 ) + (y1 ± y2 )i
z1 · z2 = (x1 x2 − y1 y2 ) + (x1 y2 + x2 y1 )i

2
(es el producto de los binomios teniendo en cuenta que i2 = −1).
Y si z2 = 0, entonces

z1 (x1 + y1 i) (x2 − y2 i) x1 x2 + y1 y2 x2 y1 − x1 y2
= = 2 2 + i.
z2 (x2 + y2 i) (x2 − y2 i) x2 + y2 x22 + y22

En particular, el inverso del número z = x + yi = 0 es


1 x y
= 2 2
− 2 i.
z x +y x + y2

1.3. Observaciones.
(1) El número complejo x + yi se puede representar en el plano IR2 como el punto de
coordenadas cartesianas (x, y).
(2) El conjunto CI de los números complejos, con las operaciones definidas tiene estructura
de cuerpo, que contiene al de los números reales ya que un número real es un complejo
de la forma x + iy con y = 0. Además este cuerpo es algebraicamente cerrado, es decir
I .
toda ecuación polinómica con coeficientes complejos tiene solución en C
I no admite un orden total compatible con la estructura de cuerpo.
(3) C

1.4. Potencias de la unidad imaginaria.


Observemos que, dado que i2 = −1, las primeras potencias de la unidad imaginaria son

i1 = i i2 = −1 i3 = −i i4 = 1
i5 = i i6 = −1 i7 = −i etc.
Para calcular in con n ∈ ZZ basta elevar i al resto de la división de n entre 4.

Nota. La forma binómica no es muy adecuada para calcular potencias altas de un número
complejo x + iy con x, y = 0, ya que serı́a necesario calcular la potencia del binomio y
después simplificar las sucesivas potencias de i. Por ejemplo

(−1 + 2i)3 = (−1)3 + 3(−1)2 (2i) + 3(−1)(2i)2 + (2i)3 = −1 + 6i + 12 − 8i = 11 − 2i.

Veremos una forma de expresar los números complejos que permite, entre otras cosas, un
cálculo más eficiente de potencias.

1.5. Definición (Complejo conjugado).


Se llama conjugado del número complejo z = x + yi al número z = x − yi.

1.6. Propiedades del conjugado.


1. Para todo z ∈ C
I se verifica z = z.
2. Si z1 , z2 ∈ C
I entonces z1 + z2 = z1 + z2 y z1 z2 = z1 · z2
 
z1 z1
Y si z2 = 0, =
z2 z2

3
z+z z−z
3. Para todo z ∈ C
I se verifica Re z = e Im z = de donde se deduce que un
2 2i
número complejo z ∈ IR si y sólo si z = z.

1.7. Definición (Módulo y argumento de un número complejo).


Dado el número complejo z = x + yi se define el módulo de z de la forma

|z| = x2 + y 2

y el argumento de z es un ángulo θ, denotado arg z, que verifica

x = |z| cos θ , y = |z| sen θ.

En la figura 1 se puede observar el significado geométrico del módulo y el argumento de


un número complejo:

Figura 1. Módulo y argumento de un número complejo.

Observemos que, dado que las funciones trigonométricas son periódicas, hay infinitos
argumentos de un número complejo. Llamaremos argumento principal de z = 0, y lo
denotaremos Arg z, al único argumento θ ∈ [0, 2π).

Nota. Se puede calcular el argumento de z = x + yi con x = 0 teniendo en cuenta que


y
tg θ = y los signos de x e y.
x

1.8. Ejemplo: El número complejo z = −1 + 3i tiene modulo 2 y argumento 2π/3, ya
que 
√ 2 √
(−1)2 + 3 = 2 , 2 cos(2π/3) = −1 y 2 sen(2π/3) = 3 ,
√ √
2 2
mientras que el número complejo z = 2
−i 2
tiene módulo 1 y argumento −π/4.

1.9. Propiedades del módulo y argumento.


1. |z| ≥ 0 ∀z ∈ C
I .
2. |z| = 0 ⇐⇒ z = 0.
3. |z|2 = z · z ∀z ∈ C
I .
4. |z1 + z2 | ≤ |z1 | + |z2 | ∀z1 , z2 ∈ C
I .

4
5. |z1 z2 | = |z1 ||z2 | ∀z1 , z2 ∈ C
I .
6. Si θ1 es un argumento de z1 y θ2 es un argumento de z2 entonces θ1 +θ2 es un argumento
z1
de z1 · z2 y θ1 − θ2 es un argumento de cuando z2 = 0.
z2

1.10. Definición (Exponencial compleja).


Dado ϕ ∈ IR se define eiϕ = cos ϕ + i sen ϕ.
Ası́, dado un número complejo z = x + yi, la exponencial de z es

ez = ex (cos y + i sen y).

1.11. Teorema. Todo número complejo z puede expresarse de la forma

z = ρeiθ

siendo ρ = |z| y θ un argumento de z.


Ası́, z = x + iy = ρeiθ = ρ(cos θ + i sen θ).

1.12. Observaciones.
(1) A la expresión z = ρeiθ dada por el teorema anterior se le suele llamar forma expo-
nencial o polar del número complejo z. Para obtenerla con Maple podemos usar las
funciones abs (para determinar el módulo) y argument (que devuelve un argumento
en (−π, π]).
(2) Para operar con números complejos se utilizará la forma de éstos en la cual los cálculos
sean más sencillos, por ejemplo el producto y el cociente de números complejos en forma
polar admiten una expresión muy simple (téngase en cuenta la propiedad 1.10.6):

z1 z2 = ρ1 ρ2 ei(θ1 +θ2 )
iθ1 iθ2
si z1 = ρ1 e , z2 = ρ2 e entonces z1 ρ1
= ei(θ1 −θ2 ) si z2 = 0.
z2 ρ2

Esto permite una sencilla interpretación geométrica para el producto de dos números
complejos: el número complejo z1 z2 tiene por módulo el producto de los módulos de
z1 y z2 y por argumento la suma de los argumentos.
En particular, multiplicar un número complejo z por otro de módulo 1 y argumento θ
supone un giro de θ radianes.

1.13. Ejemplo: El número complejo z = −1 + 3i se escribe en forma polar:
√ 2π
z = −1 + 3i = 2ei 3 ,
√ √
2 2
mientras que z = 2 −i 2 en forma polar será z = e−iπ/4 (ver ejemplo 1.9).

1.14. Propiedades de la exponencial compleja.


1. e0 = 1.

5
2. ez = 0 ∀z ∈ C
I .
3. ez1 ez2 = ez1 +z2 ∀z1 , z2 ∈ C
I .
4. |ez | = eRe z ∀z ∈ C
I .
5. ez = 1 ⇐⇒ z = 2kπi con k ∈ ZZ.
6. ez1 = ez2 ⇐⇒ z1 − z2 = 2kπi con k ∈ ZZ. (La función exponencial compleja no es
inyectiva).
7. ez = ez I . En particular, eix = e−ix
∀z ∈ C ∀x ∈ IR.

1.15. Observación. Una fórmula que engloba las constantes más usuales en Matemáticas
es
eπi + 1 = 0
expresión sorprendentemente simple, denominada fórmula de Euler, que presentamos a
modo de curiosidad.

1.16. Potencia de un número complejo. Fórmula de De Moivre.


(n
Para calcular una potencia entera z n = z · · · z de un número complejo puede utilizarse la
fórmula del binomio de Newton si z está expresado en forma binómica, pero si n es grande
el proceso resulta laborioso. Sin embargo, en forma polar, la potencia z n se puede obtener
fácilmente ya que
 n
z n = ρeiθ = ρn einθ
o lo que es lo mismo:

z n = ρn(cos nθ + i sen nθ) (1)

es decir z n tiene módulo ρn y argumento nθ.


La expresión (1) se conoce como fórmula de De Moivre y, además de su utilidad en
este contexto, se puede aplicar para obtener relaciones entre las razones trigonométricas
de un ángulo y las de sus múltiplos enteros.

1.17. Raı́ces enteras de un número complejo.


Dado el número complejo z = ρeiθ = 0 existen n números wk , k = 0, 1, . . . n − 1, que
verifican (wk )n = z, es decir son las raı́ces n-ésimas de z. Además, estos números son

√ θ+2kπ
wk = n ρ ei n k = 0, 1, . . . n − 1.

1.18. Observación. Todas las raı́ces de un número complejo z = ρeiθ tienen el mismo

módulo n ρ y sus argumentos se obtienen empezando en nθ e incrementando sucesivamente

n radianes. Teniendo en cuenta la observación 1.13 (2), las raı́ces wk se pueden expresar
de modo recurrente por:

√ θ 2π
w0 = n ρ ei n , wk = ei n wk−1 k = 1, . . . n − 1.

6
1.19. Raı́ces n-ésimas de la unidad.
Puesto que 1 = e0i , sus raı́ces n-ésimas son
2π 4π 6π 2π(n−1)
1, ei n , ei n , ei n , . . . , ei n .

1.20. Propiedades de las raı́ces n-ésimas de la unidad.


1. La suma de las raı́ces n-ésimas de la unidad es 0.

En efecto, si w = ei n , entonces la suma es

S = 1 + w + w2 + w3 + . . . + wn−1 .

Y por tratarse de una progresión geométrica de razón w,

1 − wn
S= = 0.
1−w

2. Si w es una raı́z n-ésima de la unidad, w = 1, entonces

1 + w + w2 + w3 + . . . + wn−1 = 0.

(Véase la propiedad 1.)


3. Si n es par y w es una raı́z n-ésima de la unidad, entonces w2 es una raı́z n/2-ésima
de la unidad.
Esto es evidente, ya que (w2 )n/2 = wn = 1.

1.21. Ejemplo: Las raı́ces cuartas de 1 son, como es sabido, 1, −1, i y −i. Y pueden
expresarse de la forma:
π 2π 2·2π 3π 3·2π
1, i = ei 2 = ei 4 , −1 = eiπ = ei 4 , −i = ei 2 = ei 4 .

Si tomamos, por ejemplo, la raı́z w = −i, se tiene que

1 + w + w2 + w3 = 1 + (−i) + (−1) + (+i) = 0.

Además, w2 = −1, que es una raı́z cuadrada de la unidad.

7
2. Series de Fourier
Supongamos que queremos estudiar una magnitud de un cierto fenómeno natural que
viene expresada como una función y(t) del tiempo. Vamos a tratar de expresarla de la
forma
y(t) = ai xi (t),
es decir como combinación lineal de unas funciones sencillas, xi (t), que se denominan carac-
terı́sticas elementales. Los coeficientes ai deben ser constantes y constituyen el espectro de
la función y(t). Es de suponer que la distribución y magnitud de los ai nos proporcione
información sobre y(t).
Por ejemplo, el espectro del ecocardiograma puede informar al médico sobre el es-
tado del corazón; el espectro del ruido de un motor puede informar sobre su estado de
funcionamiento . . .
El estudio de este tipo de problemas es el objetivo de una disciplina denominada análisis
armónico. El método propuesto lleva asociados tres problemas:
1. La elección adecuada de las caracterı́sticas elementales xi (t).
2. Cálculo del espectro, o sea de los coeficientes ai .
3. Interpretación de la información.
No vamos a entrar ahora en la interpretación de la información, entre otras cosas
porque depende en buena parte del fenómeno mismo que se estudia.
En los métodos de cálculo es donde más influencia ha tenido el desarrollo reciente de
los ordenadores. De los métodos analógicos, gráficos, mecánicos . . . para calcular los
coeficientes, se ha pasado al dominio casi absoluto de los medios digitales, simplificados en
gran medida gracias al algoritmo de Cooley y Tukey (ver [5]).
En cuanto al primer problema, el método de Fourier lo resuelve tomando funciones
exponenciales complejas (einx ) o trigonométricas (senos y cosenos). Pero hay que tener
en cuenta que para que las caracterı́sticas elementales se ajusten bien a determinados
fenómenos naturales, ası́ como para determinar más fácilmente el espectro, es bueno que las
funciones xi (t) sean ortogonales, de manera que estamos poniendo y(t) como combinación
lineal de vectores ortogonales.
El concepto de ortogonalidad se puede definir en un espacio vectorial cualquiera, y no
solamente en IR2 o IR3 , y va ligado al concepto de producto escalar. Si V es un espacio
vectorial sobre el cuerpo C I de los números complejos (lo mismo valdrı́a para espacios
vectoriales sobre IR), se llama producto escalar sobre V a una aplicación

·, · : V × V −→ C
I
(u, v) −→ u, v

que verifica las siguientes propiedades:


i) u1 + λu2 , v = u1 , v +λ u2 , v para u1 , u2 , v ∈ V , λ ∈ C
I .
ii) u, v1 + λv2  = u, v1  +λ u, v2  para u, v1 , v2 ∈ V , λ ∈ C
I .
iii) u, v = v, u para todo u, v ∈ V .
iv) u, u ≥ 0 para todo u ∈ V y además u, u = 0 si y sólo si u = 0.

8
Se dice que dos elementos u, v ∈ V son ortogonales si su producto escalar es 0, y suele
escribirse u ⊥ v ⇐⇒ u, v = 0. Y se dice que un subconjunto de V es ortogonal si son
ortogonales cada par de elementos diferentes de dicho conjunto.

2.1. Series trigonométricas o de Fourier.


En el espacio vectorial de las funciones continuas de un intervalo [a,
b] con valores
b
complejos se puede tomar el producto escalar dado por la fórmula f, g = a f(x)g(x) dx,
con lo que se tiene que
b
f ⊥ g ⇐⇒ f(x)g(x) dx = 0.
a

Si consideramos por ejemplo el intervalo [0, 2π] y las funciones en (x) = einx para n ∈ ZZ
es fácil comprobar que el conjunto de funciones {en : n ∈ ZZ} es un conjunto ortogonal. En
efecto, si n = m:
2π 2π 2π 2π
inx −imx ei(n−m)x
en , em  = einx eimx dx = e e dx = i(n−m)x
e dx =
0 0 0 n−m 0
i(n−m)2π
e − e0 1−1
= = = 0.
n−m n−m

Observemos además que todas estas funciones en son periódicas de perı́odo 2π ya que
en (x + 2π) = ein(x+2π) = einx · e2πni = einx · 1 = einx = en (x).
Supongamos que tenemos otra función periódica de perı́odo 2π con valores complejos,
f : [a, b] −→ C
I , siendo [a, b] el intervalo [0, 2π] o bien [−π, π]. Nos preguntamos si podremos
escribir


f(x) = cn einx (2)
−∞

para unos ciertos valores de los coeficientes cn .


Fourier conjeturó en su tiempo que la respuesta a esta pregunta era afirmativa, aunque
no todos los matemáticos de la época estaban de acuerdo. El problema principal radicaba
en formalizar la idea de suma infinita. Hoy en dı́a la igualdad (2) se interpreta en el sentido
de que la suma infinita sea una serie convergente cuyo lı́mite (o suma) coincide con f(x)
para todo valor de x. Es otras palabras, la pregunta viene a decir si

N
lim f(x) − einx = 0
N →∞
n=−N

para todo x, o sea si f puede ser el lı́mite de unos determinados “polinomios trigonométri-
cos”. La respuesta positiva a dicha pregunta no se puede sin embargo garantizar en todos
los casos, como veremos un poco más adelante.
Denominaremos serie de Fourier a una serie que se obtiene tomando, en el problema
general del análisis armónico que acabamos de ver, las funciones {einx : n ∈ ZZ} como
caracterı́sticas elementales para representar a otras funciones (que deberán ser periódicas
como las en ).

9
Vamos a proceder ahora a calcular el espectro, o sea los coeficientes (cn ) tales que


f(x) = cn einx
−∞

para todo todo x ∈ [−π, π]. Supongamos además que la convergencia de la serie anterior
permite intercambiar los signos de integral y de sumatorio. De esta forma, basándonos en
la ortogonalidad de las funciones elegidas, al hacer el producto escalar de la función f con
cada una de las caracterı́sticas elementales iremos obteniendo los coeficientes:
Para calcular el coeficiente ck basta hacer f, ek :
π π ∞
 ∞
π
−ikx inx −ikx
f(x)e dx = cn e e dx = cn ei(n−k)x dx
−π −π n=−∞ n=−∞ −π
π π
= ck e0 dx + cn ei(n−k)x dx = ck · 2π
−π n=k −π

de donde se obtiene que, para todo k ∈ ZZ,


π
1
ck = f(x)e−ikx dx.
2π −π

2.2. Definición.
Dada una función f integrable en [−π, π], se define la serie de Fourier de f como


SF (f) = cn einx
n=−∞

siendo π
1
cn = f(x)e−inx dx
2π −π

para todo n ∈ ZZ, a los que denominaremos coeficientes de Fourier de f.


El problema sobre si la serie de Fourier es o no convergente a la función f original, o
sobre cuándo converge y de qué manera, es decir los problemas de convergencia y repre-
sentación de las series de Fourier, han estado muy ligados al desarrollo de la historia de
la matemática desde que en 1807 Fourier dio a conocer su teorı́a. El último de los más
importantes teoremas sobre convergencia de series de Fourier fue publicado en el año 1966
por L. Carleson, y habla de convergencia en “casi todo punto” (ver [1], [7] o [21] para más
información). Nosotros vamos a dar un resultado más clásico que se debe a Dirichlet:

2.3. Teorema. Sea f una función 2π-periódica y derivable a trozos. Entonces para cada
x ∈ IR las sumas parciales de la serie de Fourier de f convergen a
1 
f(x+ ) + f(x− ) .
2
Si f es continua en el punto x, entonces convergen a f(x).

10
2.4. Series de Fourier en senos y cosenos.
Si f es una función periódica de perı́odo 2π y con valores reales, puede resultar más
apropiado escribir f como una suma (infinita) de combinaciones lineales senos y cosenos,
en lugar de acudir a las exponenciales complejas.
Esto puede conseguirse transformando la suma de serie de Fourier de f en dos sumas,
correspondientes una a los términos “positivos” y otra a los “negativos”, y teniendo en
cuenta que einx = cos(nx) + i sen(nx) para todo x. El desarrollo en serie de Fourier de f
quedarı́a entonces del siguiente modo:



 inx 
SF (f) = cn e inx
= c0 + cn e + c−n e−inx
n=−∞ n=1

 
= c0 + cn cos(nx) + cn i sen(nx) + c−n cos(nx) − c−ni sen(nx)
n=1

 
= c0 + (cn + c−n) cos(nx) + i(cn − c−n ) sen(nx) .
n=1

Si llamamos an = cn + c−n y bn = i(cn − c−n) para todo n ≥ 0, se tiene que



a0  
SF (f) = + an cos nx + bn sen nx
2 n=1

y a esta suma le llamaremos serie de Fourier en senos y cosenos de la función f.

Nota. Observemos que tal como hemos definido los coeficientes an y bn , éstos pueden
obtenerse de la siguiente forma:
π π
1 −inx 1
an = cn + c−n = f(x)e dx + f(x)einx dx
2π −π 2π −π
π π
1  −inx  1
= f(x) e +e inx
dx = f(x) · 2 cos(nx) dx
2π −π 2π −π

1 π
= f(x) cos(nx) dx
π −π
mientras que
π π
1 −inx 1
bn = i(cn − c−n) = i f(x)e dx − i f(x)einx dx
2π −π 2π −π
π π
1  −inx  1
= f(x) · i e −e inx
dx = f(x) · i(−2i) sen(nx) dx
2π −π 2π −π

1 π
= f(x) sen(nx) dx.
π −π

Resumiendo, la serie de Fourier en senos y cosenos de una función f se puede escribir


de la forma

a0  
SF SC(f) = + an cos nx + bn sen nx
2 n=1

11
donde π π
1 1
an = f(x) cos nx dx y bn = f(x) sen nx dx
π −π π −π

para todo n ≥ 0.
Obsérvese que, tal como hemos deducido al obtener la serie de Fourier en senos y
cosenos de una función f, se verifica que SF (f) = SF SC(f) cuando una de ellas converge.
Incluso se da la igualdad entre las sumas parciales de ambas series, es decir


N
a0 
N

inx
cn e = + an cos nx + bn sen nx
2 n=1
n=−N

para todo N ∈ IN .

2.5. Ejemplo: Vamos a obtener la serie de Fourier para la función f(x) = x (definida en
el intervalo [−π, π] y extendida por periodicidad.
π π
1 1 2
an = x cos nx dx = 0 bn = x sen nx dx = (−1)n
π −π π −π n

Luego la serie es

2
SF (f) = (−1)n+1 sin(nx)
n=1
n

2.6. Funciones con perı́odo distinto de 2π.


Para funciones periódicas con perı́odo distinto de 2π también es posible representarlas
por medio de funciones trigonométricas, tanto como combinación de exponenciales com-
plejas como con senos y cosenos: si f es una función definida en el intervalo [0, l] y de
perı́odo l, se llama serie de Fourier de f a la serie

l
2πinx/l 1
SF (f) = cn e siendo cn = f(x)e−2πinx/l dx.
n=−∞
l 0

para todo n ∈ ZZ. Y análogamente, el desarrollo en serie de Fourier en senos y cosenos de


f será
∞  
a0 2nπx 2nπx
SF SC(f) = + an cos + bn sen
2 n=1
l l

donde
l l
2 2nπx 2 2nπx
an = f(x) cos dx y bn = f(x) sen dx
l 0 l l 0 l
para todo n ≥ 0. Nosotros sin embargo trabajaremos siempre con funciones periódicas de
perı́odo 2π.

2.7. Fenómeno de Gibbs.

12
Consideremos la función f de perı́odo 2π cuyos valores en el intervalo (−π, π] son

 −1 si − π < x < 0

f(x) = 1 si 0 < x < π


0 si x = 0, π.
Su gráfica es una “onda cuadrada” (ver figura 2). Teniendo en cuenta el teorema 2.3, se
verifica que la serie de Fourier de f converge a la función en todo punto. Calculando la
serie de Fourier en senos y cosenos de f se tiene por tanto que

4 sen(2n − 1)x
f(x) =
π n=1 2n − 1

para todo x ∈ IR.

Figura 2. Onda cuadrada.


En 1898 Michelson y Stratton diseñaron un analizador armónico capaz de obtener
de modo automático los 80 primeros coeficientes de la serie de Fourier de una función y
usaban la suma parcial con esos términos para reproducir la gráfica de la función original.
Al usarlo para la función f observaron una separación extraña en las proximidades del
punto de salto, que no desaparecı́a al tomar más términos (ver figuras 3 y 4). Ellos lo
atribuyeron a un fallo de su aparato, y consultaron a Gibbs. Éste encontró la explicación,
por lo que a dicho comportamiento se le pasó a denominar fenómeno de Gibbs:

13
Figura 3. Suma parcial con 10 sumandos.
Llamemos Sn (x) a la suma parcial n-ésima de la serie de Fourier de f, es decir

a0  
n n
sin((2 ∗ k − 1)x)
Sn (x) = + ak cos(kx) + bk sen(kx) =
2 2∗k−1
k=1 k=1

(en las figuras 3 y 4 pueden verse las gráficas de S10 y S50 ). Se puede comprobar que en el
intervalo (0, π) la función Sn tiene puntos crı́ticos en xm = mπn , m = 1, 2 . . . , n − 1, que son
máximos locales si m es impar y mı́nimos locales si m es par. Además el máximo absoluto
se alcanza en πn y
π
2 π sen t
lim Sn = dt ≈ 1 179.
n→∞ n π 0 t
Es decir, a pesar de que f tiene un salto de longitud 2 en el origen y que Sn(x) converge a
f(x) para todo punto x, las gráficas de Sn tienden a aproximarse a un segmento vertical
de longitud aproximadamente igual a 2 · 1 179 = 2 358.

Figura 4. Suma parcial con 50 sumandos.

3. Transformada discreta de Fourier


Para manejar una función en un ordenador suele ser necesario “discretizarla”, de mane-
ra que se obtienen los valores de la función en una cantidad finita de puntos, y se guarda
el conjunto (o la lista) de los pares formados por los puntos elegidos y las imágenes de la
función en dichos puntos. Cualquier información que se necesite posteriormente sobre la
función habrá que obtenerla de la lista almacenada.
La elección de los puntos a guardar será por tanto fundamental para obtener una
buena representación de la función. Si no tenemos más datos sobre la función parece que
serı́a razonable obtener los valores en una cantidad n (lo más grande posible) de puntos
equiespaciados del intervalo donde nos interese trabajar.
Supongamos que la función a discretizar es periódica de perı́odo 2π. Entonces una
buena opción puede consistir en guardar los valores de la función en n puntos equiespacia-
dos del intervalo [0, 2π], concretamente en los puntos xj = 2πj/n, para j = 0, 1, . . . , n − 1.

14
Para no complicar la notación, llamaremos de igual forma, f, a la función original y a su
discretización.
Vamos a considerar ahora la “serie de Fourier” de la función f discretizada. Puesto
que sólo tenemos una cantidad finita de puntos, parece lógico pensar que ahora la repre-
sentación de f se consiga con una combinación lineal finita (con igual número de sumandos
que la cantidad de puntos elegida) de funciones exponenciales complejas, o sea


n−1
f(x) ≈ Ak eikx .
k=0

Ahora bien, si tenemos en cuenta que sólo conocemos los valores de f en los puntos
xj , j = 0, 1, . . . , n − 1, deberá ser
 
n−1
2πj
f(xj ) = f = Ak e2πijk/n , j = 0, . . . n − 1,
n
k=0

para unos determinados valores Ak ∈ C I , que constituyen el espectro de la función f. Para


simplificar la notación, llamaremos w = e2πi/n , con lo que la fórmula anterior queda:


n−1
f(xj ) = Ak wjk , j = 0, . . . n − 1,
k=0

Para determinar los coeficientes Ak , por similitud a como lo hacı́amos con las series
de Fourier, basta tener en cuenta la “ortogonalidad” de la funciones e2πijk/n : en concreto,
para calcular Am multiplicamos la anterior igualdad por e−2πijm/n = w−jm , obteniéndose


n−1
−jm
f(xj )w = Ak wj(k−m) , j = 0, . . . n − 1.
k=0

Sumando ahora estas n ecuaciones:



n−1 n−1
n−1 n−1
n−1
n−1
n−1
 j
−jm j(k−m) j(k−m)
f(xj )w = Ak w = Ak w = Ak wk−m
j=0 j=0 k=0 k=0 j=0 k=0 j=0


n−1 j
Ahora, si k = m, wk−m es una raı́z de la unidad distinta de 1, luego wk−m = 0,
j=0
mientras que para k = m la suma vale 1 + 1 + · · · + 1 = n. Entonces


n−1
f(xj )w−jm = nAm
j=0

y se concluye que

1 1
n−1 n−1
−jm
Am = f(xj )w = f(xj )e−2πijm/n , m = 0, . . . n − 1,
n n
j=0 j=0

15
de donde se deduce la siguiente definición:

3.1. Definición.
Sea f : {0, 1, . . . , n−1} −→ C
I una aplicación tal que f(j) = aj para todo j = 0, 1, . . . n−1.
Se llama transformada discreta de Fourier de f a la función fˆ : {0, 1, . . . , n − 1} −→ C I
ˆ
dada por f (j) = Aj , j = 0, 1, . . . n − 1, de modo que


n−1
aj = Ak e2πijk/n , j = 0, . . . n − 1, (3)
k=0

que como acabamos de ver debe ser

1
n−1
Ak = aj e−2πijk/n , k = 0, . . . n − 1. (4)
n j=0

Puesto que las funciones toman solamente una cantidad finita, n, de valores en unos
puntos prefijados, se pueden colocar dichos valores en una lista y definir entonces la trans-
formada discreta de Fourier de una lista de la forma siguiente:

3.2. Definición.
Sea [a0 , a1 , . . . , an−1 ] una lista de n números complejos. Se define la transformada discreta
de Fourier de dicha lista como otra lista [A1 , A2 , . . . , An−1 ] cuyos valores vienen dados por
la fórmula (4). Escribiremos entonces que

T DF ([a0 , a1 , . . . , an−1 ]) = [A0 , A1 , . . . , An−1 ].

De la misma forma se define la transformada discreta de Fourier inversa, que deno-


taremos T DF I, de la forma T DF I([A0 , A1 , . . . , An−1 ]) = [a0 , a1 , . . . , an−1 ], donde los ai
vienen definidos por la fórmula (3).
Claramente, la transformada discreta de Fourier y la transformada inversa son fun-
ciones inversas, es decir, T DF (T DF I(L)) = L y T DF I(T DF (L)) = L para toda lista
L.

3.3. Observaciones.
(1) Si observamos con detenimiento la fórmula de la transformada discreta de Fourier:
 
1 1 2π
n−1 n−1
−2πijk/n 2π
Ak = aj e = f j e−2πijk/n
n 2π n n
j=0 j=0

se puede ver que no es más que una suma de Riemann, correspondiente a la partición
{2πj/n : j = 0, 1, . . . , n} del intervalo [0, 2π], de la integral

1
f(x)e−ikx dx,
2π 0

16
que es exactamente el coeficiente ck de la serie de Fourier de la función f en forma
exponencial compleja.
(2) Las fórmulas de la transformada discreta de Fourier y su inversa son, como puede
comprobarse, bastante similares. De hecho, una misma fórmula puede servir para
ambas transformaciones, sin más que tener en cuenta que el conjugado de e2πijk/n es
e−2πijk/n . Concretamente se tiene que
[A0 , A1 , . . . , An−1 ] = T DF ([a0 , a1 , . . . , an−1 ])
1
⇐⇒ [A0 , A1 , . . . , An−1 ] = T DF I([a0 , a1 , . . . , an−1 ]).
n

3.4. Ejemplo: Si consideramos la lista l = [0, 6, −5, 1], es fácil comprobar, con ayuda de
Maple por ejemplo, que T DF I(l) = [2, 5 − 5i, −12, 5 + 5i] = l .
Si ahora aplicamos la función inversa, obtendremos evidentemente que T DF (l ) = l.
Por otra parte, si en la lista l tomamos conjugados y aplicamos T DF I obtendremos:
T DF I([2, 5 + 5i, −12, 5 − 5i]) = [0, 24, −20, 4]. Dividiendo por 4 en esta lista se llega de
nuevo a la lista l (no es necesario volver a tomar conjugados porque los elementos de l son
números reales). De esta forma se comprueba lo que hemos comentado en la observación
3.3 (2).

4. Transformada rápida de Fourier


Vamos a entrar ya en el desarrollo del algoritmo de Cooley y Tukey de la transformada
rápida de Fourier. En realidad, lo que nosotros vamos a ver a continuación es el algoritmo
de la transformada rápida inversa, pero como vimos en la sección de la transformada
discreta de Fourier, el paso de uno a otro es sencillo. Por otra parte, la nomenclatura al
respecto no es estándar, y lo que nosotros hemos llamado transformada inversa es para
muchos autores la transformada discreta de Fourier (por ejemplo, en las referencias [2],
[8], [10] y [19] de la bibliografı́a), mientras que algunos otros colocan el factor n1 en la
transformada inversa pero la exponencial con signo negativo en la directa (ver [3], [12],
[14], [16] y [17]).
Antes de describir el algoritmo, veremos un ejemplo ilustrativo, como es el de la mul-
tiplicación rápida de polinomios

4.1. Multiplicación de polinomios.


El producto de polinomios de grado alto no es precisamente un problema sencillo desde
el punto de vista computacional. En teorı́a se puede hacer de la forma
n  m 

n+m
i  j
ai x bj x = ck xk ,
i=0 j=0 k=0

con ck = ai bj . Pero si contamos el número total de productos numéricos (que es lo
i+j=k
más costoso del cálculo) que hay que efectuar resulta, en el caso m = n,
(n + 1)(n + 2) (n + 1)n
1 + 2 + 3 + · · · + n + (n + 1) + n + · · · + 2 + 1 = + = (n + 1)2 ∼ n2 .
2 2
17
Vamos a intentar hacer esta multiplicación con un número menor de productos numéri-
cos, lo que llevará consigo un coste menor. La idea básica del razonamiento consiste en
multiplicar, no los coeficientes de los polinomios, sino sus valores en una cantidad finita de
puntos. Esta última operación puede llevarse a cabo con sólo un producto por cada punto.
El proceso a seguir será pues el siguiente: en primer lugar evaluar los polinomios (de
grados n y m) en n + m + 1 puntos, después hacer los n + m + 1 productos y finalmente
determinar el único polinomio de grado menor o igual que n + m que pase por esos puntos.
¡Y todo esto se puede hacer con un coste menor!
Observemos que un polinomio de grado n − 1 se puede almacenar:
• Por medio de sus n coeficientes.
• Por sus raı́ces, indicando multiplicidad, junto con su coeficiente principal.
• Por sus valores en n puntos concretos, por ejemplo en las n raı́ces n-ésimas complejas
de la unidad.

4.2. Ejemplo: El polinomio P (x) = x3 − 5x2 + 6x podemos guardarlo en forma de lista


de alguna de las maneras siguientes:
• Coeficientes: [0, 6, −5, 1].
• Raı́ces: [0, 2, 3, 1] (el 1 final es el coeficiente principal).
• Valores en {1, i, −1, −i}: [2, 5 + 5i, −12, 5 − 5i] (observemos que, según se vio en el
ejemplo 3.4, esta lista es la transformada discreta de Fourier inversa de la lista de los
coeficientes).

Habitualmente, los polinomios se dan por medio de los coeficientes, pero a nosotros
nos interesan sus valores en unos determinados puntos, por lo que necesitamos una forma
eficiente de pasar de una representación a otra.

4.3. Evaluación de polinomios.


Dado un polinomio de grado n − 1 con coeficientes [a0 , a1 , . . . , an−1 ],

P (x) = a0 + a1 x + a2 x2 + . . . + an−1 xn−1 ,

consideremos las raı́ces n-ésimas de la unidad wj = e2πij/n , j = 0, 1, . . . , n − 1. La


evaluación de P en los wj será


n−1
n−1
P (wj ) = ak wjk = ak e2πijk/n
k=0 k=0

que como se puede observar consiste en aplicar la transformada de Fourier discreta inversa
a la lista [a0 , a1 , . . . , an−1 ].
Para evaluar un polinomio se puede hacer directamente, o bien mediante el esquema de
Horner, pero en ambos casos el coste es demasiado elevado (al menos O(n2 )). Vamos a ver
que se puede conseguir, mediante un algoritmo del tipo “divide y vencerás”, la evaluación
del polinomio en las raı́ces n-ésimas complejas de la unidad con un coste de n log n.

18
Hagámoslo primero en un caso particular para hacernos una idea de la técnica general:
tomemos n = 4, es decir un polinomio de grado 3,

P (x) = a0 + a1 x + a2 x2 + a3 x3 ,

y vamos a evaluarlo en las raı́ces cuartas de la unidad: 1, i, i2 = −1, i3 = −i.

P (ij ) = a0 + a1 ij + a2 i2j + a3 i3j


= (a0 + a2 i2j ) + (a1 ij + a3 i3j )
= (a0 + a2 i2j ) + ij (a1 + a3 i2j ), j = 0, 1, . . . , 3.

Si nos fijamos, a0 + a2 i2j es la evaluación del polinomio de coeficientes a0 y a2 (de


grado 1) en i2j , que es una raı́z cuadrada de la unidad (de las que sólo hay 2). Y lo mismo
habrı́a que hacer con el polinomio de coeficientes a1 y a3 . Puesto que las raı́ces cuadradas
de la unidad son 1 e i2 = −1, hay que calcular

a0 + a2 a1 + a3
2
a0 + a2 i a1 + a3 i2

y después multiplicar los sumandos impares por ij y sumarles los pares, es decir:

j=0 P (i0 ) = (a0 + a2 ) + (a1 + a3 )


j=1 P (i1 ) = (a0 + a2 i2 ) + i(a1 + a3 i2 )
j=2 P (i2 ) = (a0 + a2 i4 ) + i2 (a1 + a3 i4 ) = (a0 + a2 ) + i2 (a1 + a3 )
j=3 P (i3 ) = (a0 + a2 i6 ) + i3 (a1 + a3 i6 ) = (a0 + a2 i2 ) + i3 (a1 + a3 i2 ).

El número total de productos a efectuar es ahora de 8, frente a 16 que se obtendrı́an


por otros procedimientos. Incluso podemos ahorrarnos la mitad de los productos si nos
damos cuenta de que i2 = −1 y que i3 = −i, con lo que para j = 2 y j = 3 no es necesario
hacer ningún producto nuevo. Esta técnica se puede llevar a cabo siempre que n sea una
potencia de 2.
Teniendo en cuenta que hacer la transformada discreta de Fourier inversa es equivalente
a evaluar un polinomio en las raı́ces n-ésimas complejas de la unidad, lo que vamos a obtener
no es ni más ni menos que un algoritmo para evaluar de manera rápida un polinomio en
las raı́ces n-ésimas complejas de la unidad.

4.4. Caso particular para potencias de 2.


Por ahora supondremos siempre que n es potencia de 2. El caso general del algoritmo
lo veremos más adelante. Sea pues n = 2r , y sea f un polinomio de grado n − 1, f(x) =

n−1
ak xk . Sus valores en las n raı́ces n-ésimas complejas de la unidad, wj = e2πij/n ,
k=0
j = 0 . . . n − 1, son


n−1
2 n−1
f(wj ) = ak wjk = a0 + a1 wj + a2 (wj ) + · · · + an−1 (wj )
k=0

19
para j = 0, 1, . . . , n − 1. Separemos la suma en dos sumandos, colocando por un lado los
términos de subı́ndice par y por otro los de subı́ndice impar:


n/2−1

n/2−1
f(wj ) = a2m wj2m + a2m+1 wj2m+1
m=0 m=0


n/2−1

n/2−1
= a2m (wj2 )m + wj a2m+1 (wj2 )m .
m=0 m=0

Observemos que:
• Los coeficientes de la primera suma son [a0 , a2 , . . . , an−2 ].
• Los coeficientes de la segunda suma son [a1 , a3 , . . . , an−1 ].
• Por ser n potencia de 2, wj2 , j = 0, 1, . . . n/2 − 1, son precisamente las raı́ces de orden
n/2 de la unidad.
• Las potencias de ambas sumas son las mismas, y se trata de la potencia j-ésima de las
raı́ces complejas de la unidad de orden n/2 = 2r−1 .
El problema se reduce pues a la evaluación de dos polinomios, de grado n/2 − 1, en las
raı́ces n/2-ésimas de la unidad.

4.5. Observación. Hay que tener en cuenta un pequeño detalle: pongamos

f(wj ) = Q1 (j) + wj Q2 (j)

donde Q1 y Q2 son las dos sumas en que ha quedado descompuesta la evaluación f(wj ),
que como hemos visto son sendos polinomios de grado n/2 − 1. Puesto que sólo hay
n/2 raı́ces n/2-ésimas de la unidad, con la evaluación de dichos polinomios obtendremos
solamente los valores f(wj ) para j = 0, 1, . . . , n/2 − 1. Para la obtención de f(wj ) con
n/2 ≤ j ≤ n − 1 hay que tener en cuenta lo siguiente:


n/2−1

n/2−1
 m
Q1 (j) = a2m (wj2 )m = a2m (wj−n/2 )2
m=0 m=0

ya que (wj−n/2 )2m = e2πi(j−n/2)2m/n = e2πij2m/n e−2πim = (wj )2m · 1 = (wj )2m . Por lo
tanto Q1 (j − n/2) = Q1 (j).
Análogamente se prueba que Q2 (j − n/2) = Q2 (j) si n/2 ≤ j ≤ n − 1, con lo que se
obtiene que
f(wj ) = Q1 (j − n/2) + wj Q2 (j − n/2)
para j = n/2, . . . , n − 1. Si además tenemos en cuenta que wj = −wj+n/2 , se concluye que

f(wj+n/2 ) = Q1 (j) − wj Q2 (j)

para todo j = 0, 1, . . . , n/2 − 1.


Resumiendo, para obtener la evaluación del polinomio f, de grado n − 1, en las raı́ces
n-ésimas de la unidad, wj , haremos

f(wj ) = Q1 (j) + wj Q2 (j), f(wj+n/2 ) = Q1 (j) − wj Q2 (j)

20
para todo j = 0, 1, . . . , n/2 − 1, siendo Q1 (j) y Q2 (j) el resultado de evaluar sendos
polinomios de grado n/2 − 1 en las raı́ces n/2-ésimas de la unidad, wj2 , concretamente:


n/2−1

n/2−1
Q1 (j) = a2m (wj2 )m , Q2 (j) = a2m+1 (wj2 )m .
m=0 m=0

En esto consiste el algoritmo de Cooley-Tukey, que pasamos ya a describir:

4.6. Algoritmo IF F T para la evaluación rápida de polinomios.

entrada:
n → número entero, potencia de 2.
a → lista de n números complejos, a := [a[0], . . . , a[n − 1]]
si n = 1, entonces A[0] := a[0]
en otro caso
listapares := [a[0], a[2], . . . , a[n − 2]]
listaimpares := [a[1], a[3], . . . , a[n − 1]]
u := IF F T (n/2, listapares)
v := IF F T (n/2, listaimpares)
para j desde 0 hasta n/2 − 1 hacer
A[j] := u[j] + exp(2πij/n) · v[j]
A[j + n/2] := u[j] − exp(2πij/n) · v[j]
salida:
IF F T (n, a) := [A[0], A[1], . . . , A[n − 1]].

4.7. Ejemplo: Vamos a aplicar el algoritmo IF F T para n = 4 y la lista [0, 6, −5, 1].
listapares := [0, −5], listaimpares := [6, 1].
Calculamos IF F T (2, [0, −5]):
listapares := [0], listaimpares := [−5]
IF F T (1, [0]) := [0], IF F T (1, [−5]) := [−5],
u := [0], v := [−5].
Para j = 0, A[0] := u[0] + e0 v[0] = −5 y A[1] := u[0] − v[0] = 5.
Luego IF F T (2, [0, −5]) := [−5, 5]. Y por lo tanto u := [−5, 5]
Calculamos ahora IF F T (2, [6, 1]):
listapares := [6], listaimpares := [1]
IF F T (1, [6]) := [6], IF F T (1, [1]) := [1],
u := [6], v := [1].
Para j = 0, A[0] := u[0] + v[0] = 7 y A[1] := u[0] − v[0] = 5.
Luego IF F T (2, [6, 1]) := [7, 5]. Y por lo tanto v := [7, 5]

21
Y calculamos finalmente los valores de la lista de salida:
Para j = 0, A[0] := u[0] + v[0] = −5 + 7 = 2 y A[2] := u[0] − v[0] = −5 − 7 = −12.
Para j = 1, A[1] := u[1] + e2πi/4 · v[1] = 5 + 5i y A[3] := u[1] − e2πi/4 · v[1] = 5 − 5i.
Salida: IF F T := [2, 5 + 5i, −12, 5 − 5i].

4.8. Coste de la evaluación rápida.


Puesto que de las operaciones a realizar para aplicar al algoritmo de Cooley y Tukey la
más costosa es el producto de números complejos, vamos a medir la complejidad en función
del número de dichos productos.
Sea por tanto y(k) el número de multiplicaciones complejas necesarias para calcular
IF F T sobre una lista de tamaño n = 2k . Entonces, el cálculo de IF F T (n/2, listapares)
supondrá y(k − 1) multiplicaciones complejas, y otras tantas serán necesarias para obtener
IF F T (n/2, listaimpares). Además, el algoritmo consta de un bucle para llegar a la lista
de salida, para el cual se precisan n/2 = 2k−1 multiplicaciones. Es decir

y(k) = 2y(k − 1) + 2k−1

con la condición inicial y(0) = 0, pues cuando n = 1 no es necesario multiplicar nada.


Resolvemos la ecuación en diferencias: puesto que es lineal de orden 1, resolvemos
primero la homogénea y(k) = 2y(k − 1), cuya solución general es y(k) = 2k c, con c
constante. Aplicando el método de variación de las constantes, buscamos una sucesión
c(k) tal que y(k) = 2k c(k) sea solución de la ecuación completa. Se obtiene

2k c(k) = 2 · 2k−1 c(k − 1) + 2k−1


1
c(k) = c(k − 1) +
2
    k
c(k) = c(0) + c(1) − c(0) + · · · + c(n) − c(n − 1) = c(0) + .
2

Imponiendo la condición inicial se tiene que y(k) = k2k−1 . Y poniéndolo en función de


n = 2k , el coste resulta ser igual a
n
log2 n.
2

4.9. Proceso inverso.


El algoritmo IF F T permite el paso de la representación de un polinomio por medio de sus
coeficientes a la representación por sus valores en las raı́ces n-ésimas de la unidad (cuando
n es potencia de 2).
Veamos ahora cómo realizar el proceso inverso, es decir obtener los coeficientes a partir
de los valores en las raı́ces n-ésimas de la unidad.
O sea, dados f(wj ) = Aj para j = 0, 1, . . . n−1, se trata de buscar ak , k = 0, 1, . . . n−1
de modo que

n−1
Aj = ak e2πijk/n .
k=0

22
Es decir, hay que hacer la transformada discreta de Fourier de la lista [A0 , A1 , . . . , An−1 ].
Por lo tanto será
1
n−1
ak = Aj e−2πijk/n , k = 0, . . . n − 1.
n
j=0

para todo k = 0, 1, . . . n − 1.
Si tenemos en cuenta la obervación 3.3 (2), para calcular [a0 , a1 , . . . , an−1 ] basta aplicar
el algoritmo IF F T a la lista [A0 , A1 , . . . , An−1 ], y en los elementos de la lista obtenida
hacer conjugados y dividir por n.

4.10. Observación. No vamos a detallar el algoritmo de la transformada rápida de


Fourier (F F T ), puesto que como hemos visto se puede obtener de manera casi inmediata
aplicando el algoritmo IF F T .
Pero hagamos notar que en ocasiones el paso a conjugados no es una operación trivial
(Maple, por ejemplo, se puede complicar si no tiene dado el número complejo en forma
binómica). Por tanto, puede ser preferible definir un nuevo algoritmo F F T . En tal caso, la
descripción de dicho algoritmo serı́a exactamente igual a la de IF F T , añadiendo un signo
negativo en el exponente de las exponenciales complejas, y dividiendo por 2 los elementos
de la lista de salida para n > 1.
Pregunta para el lector: ¿por qué se divide al final por 2 y no por n?

4.11. Producto de polinomios.


Estamos ya en condiciones de obtener la multiplicación de polinomios de manera rápida,
aplicando el algoritmo de Cooley-Tukey. Puesto que solamente hemos visto este algoritmo
en el caso de que n sea potencia de 2, para poder aplicarlo a cualquier polinomio habrá
que usar lo que se conoce como técnica de relleno, que consiste simplemente en añadir los
ceros que sean necesarios a los coeficientes del polinomio hasta llegar a un orden n − 1 con
n potencia de 2.
Sean pues f y g dos polinomios, de grado n y m respectivamente, dados por las listas
de sus coeficientes. Los pasos a seguir para obtener la lista de los coeficientes de fg son
los siguientes:
1. Se considera el menor número entero N , potencia de 2 y mayor o igual que n + m + 1.
2. Se añaden ceros a las listas de coeficientes de f y de g hasta que tengan tamaño N .
3. Se aplica el algoritmo IF F T a cada una de las listas anteriores, obteniéndose las eva-
luaciones de f y g en las raı́ces N -ésimas de la unidad.
4. Se hacen los productos término a término de las dos listas obtenidas, es decir los
productos f(w)g(w) para w raı́z N -ésima de la unidad.
5. Se obtienen los coeficientes de fg a partir de los valores en sus raı́ces N -ésimas de la
unidad.

El coste total de todo el proceso, medido en número de multiplicaciones complejas,


es de O(N log2 N ), ya que en los pasos 3 y 5 hay que aplicar un total de tres veces el
algoritmo IF F T (u otro similar), con coste N2 log2 N , y en el paso 4 solamente hay que
hacer N multiplicaciones complejas.

23
4.12. Observaciones.
(1) La implementación del algoritmo de la multiplicación rápida de polinomios, o del
IF F T , en determinados lenguajes de programación suele comenzar con la reordenación
de la lista de los coeficientes de entrada. Para ello se suele usar el método llamado del
“bit inverso” (consultar [6] por ejemplo). Pero en Maple no es necesario hacer nada de
eso, pues el acceso a los elementos de una lista l se puede hacer con la instrucción l[i],
y no es más fácil acceder al primer elemento que a cualquier otro.
(2) Si los coeficientes de los polinomios f y g de entrada son reales (cosa bastante fre-
cuente), se puede aplicar el algoritmo IF F T simultáneamente a las listas de sus res-
pectivos coeficientes, de la siguiente forma: sean [x0 , x1 , . . . , xn−1 ], [y0 , y1 , . . . , yn−1 ]
con xj , yj ∈ IR, y sea zj = xj + iyj para j = 0, 1, . . . , n − 1. Supongamos que

[Z0 , Z1 , . . . , Zn−1 ] = IF F T (n, [z0 , z1 , . . . , zn−1 ]),


[X0 , X1 , . . . , Xn−1 ] = IF F T (n, [x0 , x1 , . . . , xn−1 ]),
[Y0 , Y1 , . . . , Yn−1 ] = IF F T (n, [y0 , y1 , . . . , yn−1 ]).

Entonces se verifica que

1  1  
Xk = Zk + Zn−k Yk = Zk − Zn−k
2 2i

para k = 0, 1, . . . , n − 1, siendo Zn = Z0 . De todos modos, ya hemos avisado de que


en Maple el cálculo de conjugados no siempre es trivial, por lo que este intento de
simplificación tal vez no sea ventajoso.

4.13. Caso general.


Supongamos que tenemos una lista cuya longitud no es una potencia de 2 (o una
función discretizada en una cantidad de puntos no potencia de 2), y que queremos obtener
la transformada discreta de Fourier, o la transformada inversa, de dicha lista. Si la técnica
del relleno es válida (como hemos visto que se puede hacer para el producto de polinomios),
se puede aplicar el algoritmo descrito en la sección anterior.
Pero en algunas ocasiones no es aceptable añadir ceros. Por ejemplo, si lo que queremos
es simplemente evaluar el polinomio en la raı́ces n-ésimas de la unidad, y n no es potencia
de 2, al añadir ceros hasta obtener N > n, con N potencia de 2, y aplicar el IF F T ,
conseguirı́amos la evaluación del polinomio (eso sı́ de manera rápida) en las raı́ces N -
ésimas de la unidad, pero como N = n, las raı́ces no son las mismas.
Vamos a ver entonces cómo se puede conseguir un algoritmo IF F T para una lista con
longitud arbitraria (o lo que es lo mismo, para evaluar un polinomio de grado arbitrario,
n − 1, en las raı́ces n-ésimas de la unidad).
Cuando n es potencia de 2, el procedimiento consiste en ir dividiendo la lista en dos
partes y aplicar el algoritmo a cada una de ellas. Pues aquı́, lo que podemos hacer es
descomponer el número n de elementos de la lista en producto de dos números, n = r1 · r2 ,
y descomponer la lista en r1 listas de r2 elementos (o al revés), y plantear un algoritmo
recursivo con la misma idea del anterior.

24
Evidentemente, si n es un número primo, el método no sirve pues no se puede descom-
poner. En tal caso, no quedará más remedio que hacer la evaluación directamente (o con
ayuda del esquema de Horner).
Sea pues f un polinomio de grado n − 1, con n = r1 · r2 . Entonces todo entero s,
0 ≤ s ≤ n − 1, se puede escribir de manera única de la forma s = tr1 + k con 0 ≤ t ≤ r2 − 1
y 0 ≤ k ≤ r1 − 1. Sea wn = e2πi/n . Las raı́ces n-ésimas complejas de la unidad serán
entonces wnj , para j = 0, 1, . . . , n − 1. La evaluación en ellas de f será:


n−1 1 −1 r
r 2 −1

f(wnj ) = as (wnj )s = atr1 +k wnjtr1 +jk


s=0 k=0 t=0
r −1 
1 −1
r 2

= atr1 +k wnjtr1 wnjk .


k=0 t=0

Ahora bien, wnjtr1 = e2πijtr1 /n = e2πijt/r2 , que es una raı́z r2 -ésima de la unidad, y que
podemos escribir wrjt2 . Tenemos ası́ que
r −1 
1 −1
r 2 1 −1
r
f(wnj ) = atr1 +k wrjt2 wnjk = ck (j)wnjk
k=0 t=0 k=0

r
2 −1
donde ck (j) = atr1 +k wrjt2 para 0 ≤ k ≤ r1 − 1 y 0 ≤ j ≤ n − 1, que es la evaluación
t=0
de un polinomio de grado r2 − 1 en las raı́ces r2 -ésimas de la unidad, por lo que se puede
calcular aplicando el mismo procedimiento de manera recursiva. Además, para cada k fijo,
se tiene que ck (j + r2 ) = ck (j). Luego basta calcular ck (j) para j = 0, 1, . . . , r2 − 1 y se
tendrá para todo j = 0, 1, . . . , n − 1.
Veamos ya cómo es el algoritmo de Cooley-Tukey para una lista con una cantidad
arbitraria de elementos:

4.14. Algoritmo IF F T (caso general).

entrada:
n → número entero
a → lista de n números complejos, a := [a[0], . . . , a[n − 1]]
si n es primo entonces
para j desde 0 hasta n − 1 hacer

n−1
A[j] := a[k]wnjk
k=0
en otro caso
descomponer n = r1 · r2 (# luego veremos cómo hacerlo)
para k desde 0 hasta r1 − 1 hacer
ck := IF F T (r2 , [ak , ar1 +k , . . . , a(r2 −1)r1 +k ])
para j desde 0 hasta n − 1 hacer

25
r
1 −1
A[j] := ck [j mod r2 ]wnkj
k=0
salida:
IF F T (n, a) := [A[0], A[1], . . . , A[n − 1]].

4.15. Complejidad.
Vamos a estudiar la complejidad del algoritmo general de Cooley-Tukey, y al igual que
lo hemos hecho antes, lo haremos contando el número de multiplicaciones complejas que
requiere para n datos de entrada.
Llamemos g(n) a dicho número. Si descomponemos n = r1 · r2 , para cada k fijo
calculamos los r2 valores de ck (j), y como aplicamos el mismo algoritmo para calcular
cada ck , y k toma r1 valores distintos, serán necesarias r1 g(r2 ) multiplicaciones. Una vez
obtenidos los ck (j), el cálculo de cada f(wnj ) requiere r1 − 1 productos más. Como hay
que calcular n = r1 r2 valores, serán r1 r2 (r1 − 1) productos. Es decir

g(n) = r1 g(r2 ) + r12 r2 − r1 r2 .

Como se observa, la complejidad depende de la factorización n = r1 r2 elegida, de modo


que se puede buscar la factorización que minimice el valor:

g(n) = min {r1 g(r2 ) + r12 r2 − r1 r2 }.


r1 r2 =n

Si p es primo, la única factorización es p = p · 1, y se obtiene g(n) = p(p − 1), que es lo


mismo que se obtiene por el método directo. En general, se factoriza y se usa la fórmula
recurrente hasta llegar a un primo.
Habitualmente, el estudio formal se realiza escribiendo g(n) = nh(n) donde
    
min h nd + d − 1 si n no es primo
h(n) = d
n−1 si n es primo

donde ahora el mı́nimo se toma sobre los divisores de n, distintos de n y de 1.

4.16. Ejemplo: Para n = 15 la función h vale

h(15) = min {h (15/d) + d} − 1 = min{h(5) + 3, h(3) + 5} − 1


d
= min{7, 7} − 1 = 6

Y por lo tanto g(n) = 15 · 6 = 90.

1 p1 · · · ps es la
En general se verifica (aunque no es fácil de probar) que si n = pα 1 α1 αs

descomposición en factores primos de n, entonces

h(n) = α1 (p1 − 1) + α2 (p2 − 1) + · · · + αs (ps − 1)

y el mı́nimo se alcanza tomando un divisor d primo.

26
4.17. Teorema. La mejor elección de la factorización n = r1 · r2 para que el algoritmo
IF F T tenga complejidad mı́nima es tomar r1 un divisor primo de n.
En tal caso, el número de multiplicaciones complejas es
 
g(n) = n α1 (p1 − 1) + α2 (p2 − 1) + · · · + αs (ps − 1) ,

1 p1 · · · ps la descomposición en factores primos de n.


siendo n = pα 1 α1 αs

En el caso particular de que sea n = 2r , entonces se tiene que h(n) = r(2 − 1) = r =


log2 n, de donde g(n) = n log2 n. (Observemos que en el algoritmo general no es posible
evitar la mitad de las multiplicaciones complejas del bucle final, por lo cual aplicando éste
nos ha salido un mayor número de operaciones que cuando aplicábamos el algoritmo en el
caso particular para potencias de 2.)
La siguiente tabla muestra la complejidad del algoritmo para los primeros valores de n,
junto con los valores de n2 , que era la complejidad de la transformada discreta sin utilizar
el algoritmo de la transformada rápida.

n g(n) n2
2 2 4
4 8 16
6 18 36
8 24 64
10 50 100
16 64 256
20 120 400
25 200 625
32 160 1 024
50 450 2 500
100 1 000 10 000
256 2 048 65 536
500 7 000 250 000
512 4 608 262 144
1 000 15 000 1 000 000
1 024 10 240 1 048 576
2 000 32 000 4 000 000
5 000 95 000 25 000 000
10 000 200 000 100 000 000
1 000 000 30 000 000 1 000 000 000 000

5. La transformada rápida de Fourier con aritmética modular


27
Hacer transformadas de Fourier con aritmética exacta puede dar lugar a expresiones
muy grandes, difı́cilmente manejables, y muy complicadas para ser simplificadas. En
Maple, por ejemplo, es normal tener problemas al aplicar el algoritmo de Cooley y Tukey
para multiplicar polinomios de grados del orden de 50 o superiores, especialmente a la
hora de simplificar el resultado final, cosa que es preciso hacer si queremos saber cuál es
en realidad el resultado.
Una posible solución es trabajar con aritmética aproximada, aunque tampoco es muy
razonable si queremos por ejemplo multiplicar polinomios con coeficientes enteros.
Otra solución, que puede ser más apropiada para el producto de polinomios con coe-
I de los números complejos por un cuerpo
ficientes enteros, es la de sustituir el cuerpo C
finito.
Supongamos por ejemplo que tenemos que multiplicar dos polinomios de segundo
grado:
P (x) = a0 + a1 x + a2 x2 , Q(x) = b0 + b1 x + b2 x2
(su producto será un polinomio de grado 4). Consideramos entonces las listas de sus
coeficientes [a0 , a1 , a2 , 0, 0] y [b0 , b1 , b2 , 0, 0]. Si estamos seguros de que todos los coeficientes
del producto van a estar entre 0 y 30, podemos trabajar en el cuerpo ZZ31 y dejar que 2
juegue el papel de raı́z quinta de la unidad.
Se obtienen entonces las evaluaciones de ambos polinomios en las potencias de 2:
2 = 1, 21 = 1, 22 = 4, 23 = 8 y 24 = 16, que son todos ellos raı́ces quintas de 1 en ZZ31 .
0

Sea Aj = P (2j ) y Bj = Q(2j ) para j = 0, 1 . . . 4.


4  4 

Aj = ak 2jk mod 31, Bj = bk 2jk mod 31.
k=0 k=0

Después se multiplican término a término los valores obtenidos y se aplica la transformada


discreta para obtener los coeficientes ck del producto
 
4

1
ck =  Aj Bj 2−jk  mod 31,
5
j=0

teniendo en cuenta que 2−k = 25−k .


En realidad, el ejemplo nos sirve para saber cómo funciona esta técnica, pero no es
muy significativo ya que con listas de 5 puntos, que es un número primo, no merece la
pena usar el algoritmo de Cooley-Tukey. Veamos cómo podemos hacerlo en general.

5.1. Definición.
Un elemento w de un cuerpo F se dice que es una raı́z n-ésima primitiva de la unidad si
wn = 1 y wk = 1 para todo k = 1, 2, . . . , n − 1.

Si n es una raı́z n-ésima primitiva de la unidad, entonces 1, w, w2 , . . . , wn−1 son n


raı́ces n-ésimas de la unidad distintas, y además, si n es par se verifica que w2 es una raı́z
n/2-ésima primitiva de la unidad y que wn/2 = −1, de donde se deduce que wn/2+j = −wj
para j = 0, 1, . . . , n/2 − 1.

28
Por lo tanto, en el algoritmo de la transformada rápida de Fourier se puede sustituir
la raı́z n-ésima compleja de la unidad e2πi/n por w.
Si además trabajamos en un cuerpo ZZp con p primo, tenemos la ventaja de que al ser
un cuerpo finito, la cantidad de elementos a utilizar es limitada, y por muy complicadas
que sean las operaciones a realizar siempre el resultado ha de ser uno de los elementos
del cuerpo. Por otra parte, Maple tiene capacidades más que suficientes para trabajar
con aritmética modular, por lo que no habrá que complicar apenas los algoritmos o los
procedimientos que hemos usado para trabajar en C I .
Si tenemos el cuerpo ZZp en el que hemos de trabajar y la raı́z n-esima primitiva de la
unidad, w, el algoritmo, para el caso de que n sea potencia de 2, serı́a

5.2. Algoritmo IF F T (con aritmética modular, para potencias de 2).

entrada:
n → número entero, potencia de 2.
a → lista de n números complejos, a := [a[0], . . . , a[n − 1]].
p → número entero (primo).
w → número entero (raı́z n-ésima primitiva de la unidad en ZZp ).
si n = 1, entonces A[0] := a[0]
en otro caso
listapares := [a[0], a[2], . . . , a[n − 2]]
listaimpares := [a[1], a[3], . . . , a[n − 1]]
u := IF F T (n/2, listapares, p, w2 )
v := IF F T (n/2, listaimpares, p, w2 )
para j desde 0 hasta n/2 − 1 hacer
A[j] := u[j] + wj · v[j] mod p
A[j + n/2] := u[j] − wj · v[j] mod p
salida:
IF F T (n, a, p, w) := [A[0], A[1], . . . , A[n − 1]].

Lo que sı́ puede significar un problema es el encontrar el cuerpo donde trabajar, y una
raı́z primitiva w de ese cuerpo. Nos puede servir de utilidad para ello el siguiente resultado,
que se puede encontrar en [8].

5.3. Teorema. El cuerpo finito ZZp tiene una raı́z n-ésima primitiva de 1 si y sólo si p − 1
es múltiplo de n.
Por ejemplo, 41 es un número primo, por lo que ZZ41 es un cuerpo y en ZZ41 existen
raı́ces octavas primitivas de la unidad, ya que 40 es múltiplo de 8. Para obtener un raı́z
primitiva de orden 8, podemos ayudarnos de Maple, pidiéndole, por ejemplo, que calcule
las potencias s8 (módulo 41) para 0 ≤ s ≤ 20. Para aqellos s que verifiquen la ecuación
s8 = 1, se pide la secuencia sj para j = 1..7, y nos quedamos con el primer s tal que en

29
dicha secuencia no aparezca el 1. En este caso se puede comprobar que 14 es una raı́z
octava primitiva de 1 en ZZ41 .
Veamos con un ejemplo concreto cómo se pueden multiplicar dos polinomios con ayuda
de la aritmética modular.

5.4. Ejemplo: Sean P (x) = 3x3 + x2 + 4x + 1 y Q(x) = x3 + 2x2 + 5. Puesto que


los grados de P y Q suman 6, podemos tomar n = 8 y trabajar con raı́ces octavas de la
unidad. Observemos que la suma de productos entre coeficientes de P y Q nunca pasa de
40, por lo que podemos considerar P y Q polinomios sobre ZZ41 , y el producto será también
un polinomio en ZZ41 . No hay por tanto ningún problema con trabajar en ZZ41 . Además
ya hemos comprobado que 14 es un raı́z primitiva de orden 8 en ZZ41 . Tomemos pues las
listas
a := [1, 4, 1, 3, 0, 0, 0, 0] b := [5, 0, 2, 1, 0, 0, 0, 0].

Evaluamos los polinomios en las raı́ces de la unidad {1, 14, 142 , . . . , 147 } (en ZZ41 ),
obteniéndose respectivamente

A := [9, 39, 32, 40, 36, 27, 9, 21] B := [8, 25, 12, 37, 6, 31, 35, 9].

Multiplicando las listas A y B término a término, en ZZ41 , resulta

AB := [31, 32, 15, 14, 11, 17, 28, 25].

Finalmente hacemos la transformada discreta de Fourier de la lista AB y se obtiene


[5, 20, 7, 24, 6, 7, 3, 0], lo que significa que el producto de los polinomios dados es

P (x)Q(x) = 3x6 + 7x5 + 6x4 + 24x3 + 7x2 + 20x + 5.

5.5. Observaciones.
(1) Si los coeficientes de los polinomios dados son enteros pero no todos positivos, también
se puede hacer su producto utilizando el algoritmo de la transformada rápida de Fourier
con aritmética modular. Basta tomar un primo p suficientemente grande que nos
permita asegurar que los elementos mayores que (p − 1)/2 corresponden a coeficientes
negativos, por lo que habrı́a que restarles p en la solución final.
(2) Para aplicar el algoritmo de la transformada rápida de Fourier con aritmética modular
no es estrictamente necesario que p sea primo, y por lo tanto ZZp un cuerpo. Se puede
trabajar con un anillo ZZm con unas ciertas condiciones (en [2] se pueden encontrar
esas codiciones, ası́ como una forma de encontrar un m que las cumpla y una raı́z de
la unidad adecuada en ZZm ).

5.6. Multiplicación de números grandes.


Para finalizar, hagamos un comentario sobre otra de las aplicaciones de la transformada
rápida de Fourier, que está además bastante relacionada con la multiplicación rápida de
polinomios. Se trata de la aritmética de multiprecisión, y en particular de la multiplicación
de números enteros grandes.

30
La idea del método en cuestión consiste en representar un número entero dado (en
una cierta base b) por medio de un polinomio p de manera que p(b) sea precisamente el
número dado. De esta forma, para multiplicar dos números se multiplican los polinomios
correspondientes (con ayuda de la transformada rápida de Fourier) y después se obtiene
el valor del polinomio producto en b. Ése será exactamente el producto de los números
dados.
Para conocer más detalles sobre este método se puede consultar [2].

31
BIBLIOGRAFÍA

[1] Apostol, T.: Análisis Matemático (segunda edición). Reverté, 1989.


[2] Brassard, G.; Bratley, P.: Algorithms. Theory and Practice. Prentice-Hall, 1988.
[3] Brigham, E.O.: The Fast Fourier Transform and its applications. Prentice-Hall,
1988.
[4] Cartwright, M.: Fourier Methods for mathematicians, scientists and engineers. El-
lis Horwood, 1990.
[5] Cooley, J.W.; Tukey J.W.: “An Algorithm for the Machine Calculation of Complex
Fourier Series”, Math. Comp., 19 (1965), pp. 297-301.
[6] Cormen, T.H.; Leiserson, C.E.; Rivest, R.L.: Introduction to Algorithms. The
MIT Press, 1990.
[7] Gasquet, C.; Witomski, P.: Fourier Analysis and Applications. Filtering, Numer-
ical Computation, Wavelets. Springer Verlag, 1999.
[8] Geddes, K.O.; Czapor, S.R.; Labahn, G.: Algorithms for Computer Algebra.
Kluwer Academic Publishers, 1992.
[9] Guzmán, M.: Impactos del análisis armónico. Discurso de ingreso en la Real Academia
de Ciencias Exactas, Fı́sicas y Naturales. Madrid, 1983.
[10] Jerri, A.J.: Integral and Discrete Transforms with applications and error analysis.
Marcel Dekker, 1992.
[11] Knuth, D.E.: The Art of Computer Programming. Vol 2: Seminumerical Algorithms
(third edition). Addison-Wesley, 1998.
[12] Kronsj, L.: Algorithms. Their complexity and efficiency (second edition). John Wiley
and Sons, 1987.
[13] Oppenheim, A.V.; Willsky, A.S.: Sistemas y señales. Prentice-Hall, 1994.
[14] Priemer, S.: Introductory Signal Analysis. World Scientific, 1991.
[15] Smith, W.W.; Smith, J.M.: Handbook of Real-Time Fast Fourier Transforms. Al-
gorithms to Product Testing. IEEE Press, 1995.
[16] Soliman, S.S.; Srinath, M.D.: Señales y sistemas continuos y discretos (segunda
edición). Prentice-Hall, 1999.
[17] Stearns, S.D.; Hush, D.R.: Digital Signal Analysis. Prentice-Hall, 1990.
[18] Strang, G.: Linear Algebra and its applications. Harcourt Brace Jovanovich, 1988.
[19] Wilf, H.S.: Algorithms and Complexity. Prentice-Hall, 1986.
[20] Zippel, R.: Effective Polynomial Computation. Kluwer Academic Publishers, 1993.
[21] Zygmund, A.: Trigonometric Series. Second Edition (Vol. I & II Combined). Cam-
bridge University Press, 1990.

32

Das könnte Ihnen auch gefallen