Trasformada discreta de Fourier

Serie finita de Fourier

Supongamos que medimos la elevación del nivel del mar en función del tiempo en una determinada posición a medida que van pasando las olas. Una boya situada en dicha posición registra los cambios de altura y las transmite cada cierto tiempo al centro oceanográfico.

Supongamos que hemos registrado las medidas durante un tiempo P=12 segundos y se han transmitido los datos cada Δt=0.375 s, en total N=32 datos. Su representación gráfica es la siguiente

xk=[-0.01,-0.14,-0.09,0.47,1.3,1.89,2.16,2.34,2.37,1.93,1.09,0.39,
0.1,-0.03,-0.17,-0.15,0.15,0.32,-0.01,-0.67,-1.24,-1.68,-2.18,-2.56,
-2.39,-1.72,-1.03,-0.59,-0.2,0.2,0.31,0.0];
N=length(xk);
dt=0.375; %intervalo de tiempo
tk=(1:N)*dt;
plot(tk,xk,'-o','markersize',4,'markerfacecolor','r')
grid on
xlabel('t(s)')
ylabel('Elevación x (m)')
title ('Analisis armónico de una ola')

La serie finita de Fourier se escribe

x(t)= a 0 + j=1 N/2 a j cos( 2πj P t ) + j=1 N/21 b j sin( 2πj P t ) a 0 = 1 N k=1 N x k a j = 2 N k=1 N x k ·cos( 2πk N j ) j=1,2,3... N 2 1 a N/2 = 1 N k=1 N x k cos( kπ ) b j = 2 N k=1 N x k ·sin( 2πk N j ) j=1,2,3... N 2 1

Donde xk es la medida de la altura x en el instante tk. Al final de esta página, justificamos las fórmulas que que nos permiten calcular los coeficientes aj y bj

Amplitudes

Calculamos los coeficientes a0, de a1 a aN/2-1, de b1 a bN/2-1 y aN/2.Con estos coeficientes dibujamos la función x(t), junto a los datos (tk,xk) k=1,2...N experimentales.

xk=[-0.01,-0.14,-0.09,0.47,1.3,1.89,2.16,2.34,2.37,1.93,
1.09,0.39,0.1,-0.03,-0.17,-0.15,0.15,0.32,-0.01,-0.67,-1.24,-1.68,
-2.18,-2.56,-2.39,-1.72,-1.03,-0.59,-0.2,0.2,0.31,0.0];
N=length(xk);
dt=0.375; %intervalo de tiempo
tk=(1:N)*dt;

a0=sum(xk)/N;
a=zeros(1,N/2);
b=zeros(1,N/2);
k=1:N;
for i=1:N/2-1
    a(i)=sum(xk.*cos(2*pi*i*k/N))*2/N;
    b(i)=sum(xk.*sin(2*pi*i*k/N))*2/N;
end
a(N/2)=sum(xk.*cos(pi*k))/N;

figure
subplot(2,2,1)
stem(a);
xlabel('Armónico')
ylabel('a(i)')

subplot(2,2,2)
stem(b);
xlabel('Armónico')
ylabel('b(i)')

subplot(2,2,3:4) %resultante
t=(0:0.01:12); %segundos
x=zeros(1,length(t));
w0=2*pi/(N*dt);
x=a0;
for i=1:N/2
    x=x+a(i)*cos(i*w0*t)+b(i)*sin(i*w0*t);
end
hold on
plot(t,x,'b')
plot(tk,xk,'bo','markersize',3,'markerfacecolor','b')
hold off
grid on
xlabel('t')
ylabel('x')
title('Resultante')

Como vemos en las dos gráficas de la parte de arriba, los coeficientes bj que nos son cero corresponden al primer armónico j=1 cuya frecuencia es f1=1/P=1/12=0.0833 Hz y el tercer armónico cuya frecuencia es f3= 3·f1=0.25 Hz. Los coeficientes aj son próximos a cero excepto los que corresponden a las frecuencias f7 y f8.

La frecuencia más alta fc que se puede detectar cuando se toman N datos separados un intervalo de tiempo Δt es

f c = N 2 f 1 = 1 2Δt

a esta frecuencia se le denomina de Nyquist, que en este ejemplo es f16=16·f1=1/(2·0.375)=1.333 Hz

Energía

La energía de un oscilador es proporcional al cuadrado de la amplitud.

Δf= 1 N·Δt S(i)= 1 2 ( a i 2 + b i 2 ) Δf i=1,2,3... N 2

El intervalo de frecuencias Δf=1/P es la diferencia entre dos frecuencias consecutivas

La energía total es el área bajo la curva

