Está en la página 1de 27

1

Transformada rpida de Fourier.

Es considerado un algoritmo clsico, que permite obtener a partir de una serie de valores
temporales las componentes espectrales en frecuencia, y viceversa con un costo O(n log n).

Como veremos es un caso particular del problema ms general de calcular polinomios.

Existen dos formas de clculo: una es evaluar un polinomio representado por sus coeficientes. La
otra es representar el polinomio por una serie de puntos.

24.1. Representacin por n coeficientes.

Sea un polinomio de n coeficientes:


n 1
A(x) aj x j
j 0

Donde los coeficientes son los n valores de aj.

Si se evalan las potencias de x a travs de multiplicaciones se requieren (n-1) + (n-2) +..+1


multiplicaciones, originando un algoritmo de complejidad O(n2).

La evaluacin de polinomios suele efectuarse empleando la regla de Horner:

A(xi ) a0 xi (a1 xi (a2 .... xi (an 2 xi (an 1 ))....))

Que es de complejidad O(n), ya que requiere (n-1) multiplicaciones. La siguiente rutina ilustra el
procedimiento de clculo.

double Horner(int a[ ], int n, double x)


{ double A=a[n-1];
for( i=n-2; i>=0; i--) A=a[i] +x*A;
return(A);
}

Las operaciones de suma y resta de polinomios expresados por sus coeficientes son de
complejidad O(n), ya que basta sumar o restar los coeficientes.
Sin embargo el producto de polinomios es de complejidad O(n2).

Si A y B son de n coeficientes, el producto C(x) = A(x)B(x) tendr (2n-1) coeficientes:


2

2n 2
C(x) cjx j
j 0

c0 = a0b0
c1 = a0b1 + a1b0
c2 = a0b2 + a1b1 + a2b0

j
cj akbj k
k 0
Operacin que se denomina convolucin de los coeficientes.

La evaluacin de los coeficientes de C es O(n), y debe repetirse n veces, lo cual implica O(n2),
para el costo de la multiplicacin de polinomios.

24.2. Representacin por n valores.

Se tienen los valores o muestras: yk A(xk ) con k = 0..n-1


y1
yn-1
y0
y2

x
x0 x1 x2 xn-1

Figura 24.1 Representacin por muestras.

Si se conocen los puntos: (xk, yk ), se tienen n ecuaciones con n incgnitas (los coeficientes).

y0 a0 x00 a1 x01 a2x02 .... an 1 x0n 1


y1 a0x10 a1 x11 a2x12 .... an 1 x1n 1
.....
yn 1 a0 xn0 1 a1 x1n 1 a2x2n 1 .... an 1 xnn 11

Pueden existir diferentes representaciones por puntos, ya que slo se requiere que los n puntos xk
sean diferentes. Como se ver la eleccin adecuada de los n puntos permitir acelerar el clculo a
O(n log n).

Esta representacin puede obtenerse a partir de la representacin por coeficientes con un costo
O(n2), ya que debe aplicarse n veces el algoritmo de Horner.
3
Tambin es posible pasar de la representacin por puntos a la de coeficientes, para esto es
preciso resolver el sistema de ecuaciones planteado antes. Este problema se conoce como
interpolacin.

1 x0 x02 ... x0n 1 a0 y0


2 n 1
1 x1 x ...
1
x1
a1 y1

1 xn 1 xn2 1... xnn 11 an 1 yn 1

La matriz tiene inversa si el determinante no es cero. El determinante de la matriz anterior, que


se denomina de Vandermonde, puede calcularse segn:

det (xk x j ) (x1 x0 )(x2 x1)...(xn 1 xn 2 )


0 j k n1

El costo de evaluar la matriz inversa es O(n2) y adems se debe realizar n multiplicaciones del
vector de los yk por los renglones de la matriz inversa, con lo cual resulta O(n3).

Sin embargo los coeficientes pueden calcularse con costo O(n2) empleando la frmula de
interpolacin de polinomios de Lagrange:

(x x1)(x x2)...(x xn 1) (x x0)(x x2)...(x xn 1 ) (x x0)(x x1)...(x xn 2 )


A(x) y0 y1 .... yn 1
(x0 x1)(x0 x2)...(x0 xn 1) (x1 x0)(x1 x2)...(x1 xn 1 ) (xn 1 x0)(xn 1 x1)...(xn 1 xn 2 )

Que es un polinomio de n coeficientes que pasa por los n puntos (xk, yk).
O bien tal que A(xk) = yk para k=0..n-1, lo cual puede comprobarse en la frmula anterior.

La ventaja de representacin por puntos es que el clculo del producto (tambin la suma y resta)
de polinomios es ahora O(n). Pero en caso de multiplicacin, los polinomios deben representarse
con 2n puntos, ya que C, debe ser de 2n puntos.

Si se tienen los polinomios A y B, puede determinarse su producto C, segn:


