Analisis de Fourier
Analisis de Fourier
Analisis de Fourier
Analisis de Fourier
Todos nosotros usamos a diario el analisis de Fourier incluso sin conocerlo. Tele-
fonos moviles, discos duros, DVDs, JPEGs . . . todos ellos involucran transformadas
rapidas de Fourier (FFT). Por ello, este captulo pretende discutir tanto el calculo
como la interpretacion de la FFT.
129
omega = exp(-2*pi*i/n);
j = 0:n-1;
k = j;
F = omega.(k*j)
Tengase en cuenta que el resultado del producto k*j es una matriz n n cuyos
elementos son los productos de los elementos de los dos vectores.
Sin embargo, esta aplicacion directa en forma matricial de la denicion
n1
Yk = wjk yj , k = 0, . . . , n 1
j=0
w = wn = e2i/n
tenemos que
2
w2n = wn
La obtencion del algoritmo rapido parte de la denicion de la transformada rapida
de Fourier
n1
Yk = wjk yj , k = 0, . . . , n 1
j=0
Asumamos que n es par y dividamos la suma anterior en dos terminos, uno con los
subndices pares y otros con los subndices impares
Yk = wjk yj + wjk yj
j par j impar
n/21 n/21
= w2jk y2j + wk w2jk y2j+1
j=0 j=0
Las dos sumas de la derecha son las componentes de las FFTs de longitud n/2 de las
porciones de y con subndices pares e impares. Lo que hemos hecho en vez de calcular
la FFT completa de longitud n son dos FFTs de longitud n/2 cada una, multiplicar
una de estas porciones por las potencias de w y concatenar los resultados. Notese
que con ello pasamos de 2n2 a {2(n/2)2 + 2(n/2)2 + n} = n2 + n operaciones, lo que
supone practicamente reducir a la mitad en un solo paso el numero de calculos.
Ahora, si n no es solo par sino tambien una potencia de 2, el proceso puede ir
repitiendose de forma recursiva. La transformada de longitud n se expresa en terminos
de dos FFTs de longitud n/2, a continuacion como cuatro FFTs de longitud n/4,
equivalentemente ocho FFTs de longitud n/8 y sucesivamente hasta lograr n FFTs
de longitud uno, dado que la FFT de longitud uno (de un numero) es el propio numero
en cuestion. Gracias a esta recursividad es como se logra convertir la complejidad del
calculo de la FFT de O(n2 ) a O(n log2 n). Si n no es una potencia de 2, todava
es posible expresar la FFT de longitud n en terminos de otras FFTs de longitud
menor. Por ejemplo, una FFT de longitud 100 puede expresarse como dos FFTs de
longitud 50, o cuatro FFTs de longitud 25, y cada FFT de longitud 25 en terminos
de cinco FFTs de longitud 5. Obviamente, cuanto mayores sean los primos en los que
se divide la longitud inicial peor sera el rendimiento de la FFT, pero olvidad el falso
mito de que las FFTs de vectores con longitud de una potencia de 2 son siempre
las mas rapidas: el numero de subdivisiones a realizar por el algoritmo (directamente
relacionado con el numero de accesos a memoria) tambien juega un papel fundamental
en su rendimiento.
de modo que el tono generado por el boton situado en la posicion (k,j) se obtiene
superponiendo los dos tonos fundamentales con frecuencias fr(k) y fc(j):
y1 = sin(2*pi*fr(k)*t);
y2 = sin(2*pi*fc(j)*t);
y = (y1 + y2)/2;
load touchtone
carga al espacio de trabajo tanto una senal y como su frecuencia de muestreo Fs.
Con el n de reducir el tamano del chero, el vector y se encuentra almacenado como
enteros de 8-bits con sus componentes en el rango 127 yk 127. Por ello la
instruccion
y = double(y)/128;
reescala el vector y lo convierte a doble precision para su posterior uso. Las ordenes
n = length(y);
t = (0:n-1)/Fs;
reproducen los tiempos para los cuales ha sido muestreada la senal. La ultima compo-
nente de t es 9.1309, indicando que la grabacion dura poco mas de nueve segundos.
La parte superior de la Fig. 9.2 es el trazado de la senal completa. Esta senal es
ruidosa, incluso pueden verse pequenos picos en el graco correspondiendose a los
tiempos en los que los botones fueron pulsados. Es facil de ver que un total de once
dgitos fueron marcados, aunque en esta escala es imposible determinarlos. La parte
inferior de la misma gura muestra la magnitud de la FFT, Fast Fourier Transform,
de la senal, que sera la base para determinar cada uno de los dgitos. Este graco fue
producido mediante
Y = fft(y);
f = (0:n-1)*Fs/n;
plot(f,abs(Y));
axis([500 1700 0 600]);
donde el eje-x se corresponde con la frecuencia y sus lmites han sido jados para
mostrar el rango de frecuencias del sistema DTMF. Este graco de la FFT de la senal
completa muestra que siete frecuencias se hayan presentes a lo largo de la senal, pero
no ayuda a determinar los dgitos individuales.
Sin embargo, esto puede lograrse dividiendo la senal en trozos y analizando cada
uno de los segmentos como una senal independiente. La Fig. 9.3 muestra el analisis
del primer segmento.
y1 = y(1:6400);
t1 = t(1:6400);
n1 = length(y1);
f1 = (0:n1-1)*Fs/n1;
plot(f1,abs(fft(y1)));
697
ABC DEF
1 2 3
GHI JKL MNO
770
4 5 6
852
PRS TUV WXY
7 8 9
OPER
941
* 0 #
1209 1336 1477
Figura 9.1: Teclado telefonico con las frecuencias asociadas a cada la y columna.
1
0 1 2 3 4 5 6 7 8 9
Tiempo (s)
600
400
200
0
600 800 1000 1200 1400 1600
Frecuencia (Hz)
1
0 1 2 3 4 5 6 7 8 9
1
1
0.4 0.405 0.41 0.415 0.42 0.425 0.43 0.435 0.44
300
200
100
0
600 800 1000 1200 1400 1600
Para este segmento hay unicamente dos picos en su FFT, indicando que solo dos
de las frecuencias basicas estan presentes en esta porcion de la senal. Como puede
extraerse de la Fig. 9.1, estas dos frecuencias provienen del boton 1, de modo que
puede concluirse que el numero marcado en touchtone comienza con un 1. Uno de
los ejercicios propuestos pide continuar el analisis e identicar el numero de telefono
completo.
100 100
80 80
abs(fft(y1))
abs(fft(y2))
60 60
40 40
20 20
0 0
0 5 10 15 20 25 0 5 10 15 20 25
Frecuencia (Hz) Frecuencia (Hz)
la frecuencia de muestreo debe ser al menos igual a la frecuencia mas rapida presente
en el mismo. Como veremos, en realidad la restriccion es mayor de lo que intuitiva-
mente nos puede parecer razonable. Tomemos como ejemplo dos senales senoidales
de frecuencias 5 y 20 Hz, ambas muestreadas a una misma frecuencia de 25 Hz, y
representemos sus transformadas de Fourier:
Fs = 25;
dt = 1/Fs;
t = 0:dt:10;
y1 = sin(2*pi*5*t);
y2 = sin(2*pi*20*t);
n = length(y1);
f = (0:n-1)*Fs/n;
subplot(1,2,1); plot(f,abs(fft(y1)),b);
subplot(1,2,2); plot(f,abs(fft(y2)),r);
Como puede apreciarse en la Fig. 9.4 ambas senales poseen identicas transforma-
das de Fourier, a pesar de que las dos han sido muestreadas con una frecuencia mas
rapida que la frecuencia de la propia senal. Por lo tanto, con un analisis de Fourier
no seramos capaces de discriminar entre ambas senales Signica esto que la trans-
formada de Fourier deja de ser una herramienta valida de analisis? La respuesta es
no, tan solo que la segunda senal no ha sido sampleada correctamente.
La explicacion a lo que esta ocurriendo puede extraerse facilmente de la Fig. 9.5,
en donde la senal de 5 Hz aparece dibujada en azul y la de 20 Hz en rojo, y los puntos
sobre ambas senales se corresponden a los instantes en los que se muestrea la senal.
Vease que los datos muestreados son completamente simetricos respecto al eje y = 0,
por lo que se verica, para esta frecuencia de muestreo, la relacion y2 = y1 . Es por
tanto obvio que si ambas senales son iguales salvo multiplicadas por un escalar ambas
tendran el mismo contenido armonico.
Lo que hemos aprendido de forma cualitativa en esta seccion aparece plasmado
formalmente en el teorema de Nyquist, que puede expresarse de forma simplicada
como: la frecuencia de muestreo de un sistema debe ser, como mnimo, el doble de la
frecuencia mas rapida presente en el mismo. A la mitad de la frecuencia de muestreo
se la conoce como frecuencia de Nyquist, Fn = Fs/2. Vease, por ejemplo en la Fig.
9.4, que la transformada de Fourier de una senal presenta simetra en torno a esta
0.5
0.5
1
0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5
load sunspot.dat
t = sunspot(:,1);
wolfer = sunspot(:,2);
n = length(wolfer);
150
Indice de Wolfer
100
50
0
1700 1750 1800 1850 1900 1950
Ao
c = polyfit(t,wolfer,1);
trend = polyval(c,t);
plot(t, [wolfer; trend],-,t,wolfer,k.)
xlabel(Ano)
ylabel(Indice de Wolfer)
title(Indice de manchas solares con tendencia lineal)
y = wolfer - trend;
Y = fft(y);
Fs = 1; % Frecuencia de muestreo
f = (0:n-1)*Fs/n;
power = abs(Y);
stem(f,power)
axis([0 Fs/2 0 4500])
xlabel(Ciclos/Ano)
ylabel(Potencia)
title(Periodograma)
La frecuencia maxima ocurre cerca de una frecuencia = 0.09 ciclos/ano, pero nos
gustara conocer el periodo correspondiente en anos/ciclo. Para ello, simplemente
4000 4000
3500 3500
3000 3000
Potencia
Potencia
2500 2500
2000 2000
1500 1500
1000 1000
500 500
0 0
0 0.1 0.2 0.3 0.4 0.5 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Ciclos/Ao Aos/Ciclo
Figura 9.7: (Izquierda) Periodograma del ndice de manchas solares. (Derecha) El detalle
del periodograma muestra un periodo de 11 anos por ciclo.
power = abs(Y);
find(power == max(power)), % Encontramos el indice del maximo (27)
parte = 15:40;
stem(1./f(parte),power(parte))
xlabel(Anos/Ciclo)
ylabel(Potencia)
title(Detalle del periodograma)
y datos
Fs frecuencia de muestreo
n = length(y) numero de muestras
t = (0:n-1)/Fs tiempo total
dt = 1/Fs incremento de tiempo
Y = fft(y) transformada de Fourier discreta
abs(Y) amplitud de la FFT
abs(Y).2 potencia
f = (0:n-1)*Fs/n frecuencia (ciclos/unidad de tiempo)
(n/2)*Fs/n = Fs/2 frecuencia de Nyquist
p = 1./f periodo
Ejercicios
load train
9.4 El canto de los pajaros. Analiza la muestra de sonido chirp del directorio
demos de Matlab. Ignorando una pequena porcion del nal, es posible seg-
mentar la senal en ocho partes, cada una conteniendo un trino. Representa
la magnitud de la FFT de cada segmento. Usa subplot(4,2,k) con k =
1:8 y los mismos margenes para los ejes de cada subplot. Frecuencias en el
margen entre 400 Hz y 800 Hz pueden ser apropiadas. Si observas con aten-
cion, deberas observar que al menos uno o dos de los trinos poseen gracos
distintivos.