E= i=1 N/2 S(i)·Δf

Representamos la energía en función de la frecuencia en escala logarítmica en el eje Y.Con Data Cursor vemos las frecuencias que contribuyen más a la energía: f1=0.0833 Hz, f3=0.25 Hz, f7=0.583 Hz y f8=0.667 Hz. Estas dos últimas comparten la misma energía y posiblemente, la depositaria sea una única frecuencia intermedia entre las dos que no ha sido detectada por el análisis que hemos hecho basado en una frecuencia fundamental f1=1/12 Hz y múltiplos enteros de dicha frecuencia.

....
figure
df=1/(N*dt);  %intervalo de frecuencias
fk=(1:N/2)*df;
energia=(a.^2+b.^2)/(2*df);
semilogy(fk,energia,'-ro','markersize',3,'markerfacecolor','r')
grid on
xlabel('Frecuencia (Hz)')
ylabel('Energía')
title('Espectro de energía')

Mejoramos el análisis incrementando el tiempo P en el que tomamos los datos manteniendo el intervalo Δt=0.375 s constante. Cuando se incrementa el valor de N hay más términos que contribuyen a la serie de Fourier, hay más armónicos. La frecuencia límite fc=1/(2Δt) no cambia pero el intervalo Δf=1/T=1/(Δt) decrece, incremantándose la resolución en la frecuencia.

Supongamos que queremos diseñar un experimento en el esperamos que la frecuencia más alta sea fc=1 Hz y queremos discriminar frecuencias separadas por Δf=0.005 Hz. Para ello, tendríamos que tomar muestras en intervalos de tiempo Δt tal que fc=1/(2Δt)= 1 Hz, por lo que Δt=0.5 s. Durante un tiempo P tal que Δf=1/P=0.005 Hz, por lo que P=200 s, o P=N·Δt, por lo tanto N=400 datos.

Transformada Rápida de Fourier

Al hacer la transformada rápida de Fourier g=fft(xk), obtenemos N=32 números complejos gi de los cuales tomamos N/2. El espectro de energía viene dado por la fórmula.

S(i)= 2 N 2 | g i | 2 Δf i=1,2,3... N 2

xk=[-0.01,-0.14,-0.09,0.47,1.3,1.89,2.16,2.34,2.37,1.93,1.09,
0.39,0.1,-0.03,-0.17,-0.15,0.15,0.32,-0.01,-0.67,-1.24,-1.68,
-2.18,-2.56,-2.39,-1.72,-1.03,-0.59,-0.2,0.2,0.31,0.0];
N=length(xk);
dt=0.375; %intervalo de tiempo
g=fft(xk);
df=1/(N*dt);  %intervalo de frecuencias
fk=(0:N/2)*df;
energia=2*abs(g).^2/(N^2*df);
semilogy(fk,energia(1:N/2+1),'-ro','markersize',3,'markerfacecolor','r')
grid on
xlabel('Frecuencia (Hz)')
ylabel('Energía')
title('Espectro de energía')

Obtenemos prácticamente el mismo resultado que con la transformada discreta de Fourier pero con mucho menos trabajo.

En las siguientes páginas, veremos ejemplos interesantes de aplicación de la Transformada Rápida de Fourier (FFT)

Coeficientes de la serie finita de Fourier

En este apartado, vamos a obtener los coeficientes ak, bk de la serie finita de Fourier de un modo análogo a la aproximación continua.

Supongamos que hemos tomado N datos (un número par) x(tm) durante un intervalo de tiempo P en los instantes tm=mP/N, m=1,2,3...N de una señal periódica de periodo P

Definimos la serie finita de Fourier del siguiente modo

x(t)= a 0 + k=1 N/2 a k cos( 2πk t P ) + k=1 N/21 b k sin( 2πk t P )

Vamos a determinar las fórmulas que nos permiten calcular los coeficientes ak, bk. Para ello, partimos de la suma de N términos de una progresión geométrica