A(x) (x0 , yA0 ),...(xn 1, yAn 1 ),...(x2n 1, yA2n 1 )
B(x) (x0 , yB0 ),...(xn 1, yBn 1 ),...(x2n 1, yB 2n 1 )
C(x) (x0 , yA0 yB0 ),...(xn 1, yAn 1 yBn 1 ),...(x2n 1, yA2n 1 yB 2n 1 )

24.3. Transformada discreta de Fourier.

Se tienen las transformadas de Fourier, directa e inversa, en el dominio de f y t, para la seal s(t)
y su densidad espectral S(f), definidas segn:
4

j 2 ft
(s(t)) S( f ) s(t)e dt

1
(S( f )) s(t) S( f )e j 2 ftdf

Y las transformadas discretas de Fourier:


n 1
S(k) s(i)e j 2 ik / n
i 0

1n1
s(k) S (i)ej2 ik / n

ni 0
Con k=0..n-1

Si se define: wn=e-j2 /n
como la n-ava raz compleja de la unidad, se tiene que:

e-j2 k/n
= (wn)k

El valor principal suele definirse segn: ej2 /n, en el primer cuadrante.

Reemplazando S(k) por Sk, s(k) por sk, y (wn)k por x se tienen dos polinomios.

n 1
1 x0 x02... x0n 1 s0 S0
Sk si xi
i 0 1 x1 x12 ... x1n 1 s1 S1
1n 1
i
sk S ix
ni 0
1 xn 1 xn2 1... xnn 11 sn 1 Sn 1

Los polinomios se evalan en las races complejas de la unidad. Si se reemplazan las potencias
de x se obtiene la relacin que permite obtener el espectro a partir de las muestras temporales:

1 wn0*1 wn0*2 ... wn0*(n 1)


s0 S0
1*1 1*2 1*(n 1)
1 w n w ...
n
w n
s1 S1

1 wn(n 1)*1
wn(n 1)*2 ... wn(n 1)*(n 1)
sn 1 Sn 1

Las figuras siguientes muestran los polinomios representados por puntos.


5

s1 S1
sn-1 Sn-1
s0 S0
s2 S2

t f
t0 t1 t2 tn-1 f0 f1 f2 fn-1

T=intervalo de muestreo fS=1/n T=separacin en frecuencia


Figura 24.2 Representacin de polinomios por puntos.

El elemento (r, c) de la matriz anterior es (wn)r*c con r y c variando entre 0 y (n-1).


Puede comprobarse que el elemento (r, c) de la matriz inversa es: (1/n)*(wn)-r*c

1 wn0*1 wn0*2 ... wn0*(n 1)


S0 s0
1 1 wn1*1 wn1*2 ... wn1*( n 1) S1 s1
n
1 wn (n 1)*1 wn(n 1)*2
... wn(n 1)*(n 1)
Sn 1 sn 1
Que permite obtener las muestras temporales a partir del espectro. Notamos que el problema es
similar al anterior, pero cambiando el signo de las n-avas potencias complejas de la unidad, y un
escalamiento dividiendo por n.

Conocidas las muestras temporales, se requieren n multiplicaciones para obtener una muestra del
espectro, y como se requieren n muestras en frecuencia, se obtiene un algoritmo de costo
cuadrtico. Adems deben calcularse las potencias complejas de las n-avas races de la unidad.

24.4. Desarrollo del algoritmo de transformada rpida de Fourier.

El algoritmo FFT permite calcular la DFT en O( n log n).


El polinomio S(x) puede separarse en dos, uno con las potencias pares de x; el otro, con las
potencias impares:
n 1
Sk S(x) si x i
i 0

S p (x) s0 s2 x ... sn 2 x(n / 2) 1


Si (x) s1 s3x ... sn 1 x(n / 2) 1
2 2
Sk S(x) S p (x ) xSi (x )
6
Los polinomios son de n/2 puntos cada uno. Esto considerando n par y ms especficamente una
potencia de dos.
El clculo de los Sk para n puntos puede descomponerse en dos clculos de polinomios pero con
la mitad de puntos cada uno. A su vez, cada uno de esos polinomios, puede ser calculado en
trminos de dos polinomios con la cuarta parte de los puntos, y as sucesivamente.

Ms adelante veremos cmo los Sk pueden calcularse recursivamente, para obtener esa relacin
es preciso conocer algunas propiedades de las races complejas de la unidad.

24.5. n-avas races complejas de la unidad.


Existen n races n-avas complejas de la unidad: w n0, w 1n, w 2n, w n-1
n
Con : (wn)k = e-j2 k/n

Para n = 2, se tienen
w20=e-j 0 = cos(0) + j sen(0) = +1
w 1=e-j 1 = cos(- ) + j sen(- ) = -1
2

w 21 w 20

Figura 24.3. Races complejas cuadradas de la unidad

