Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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).
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.
Que es de complejidad O(n), ya que requiere (n-1) multiplicaciones. La siguiente rutina ilustra el
procedimiento de clculo.
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).
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.
x
x0 x1 x2 xn-1
Si se conocen los puntos: (xk, yk ), se tienen n ecuaciones con n incgnitas (los coeficientes).
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.
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:
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.
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
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
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 wn(n 1)*1
wn(n 1)*2 ... wn(n 1)*(n 1)
sn 1 Sn 1
s1 S1
sn-1 Sn-1
s0 S0
s2 S2
t f
t0 t1 t2 tn-1 f0 f1 f2 fn-1
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.
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.
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
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
Algunas propiedades:
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:
Se tiene para n = 2:
S0 = s0 + x0s1
S1 = s0 + x1s1
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.
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 )
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 n /2 S kp wnk Ski
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
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).
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.
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
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.
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)
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 ;
}
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
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.
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
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');
}
}
}
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
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
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.
nn=1;
//wn = w2 = -1+j0; En el primer nivel son series de dos puntos
wn1 = -1.0;
wn2 = 0.0;
1. Corriente continua.
Para una serie de 16 valores constantes en el tiempo se obtiene un espectro de un solo punto en
el origen.
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.
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.
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.
La trasformada rpida muestra el espectro, donde figura la tercera armnica, y su espejo en 13.
Ntese que las muestras temporales difcilmente permiten visualizar la figura continua. Se toman
16/7 muestras por perodo.
22
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
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.
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) )
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.
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
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
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