m=1 N exp( 2πik t m P ) = m=1 N exp( 2πik m N ) = m=1 N r m ={ r 1 r N 1r r1 Nr=1 r=exp( 2πik N )

Donde i es la unidad imaginaria, 1 . Como vemos rN=1 (el numerador y por tanto, la suma de los términos de la serie son cero) cuando k es distinto de cero. Como exp(ix)=cos(x)+isin(x), igualando a cero, la parte real e imaginaria, obtenemos los siguientes resultados

m=1 N cos( 2πk t m P ) = m=1 N cos( 2πk m N ) ={ 0k0 Nk=0,N m=1 N sin( 2πk x m P ) =0

>> format bank
>> N=12;
>> k=3;
>> sum(cos(2*pi*k*(1:N)/N))
ans =  0.00 
>> sum(sin(2*pi*k*(1:N)/N))
ans =   0.00
>> k=0;
>> sum(cos(2*pi*k*(1:N)/N))
ans =    12.00
>> sum(sin(2*pi*k*(1:N)/N))
ans =     0
>> k=N;
>> sum(cos(2*pi*k*(1:N)/N))
ans =    12
>> sum(sin(2*pi*k*(1:N)/N))
ans =  -0.00

De este resultado, se deducen estos otros que involucran los productos de senos y cosenos

m=1 N cos( 2πk t m P ) cos( 2πj t m P )= 1 2 m=1 N ( cos( 2π(k+j) t m P )+cos( 2π(kj) t m P ) ) ={ 0kj N/2k=j0,N/2 Nk=j=0,N/2 m=1 N cos( 2πk t m P ) sin( 2πj t m P )=0 m=1 N sin( 2πk t m P ) sin( 2πj t m P )= 1 2 m=1 N ( cos( 2π(kj) t m P )cos( 2π(k+j) t m P ) ) ={ 0kj N/2k=j0,N/2 0k=j=0,N/2

>> format bank
>> N=12;
>> k=3; j=5;
>> sum(cos(2*pi*k*(1:N)/N).*cos(2*pi*j*(1:N)/N))
ans =   0.0
>> sum(sin(2*pi*k*(1:N)/N).*sin(2*pi*j*(1:N)/N))
ans =   0.00
>> sum(sin(2*pi*k*(1:N)/N).*cos(2*pi*j*(1:N)/N))
ans =  -0.00
>> k=5;j=5;
>> sum(cos(2*pi*k*(1:N)/N).*cos(2*pi*j*(1:N)/N))
ans =    6.00
>> sum(cos(2*pi*k*(1:N)/N).*sin(2*pi*j*(1:N)/N))
ans =  -0.00
>> sum(sin(2*pi*k*(1:N)/N).*sin(2*pi*j*(1:N)/N))
ans =    6.00
>> k=0;j=0;
>> sum(cos(2*pi*k*(1:N)/N).*cos(2*pi*j*(1:N)/N))
ans =    12.00
>> sum(cos(2*pi*k*(1:N)/N).*sin(2*pi*j*(1:N)/N))
ans =     0
>> sum(sin(2*pi*k*(1:N)/N).*sin(2*pi*j*(1:N)/N))
ans =     0
>> k=N/2;j=N/2;
>> sum(cos(2*pi*k*(1:N)/N).*cos(2*pi*j*(1:N)/N))
ans =    12.00
>> sum(cos(2*pi*k*(1:N)/N).*sin(2*pi*j*(1:N)/N))
ans =  -0.00
>> sum(sin(2*pi*k*(1:N)/N).*sin(2*pi*j*(1:N)/N))
ans =   0.00

Para calcular los coeficientes aj multiplicamos la serie finita x(t) por cos(2πj·t/P) y sumamos para los N datos

m=1 N x( t m )cos ( 2πj t m P )= a 0 m=1 N cos ( 2πj t m P )+ m=1 N ( k=1 N/2 a k cos( 2πk t m P ) ) cos( 2πj t m P )+ + m=1 N ( k=1 N/21 b k sin( 2πk t m P ) ) cos( 2πj t m P )

Para j=0, obtenemos a0

a 0 = 1 N m=1 N x( t m )

Para j≠0, N/2, obtenemos aj, j=1,2,...N/2-1

a j = 2 N m=1 N x( t m )cos ( 2πj t m P )j=1,2,... N 2 1

Para j=N/2, obtenemos aN/2,

a N/2 = 1 N m=1 N x( t m )cos ( mπ )

Para calcular los coeficientes bj multiplicamos la serie finita x(t) por sin(2πj·t/P) y sumamos para los N datos

m=1 N x( t m )sin ( 2πj t m P )= a 0 m=1 N sin ( 2πj t m P )+ m=1 N ( k=1 N/2 a k cos( 2πk t m P ) ) sin( 2πj t m P )+ + m=1 N ( k=1 N/21 b k sin( 2πk t m P ) ) sin( 2πj t m P )

Obtenemos bj, j=1,2,...N/2-1

b j = 2 N m=1 N x( t m )sin ( 2πj t m P )j=1,2,3... N 2 1

Bibliografía

Dos primeros apartados

Whitford D., Vieira M. Waters J. Teaching time-series analysis. I. Finite Fourier analysis of ocean waves. Am. J. Phys. 69 (4), April 2001, pp. 490-496.