Para n = 4, se tienen:
(w4) = e-j /2 = -j
w40 = +1 w43
1
w4 = -j w40
2
w4 = -1
w42
w43= +j
Debe notarse que w4 4 = w4 0
w41

Figura 24.4. Races complejas cuartas de la unidad

Algunas propiedades:

Para n>=0, k>=0 y d>0:


7
dk j 2 / dn dk j2 /n k
wdn (e ) (e ) wnk
wnn / 2 (e j 2 / n n /2
) e j
w2 1
(wnk n/2 2
) wn2k n
wn2k wnn (wnk )2
w2n e j2 / 2n
(e j 2 / n 1/ 2
) wn
n 1 (wnk ) n 1 (wnn) k 1 (1) k 1
(wnk )i 0
i 0 wnk 1 wnk 1 wnk 1
La ltima relacin es una serie geomtrica, se requiere n>=1, y que k sea positivo no divisible
por n, para que el denominador no sea cero.

Si se efecta el producto de la matriz de Vandermonde por su inversa, el elemento (r, c) del


producto, puede expresarse segn:
n 1 n 1
(wn kr / n)wnkc (wn k (c r ) / n) la cual toma valor 1 para r=c, y cero en caso contrario. Lo
k 0 k 0

cual origina una matriz unitaria, comprobndose que la expresin para la inversa es correcta. Se
requiere que (c-r) no sea divisible por n, esto se cumple ya que fuera de la diagonal:

-(n-1) < (r-c) < (n-1).

24.6. Series discretas para dos y cuatro puntos.

Se tiene para n = 2:
S0 = s0 + x0s1
S1 = s0 + x1s1

Evaluando en las races cuadradas complejas de la unidad:


0
S0 = s0 + w2 s1 = s0 + (+1)s1
S1 = s0 + w2 1s1 = s0 + (- 1)s1

Resultando:
S0 = s0 + s1
S1 = s0 - s1

Para n = 4:
Evaluando en las races cuartas complejas de la unidad, notando que todos los valores no son
diferentes, debido a las propiedades de las races cuartas complejas de la unidad, se obtienen:
S w0 s w0 s w0 s w0 s
0 4 0 4 1 4 2 4 3
0 1 2
S ws ws ws w3s
1 4 0 4 1 4 2 4 3
0 2 4
S2 ws 4 0 ws 4 1 ws4 2 w46 s3
S3 w40 s0 w43 s1 w46 s2 w49 s3
8
Reemplazando por los valores numricos:
S0 s0 s1 s2 s3
S1 s0 js1 s2 js3 S2 s0
s1 1s2 s3
S3 s0 js1 s2 js3

Finalmente, se advierte que para cuatro puntos, estn incorporados los polinomios asociados a
dos puntos. Donde se ha definido: (S0p, S1p) y (S0i, S1i) como series de dos puntos.

S0 (s0 s2 ) (s1 s3 ) S0 p w40 S0i


S2 (s0 s2 ) (s1 s3 ) S0 p w40 S0i
S1 (s0 s2 ) j(s1 s3 ) S1 p w41 S1i
S3 (s0 s2 ) j(s1 s3) S1 p w14 S1i

24.7. Relaciones de recurrencia.

De la descomposicin en dos polinomios y reemplazando los valores de evaluacin con las n-


avas races complejas de la unidad, se desprenden dos relaciones de recurrencia para calcular los
Sk .
Una para los valores: S0, S1 , S2,. , Sn/2 -1, y otra para: Sn/2, Sn/2 +1 , Sn/2 +2,. , Sn-1

S S (x2 ) xS (x 2 )
k p i

S S (w2k ) wk S (w2k )
k p n n i n
k n/2
Sk n/2 S p (w 2k n
n ) wn
Si (wn2k n )

Empleando las propiedades de las races complejas, se obtienen:

S S (w2k ) wk S (w2k ) S (wk ) wk S (wk ) S wk S


k p n n i n p n/2 n i n/2 kp n ki
2k k 2k
Sk S p (wn2k n ) w k n/2
Si (w 2k n
) S (w ) w S (w ) S (wk ) wk S (wk ) S kp wnk Ski
n/2 n n p n n i n p n/2 n i n/2

Donde se han definido los valores de la parte par e impar como una evaluacin de un polinomio
de n/2 puntos.
Skp S p (wnk / 2 )
Ski Si (wnk / 2 )
Finalmente se obtienen:
9

Sk S kp wnk Ski Con k=0, 1, 2, (n/2)- 1

Sk n /2 S kp wnk Ski

Asumiendo operaciones con nmeros complejos, los n valores se calculan de a pares, en


trminos de los valores asociados a dos series de n/2 puntos cada una:

for (k=0; k<= (n/2)-1; k++)


{ Sk = Skp + wnk Ski ;
Sk+n/2 = Skp - wn k S ki ;
}
Es usual calcular una sola vez, la expresin comn dentro del for.

for (k=0; k<= (n/2)-1; k++)


{ t = w nk S ki ;
Sk = Skp + t ;
Sk+n/2 = Skp - t ;
}

El costo de calcular una potencia puede extraerse, a travs de una multiplicacin dentro del lazo:
wn = e-j2 /n ;
w = 1;
for (k=0; k<= (n/2)-1; k++)
{ t = w*Ski ;
Sk = Skp + t ; //Operacin denominada mariposa. Butterfly.
Sk+n/2 = Skp - t ;
w * = wn ;
}

La codificacin puede modificarse para tratar las variables complejas, por sus partes reales e
imaginarias.

Para un polinomio descrito por 8 puntos temporales. El clculo puede visualizarse mediante la
descomposicin en dos polinomios de 4 puntos, con los puntos pares en uno, y los impares en
otro. Un polinomio de 4 puntos, se puede calcular mediante la composicin de dos polinomios
de dos puntos, donde nuevamente se separan los ubicados en posiciones pares e impares. No es
necesario descomponer polinomios de dos puntos, ya que su evaluacin es sencilla. El siguiente
rbol ilustra la separacin entre partes pares e impares.
10

s0 s1 s2 s3 s4 s5 s6 s7

s0 s2 s4 s6 s1 s3 s5 s7

s0 s4 s2 s6 s1 s5 s3 s7

Figura 24.5. Descomposicin en polinomios pares e impares.

Si cada vez se suprime el bit menos significativo que representa al ndice en binario, se tendr
que la divisin se efecta entre pares e impares. Por ejemplo el grupo (0, 2, 4, 6) se transforma al
suprimir el bit menos significativo en (0, 1, 2, 3).

Esta visualizacin tambin posibilita un algoritmo iterativo en lugar de recursivo. En el nivel de


las hojas se aplica la operacin mariposa a todos los grupos de a dos (pero en el orden que
figuran en las hojas), luego se evalan polinomios de 4 puntos cada uno, considerando ahora las
races cuartas complejas de la unidad, y as sucesivamente ascendiendo de nivel.

24.8. Reordenamiento de los puntos.

Si se observa la siguiente tabla, donde se han colocado los valores de las muestras temporales en
un arreglo, junto a sus ndices en binario y el arreglo modificado. Puede notarse que los ndices
en binario del arreglo modificado son las imgenes especulares de los ndices originales. Puede
tambin notarse que la ltima columna se puede visualizar como un contador binario inverso, es
decir los dgitos que primero cambian son los ms significativos. En este caso slo es preciso
intercambiar s1 con s4, y s3 con s6.

Arreglo original Contador binario Arreglo modificado Contador inverso


s0 000 s0 000
s1 001 s4 100
s2 010 s2 010
s3 011 s6 110
s4 100 s1 001
s5 101 s5 101
s6 110 s3 011
s7 111 s7 111

Figura 24.6. Contador binario directo e inverso.

Para 16 puntos, colocando los valores de los contadores binarios directo e inverso, en decimal,
puede notarse que bastara generar las dos secuencias de valores siguientes:
11

i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
j 0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15
ig x ig x ig x x x x ig

Figura 24.7. Contador binario inverso con cuentas en decimal.

Y slo intercambiar cuando j> i. Esto evita los cambios en los casos identificados en el tercer
rengln con ig (por igualdad), y los cambios marcados con x (esto volvera a su lugar a los
elementos del arreglo). Adems no es preciso revisar los casos con i= 0 e i=15.
Si el nmero de muestras es una potencia de dos, se tiene que el primer valor de j, de la
secuencia que debe generarse, ser: j=n/2 o la expresin equivalente: j=n>>1.

La siguiente funcin intercambia los elementos de un arreglo x, generando las secuencias de


valores de i y j.

void bitreverse(int *x, int n)


{ int nmedios=n>>1, i, j, k, tx;
//i contador binario
for (i=1, j=nmedios; i<n-2; i++)
{
//printf("i=%d j=%d\n", i , j);
if (i < j) {
tx = x[i];
x[i] = x[j];
x[j] = tx;
}
//j contador binario inverso. Incrementa en uno la posicin ms significativa.
//y desplaza a la derecha las reservas.
for(k=nmedios; k <= j; k >>= 1) {j -= k;}
j+=k;
}
}

Ejemplos del contador binario inverso, con operaciones en decimal:


Si k y j tienen valor 8 ( 1000 en binario) se efecta la resta (queda j=0) y la condicin de reinicio
deja k=4 (0100), lo cual termina la iteracin. Despus del for se setea en uno el bit que marca k,
y deja j=4 (0100).

Se cambian todos los unos ms significativos por ceros, hasta encontrar el primer cero, el cual
se setea a uno.

Si k=8 y j = 12 ( 1100 en binario) se efecta la resta (queda j=4) y la condicin de reinicio deja
k=4 (0100), se vuelve a iterar, quedando j=0 y k=2. Lo cual termina la iteracin. Despus del for
se setea en uno el bit que marca k, y deja j=4 (0010).
12
El siguiente ejemplo, busca el primer cero y lo cambia por uno, poniendo en cero el ms
significativo.
Si k=8 y j=10 (1010), la primera iteracin deja j=2 (0010) y k = 4 (0100), terminando la
iteracin. El nuevo valor de j ser 6 (0110)

Otra alternativa de diseo es generando la imagen especular de i para formar j.

Se detectan los unos de i, y se los copia, mediante la variable m, en la posicin especular en j.

void contadorinverso(int *x, int n)


{ int nmedios=n>>1, i, j, m ,k ,tx;

for (i=1,j=nmedios; i<n-2; ) //el penltimo es par


{
printf("i=%d j=%d\n",i,j);
if (i < j) {
tx = x[i];
x[i] = x[j];
x[j] = tx;
}
for(i++, k=nmedios, m=1, j=0; k >=1; k >>= 1, m<<=1)
{
if(i&k) j|=m;
}
}
}

24.9. Operacin mariposa.

Para deducir el algoritmo iterativo, veremos algunos casos especficos.


Para una serie de dos puntos, se muestra la serie inicial de puntos temporales en un arreglo.
Luego de aplicar la operacin mariposa, y finalmente la reinterpretacin de los puntos en
frecuencia.

n=2
for (k=0; k<= (n/2)-1; k++) s0 s1
{ Sk = Skp + wnk Ski ;
Sk+n/2 = Skp - wn k S ki ;
} s0+s1 s0-s1
0
S0 = S0p + w2 S0i ;
0
S1 = S0p - w2 S0i ; S0 S1
0
Con w2 = 1

La composicin de la serie de 4 puntos a partir de las series de dos puntos, se obtiene con:
13

n=4
for (k=0; k<= (n/2)-1; k++)
{ Sk = Skp + wnk Ski ;
Sk+n/2 = Skp - wn k S ki ;
}

S0 S0 p w40 S0i (s0 s2 ) (s1 s3)


S2 S0 p w40 S0i (s0 s2) (s1 s3)
S1 S1 p w41 S1i (s0 s2) j(s1 s3)
S3 S1 p w14 S1i (s0 s2 ) j(s1 s3)
0 1 1 1/2
Con: w4 = 1, w4 = - j = (w2 ) w4 = w2

Para una serie de cuatro puntos temporales, se procede al reordenamiento. A stos se los trata
como series de dos puntos. Se aplica la operacin mariposa, con n=2, a todos los pares:
s0 s2 s1 s3
Luego de la operacin en los pares:
(0,1)(2,3) s0+s2 s0 -s2 s1 +s3 s1 -s3

Quedan las series en frecuencia de dos puntos


S0p S1p S0i S1i

Se aplica ahora la operacin mariposa con n=4. A los pares (0,2) y (1,3).
Lo cual genera los cuatro puntos en frecuencia.

S0p+S0i S0p-S0i S1p-jS1i S1p+jS1i

Que puede leerse segn: S0 S1 S2 S3

La composicin de la serie de 8 puntos a partir de las series de cuatro puntos, se obtiene con:
n=8
for (k=0; k<= (n/2)-1; k++)
{ Sk = Skp + wnk Ski ;
Sk+n/2 = Skp - wn k S ki ;
}

Es decir:
14

S0 S0 p w80 S0i
S4 S0 p w80 S0i
S1 S1 p w81S1i
S5 S1 p w81S1i
S2 S2 p w82 S2i
S6 S2 p w82 S2i
S3 S3 p w83 S3i
S7 S3 p w83 S3i
Con: w80 =1, w81 = e-j /4 = 1 (1 j) w8 = w4
2

En el nivel 0: Se forman series de dos puntos, aplicando la operacin mariposa con n=2, a los
pares: (0, 1), (0+2*1, 1+2*1), (0+2*2, 1+2*2), (0+2*3, 1+2*3)

En el nivel uno: Se forman series de 4 puntos. La composicin de dos series de 2 puntos se logra
aplicando la operacin con n=4, a los pares (0,2) (1,3) y tambin a los pares (0+4, 2+4) (1+4,
3+4) logrando dos series de cuatro puntos.

En el nivel dos: La composicin de dos series de 4 puntos se logra aplicando la operacin con
n=8. A los pares (0,4) (1,5) (2,6) (3, 7)

Dos series de 4 puntos S0p S1p S2p S3p S0i S1i S2i S3i

Serie de 8 puntos S0 S1 S2 S3 S4 S5 S6 S7

Veamos ahora el caso general:


Si n es el nmero de puntos.
En el nivel 0, se tienen n/2 series de 2 puntos.
En el nivel 1, se tienen n/4 series de 4 puntos.
En el nivel 2, se tienen n/8 series de 8 puntos.
En el nivel j, se tienen n/2j+1 series de 2j+1 puntos.
En ltimo nivel, el m-1, la nica serie es de n= 2m puntos.

El algoritmo iterativo debe generar las series asociadas al nivel, y los pares de puntos de cada
serie y luego aplicarles la operacin mariposa a cada par.

Es decir, a travs de la variable j, se repite para cada grupo formado por nn puntos:
15
for(j=0; j<n; j+=nn)
for (k=0; k<= (nn/2)-1; k++)
{ Sk+j = Skp + wnk Ski ;
Sk+j+n/2 = Skp - wnk S ki ;
}

Falta an una ltima iteracin para procesar cada uno de los niveles.
El siguiente segmento genera los pares a los que debe aplicrseles la operacin.

void mariposa(int m)
{ int n, k, j, nn, nivel;
n = 1;
for (k=0; k<m; k++) n *= 2; //n=2^m genera nmero de puntos

nn=1;
for (nivel=0; nivel<m; nivel++)
{ nn=2*nn; //series de nn puntos. Con nn=2^(nivel+1)
for(j=0; j<n; j=j+nn) //Para todos los n elementos en grupos de nn
{
for (k=0; k< nn/2; k++)//Se aplica mariposa a los pares (k+j, k+j+nn/2)
{ printf("(%d,%d)", k+j, k+j+nn/2); }
putchar('\n');
}
}
}

Para m= 4, se tienen 16 puntos, el programa genera los pares:


(0,1) 8 series de dos puntos
(2,3)
(4,5)
(6,7)
(8,9)
(10,11)
(12,13)
(14,15)
(0,2)(1,3) 4 series de 4 puntos
(4,6)(5,7)
(8,10)(9,11)
(12,14)(13,15)
(0,4)(1,5)(2,6)(3,7) 2 series de 8 puntos
(8,12)(9,13)(10,14)(11,15)
(0,8)(1,9)(2,10)(3,11)(4,12)(5,13)(6,14)(7,15) 1 serie de 16 puntos

La siguiente funcin resume las principales ideas. Slo falta definir el tratamiento de los
nmeros complejos y de los arreglos.
16
void mariposa(double *S, int m)
{ int n, k, j, nn, nivel;
double w, wn, u, t;

for (k=0, n=1; k<m; k++) n *= 2; //n=2^m genera n, el nmero de puntos a partir de m
nn=1;
wn = w2 ; //Al inicio las series son de dos puntos
for (nivel=0; nivel<m; nivel++)
{ nn=2*nn; //series de nn puntos. Con nn=2^(nivel+1)
for(j=0; j<n; j=j+nn) //Para todos los n elementos en grupos de nn
{
w = 1;
for (k=0; k< nn/2; k++) //Se aplica mariposa a los pares (k+j, k+j+nn/2)
{
t = w*Sk+j+nn/2 ; //Con los valores de series de nn/2 puntos
u = Sk+j;
Sk+j = u + t ; //Se calculan con la operacin mariposa, los
Sk+j+nn/2 = u - t ; //valores de las series de nn puntos.
w * = wn ;
}
}
wn = wn ; //Se duplica el nmero de puntos.
}
}

Al inicio, en el nivel cero, las series son de dos puntos; al subir de nivel debe calcularse la nueva
raz compleja. Se ilustra, en el primer cuadrante la nueva raz, que tiene la mitad del ngulo.

wn

n
w2n

n /2

Figura 24.8. Clculo de la raz cuadrada.

Para calcular la raz compleja principal asociada a una serie de 2n puntos a partir de la raz
compleja principal asociada a una serie de n puntos, pueden efectuarse las siguientes
definiciones:
17

wn xn jyn
w2n x2n jy2n

Del diagrama, aplicando la identidad trigonomtrica para la tangente del ngulo medio, se
obtiene una relacin entre las coordenadas cartesianas de las races; la segunda relacin se
cumple debido a que el mdulo de las races es de magnitud unitaria.
sen
tg( / 2)
1 cos
y2n yn
x2n 1 xn
2 2
x2n y2n 1

Despejando, del sistema de ecuaciones, se obtienen las coordenadas cartesianas de w2n en


funcin de las coordenadas de wn.
1 xn
y2n
2
1 xn
x2n
2

El cdigo completo de la funcin, con: s[i]=x[i] + jy[i], wn=wn1 +jwn2, w=w1 +jw2, adems se
definen una serie de variables locales, para intercambios y para extraer constantes dentro de los
lazos. Se eliminan los llamados a funcin, para disminuir el costo de la creacin de frames
en el stack. Se agrega el argumento dir, para obtener la transformada directa e inversa con la
misma funcin.

void FFT(short int dir, long m, double *x, double *y )


{ int n, nn, nmedios, nivel, i,j,k,i1;
double w1,w2, wn1,wn2,tx,ty,tw,t1,t2;

for (k=0,n=1; k<m; k++) n *= 2; //n=2^m genera nmero de puntos a partir de m

//void bitreverse(int *x, int n)


nmedios=n>>1;
for (i=1, j=nmedios; i<n-2; i++)
{
//printf("i=%d j=%d\n",i,j);
if (i < j) {
tx = x[i]; ty = y[i];
x[i] = x[j]; y[i] = y[j];
x[j] = tx; y[j] = ty;
}
18
//j contador binario. Incrementa en uno la posicin ms significativa.
//y desplaza a la derecha las reservas.
for(k=nmedios; k <= j; k >>= 1) {j -= k;}
j+=k;
}
/* Calcula FFT */

nn=1;
//wn = w2 = -1+j0; En el primer nivel son series de dos puntos
wn1 = -1.0;
wn2 = 0.0;

for (nivel=0; nivel<m; nivel++)


{ nn=2*nn; //series de nn puntos. Con nn=2^(nivel+1)
for(j=0; j<n; j=j+nn) //Para todos los n elementos en grupos de nn
{
//w = 1+j0;
w1 = 1.0; w2 = 0.0;
for (k=0; k< nn/2; k++) //Se aplica mariposa a los pares (k+j, k+j+nn/2)
{
i=k+j;
i1=i+nn/2;
//t = w*S[k+j+nn/2];
t1 = w1 * x[i1] - w2 * y[i1];
t2 = w1 * y[i1] + w2 * x[i1];
//u = S[k+j];
//S[k+j+nn/2] = u - t;
x[i1] = x[i] - t1;
y[i1] = y[i] - t2;
//S[k+j] = u + t ; //Operacin mariposa.
x[i] += t1;
y[i] += t2;
//w * = wn ;
tw = w1 * wn1 - w2 * wn2;
w2 = w1 * wn2 + w2 * wn1;
w1 = tw;
}
}
//wn = sqrt(wn) ; Al subir de nivel se requiere la raz cuadrada de la anterior.
wn2 = sqrt((1.0 - wn1) / 2.0);
if (dir == 1) wn2 = -wn2;
wn1 = sqrt((1.0 + wn1) / 2.0);
}
/* Escalamiento para transformada inversa */
if (dir == -1) for (i=0; i<n; i++) { x[i] /= n; y[i] /= n; }
}
19
Interpretacin de la FFT.

1. Corriente continua.

Para una serie de 16 valores constantes en el tiempo se obtiene un espectro de un solo punto en
el origen.

Figura 24.9. Forma de onda y espectro para seal continua en tiempo.

Ntese el valor 16 en el valor mximo del espectro. En algunas definiciones se plantea la


transformada directa escalada en 1/n. En este caso el mximo valor del espectro ser 1. Esto
mejora la interpretacin como un impulso de Dirac de fuerza uno, asociado a la corriente
continua.

Primera armnica.

Para 16 muestras de la seal temporal: cos(2 n t/16), con n=0..15 se tiene la grfica de la seal,
en incrementos de t. Su FFT, graficada como magnitudes de los valores complejos, est asociada
dos puntos diferentes de cero; uno en f=1 f, y otro en f=15 f.
Donde f = 1/ t.

Se toman 16 muestras en un perodo de la seal temporal. La grfica temporal est en unidades


de t, que es el intervalo de muestreo. Se dice que es la primera armnica.

El espectro est en unidades de f. El punto espectral en 15 f es una frecuencia espejo relativa a


f=8 f, que se denomina frecuencia de Nyquist, para el caso de 16 muestras.

En el espectro, la ms alta muestra en frecuencia (positiva o negativa) se denomina frecuencia de


Nyquist. Es la mayor componente de alta frecuencia que puede existir en la seal temporal.
Dicho de otra forma si la seal no contiene frecuencias superiores a la de Nyquist puede ser
reconstruida exactamente a partir de sus muestras.
20
Si la seal que se va a muestrear tiene una frecuencia mxima, para poder recuperar dicha seal,
a partir de sus muestras, debe muestrersela con una frecuencia que sea el doble de la frecuencia
mxima. Es decir dos muestras por perodo a lo menos. Si la seal vara ms rpido que la mitad
de la frecuencia de muestreo no puede recuperrsela a partir de las muestras.

Figura 24.10. Forma de onda y espectro para Primera armnica.

24.10.3. Segunda armnica.

Para 16 muestras de la seal temporal: cos(2 n t/8), con n=0..15 se tiene la grfica de la seal,
en incrementos de t. Su FFT est asociada dos puntos diferentes de cero; uno en f=2 en f, y otro
f=14 f. Donde f = 1/ t. Se dice que es la segunda armnica.
El punto espectral en 14 es una frecuencia espejo relativa a la frecuencia de Nyquist.
Se toman ahora 8 muestras por perodo.

Figura 24.11. Forma de onda y espectro para Segunda armnica.


21
24.10.4. Tercera armnica.

Se dibuja ahora la seal temporal de tercera armnica junto a la primera o fundamental, en forma
continua. A la derecha se ilustran las 16 muestras de la tercera armnica. Se toman 16/3 muestras
por perodo.

Figura 24.12. Forma de onda y muestras para Tercera armnica.

La trasformada rpida muestra el espectro, donde figura la tercera armnica, y su espejo en 13.

Figura 24.13. Espectro para Tercera armnica.

24.10.5. Sptima armnica.

Ntese que las muestras temporales difcilmente permiten visualizar la figura continua. Se toman
16/7 muestras por perodo.
22

Figura 24.14. Forma de onda y muestras para Sptima armnica.

La transformada rpida permite visualizar el contenido armnico de la sptima. Y el espejo en 9.

Figura 24.15. Espectro para Sptima armnica.

24.10.6 Octava armnica.

Al tomar muestras con la frecuencia de Nyquist, se toman dos muestras por perodo de la octava
armnica, que tiene perodo 2 t, ya que la fundamental tiene perodo 16 t.
Frecuencia de la fundamental = 1/16 t = f/16 = ff.
Frecuencia de la octava armnica es = f/2 = 8 ff .
Perodo de muestreo = t, frecuencia de muestreo =1/ t = f.
Frecuencia de Nyquist = f/2 = 8 ff .

Las muestras de la octava armnica, dos por perodo, se ilustran junto a una grfica continua.
23

Figura 24.16. Forma de onda y muestras para Octava armnica.

Y el espectro de magnitudes obtenido mediante la FFT:

Figura 24.17. Espectro para Octava armnica.

Para la novena armnica, cuya frecuencia es mayor que la de Nyquist se obtiene un espectro
idntico al de la sptima armnica. Lo cual no permite reconstruir la seal temporal a travs de
su espectro.

24.10.7 Frecuencias no mltiplos enteros de la frecuencia de muestreo.

Los casos anteriores daban un espectro de tonos puros. Sin embargo una frecuencia levemente
diferente hace aparecer varias armnicas. Veamos por ejemplo una seal de 1,2 veces la
frecuencia fundamental (cos(2 n t*1,2/16) )

Se aprecia un valor de componente continua y presencia de segunda tercera y cuarta, en


magnitudes decrecientes. Siendo mayor la presencia de primera armnica.
24

Figura 24.18. Forma de onda y espectro para no mltiplo de frecuencia de muestreo.

Para una seal con frecuencia 1,5 veces la de primera armnica, aparecen componentes
espectrales en toda la banda (de 0 a 8), siendo ms importantes las contribuciones de la primera
y segunda.

Figura 24.19. Espectro para con frecuencia 1,5 veces la de primera armnica.
25
La mezcla de dos tonos puros: segunda de amplitud uno, y cuarta de amplitud 0,5.

Figura 24.20. Mezcla de frecuencias mltiples de la de muestreo.

La mezcla de un tercio de la 3,2 armnica con un quinto de la 5,5 armnica:

Figura 24.20. Mezcla de frecuencias no mltiplos de la de muestreo.

Se aprecia la dificultad para interpretar el contenido armnico en el espectro. Se detecta con


facilidad la importancia de la tercera, pero no la de la quinta o sexta.

24.11. Derivacin de la FFT a partir de la transformada de Fourier.

j 2 ft
(s(t)) S( f ) s(t)e dt

1
(S( f )) s(t) S( f )e j 2 ftdf
26

Si se aproxima la primera integral, asumiendo que s(t) es cero fuera del perodo fundamental
(i=0..n-1), por una sumatoria, considerando el tiempo como una variable discreta t=i t.
s1
sn-1
s0
s2

t
t0=0 t1=1 t t2=2 t tn-1

t=intervalo de muestreo

n t=Perodo fundamental

Figura 24.21. Aproximacin de la integral temporal.


i n 1
j 2 fi t
S( f ) s(i t)e t
i 0

s(k t) S ( f )e j 2 fk tdf
Para aproximar la segunda integral, se discretiza la variable f, en los puntos i f. Esto tambin
considera cero el espectro fuera del intervalo n f. Con i=0..n-1 y k=0..n-1.
i n 1
j 2 ki f t
S(k f ) s(i t)e t
i 0
i n 1
s(k t) S(i f )e j 2 ki f t
f
i 0

Dividiendo la primera por t, y arreglando la segunda sumatoria, se obtiene:


i n 1
S (k f ) j 2 ki f t
s(i t)e
t i 0
i n 1
S (i f ) j 2 ki f t
s(k t) f t e
i 0 t

Definiendo, con k=0..n-1:


27

S (k f )
S(k)
t
s(k ) s(k t)
1
f
n t
Se obtienen los polinomios:
i n 1
S(k) s(i)e j 2 ki / n
i 0

1i n1
s(k) S(k)e j2 ki / n

n i0

También podría gustarte