Series de Fourier

Una función es periódica de periodo P si hay un número P>0 tal que f(t+P)=f(t). Cualquier múltiplo n entero de P es también periodo f(t+nP)=f(t)

La función f(t)=cos(2πt)+cos(4πt)/2, es la suma de dos funciones periódicas de periodos 1 y 0.5, respectivamente. Como vemos en la gráfica f(t) es periódica con periodo P=1.

Las funciones cos(t) y cos( 2 t ) son periódicas de periodo 2π y 2π/ 2 respectivamente, pero la suma

f(t)=cos( t )+cos( 2 t )

no es periódica.

t=0:0.05:10;
x=cos(2*pi*t)+cos(4*pi*t)/2;
subplot(2,1,1)
plot(t,x);
xlabel('t')
ylabel('x')

subplot(2,1,2)
x=cos(2*pi*t)+cos(2*pi*sqrt(2)*t);
plot(t,x);
xlabel('t')
ylabel('x')

Superposición de funciones armónicas

Sea una función periódica resultado de la superposición de tres funciones armónicas con distintas frecuencias, amplitudes y fases iniciales

x=200sin(2π·100+π/2)+100sin(2π·200+π)+100sin(2π·400+3π/2)

f=[100,200,400]; %frecuencias
A=[200,100,100]; %amplitudes
phi=[90,180,270]; %fases

subplot(2,2,1)
stem(f,A)
axis([0,500,0,210])
xlabel('Frecuencia')
ylabel('Amplitud')

subplot(2,2,2)
stem(f,phi)
axis([0,500,0,360])
xlabel('Frecuencia')
set(gca,'YTick',0:90:360)
set(gca,'YTickLabel',{'0','\pi/2','\pi','3\pi/2','2\pi'})
ylabel('Fase')

subplot(2,2,3:4) %resultante
t=(0:0.1:30)/1000; %milisegundos
x=zeros(1,length(t));
for i=1:length(f)
    x=x+A(i)*sin(2*pi*f(i)*t+phi(i)*pi/180);
end
plot(t,x,'r')
xlabel('t(ms)')
ylabel('x')
title('Resultante')
ylim([-410,410])
set(gca,'XTick',(0:5:30)/1000)
set(gca,'XTickLabel',{'0','5','10','15','20','25','30'})
grid on

Serie de Fourier

Una función f(t) periódica de periodo P, se puede representar en forma de una suma infinita de funciones armónicas es decir,

f(t)= a 0 2 + k=1 ( a k cos( k 2π P t )+ b k sin( k 2π P t ) )

donde a0 a1 ...ak ... y b1 b2 .... bk .... son los denominados coeficientes de Fourier.

Teniendo en cuenta los resultados de las integrales

P/2 P/2 cos( m 2π P t )sin( n 2π P t ) dt= P 2π π π cos( mx )sin( nx )dx =0

>> syms m n t;
>> y=int('sin(m*t)*cos(n*t)',t,-pi,pi)
y =0

P/2 P/2 cos( m 2π P t )cos( n 2π P t ) dt= P 2π π π cos( mx )cos( nx )dx ={ 0mn P 2 m=n

>> syms m n t;
>> y=int('cos(m*t)*cos(n*t)',t,-pi,pi);
>> assume(m,'integer')
>> assume(n,'integer')
>> assume(m==n)
>> simplify(y)
ans =pi

P/2 P/2 sin( m 2π P t )sin( n 2π P t ) dt= P 2π π π sin( mx )sin( nx )dx ={ 0mn P 2 m=n

Los coeficientes del desarrollo en serie valen

a k = 2 P P/2 P/2 f(t)cos( k 2π P t ) dtk=0,1,2,3... b k = 2 P P/2 P/2 f(t)sin( k 2π P t ) dtk=1,2,3...

La suma parcial de las series de Fourier es

s n (t)= a 0 2 + k=1 n ( a k cos( k 2π P t )+ b k sin( k 2π P t ) )

Si la función f(t) tiene simetría, algunos de los coeficientes resultan nulos.

Función par

Por ejemplo, para el pulso rectangular simétrico de anchura 1 y periodo P=2 se obtienen los siguientes coeficientes.

a 0 = 2 2 0.5 0.5 dt =1 a k = 2 2 0.5 0.5 cos( kπt )dt= 2 kπ ( sin( kπ 2 ) ){ 0kpar 2 kπ ( 1 ) (k1)/2 kimpar

>> syms t P k;
>> ak=int(cos(pi*k*t),t,-0.5,0.5);
>> subs(ak,k,sym('[1 2 3 4 5 6 7]'))
ans =[ 2/pi, 0, -2/(3*pi), 0, 2/(5*pi), 0, -2/(7*pi)]

Vamos a reconstruir la función f(t) a partir del desarrollo en serie de Fourier.

s n (t)= 1 2 + 2cos(πt) π 2cos(3πt) 3π + 2cos(5πt) 5π 2cos(7πt) 7π +...

n=7; %número de términos
hold on
x=[-1 -0.5 -0.5 0.5 0.5 1];
y=[0 0 1 1 0 0];
plot(x,y,'b','linewidth',2)
x=linspace(-1,1,100);
y=zeros(length(x),1);
for i=1:length(x)
    y(i)=1/2;
    for k=1:2:n
        y(i)=y(i)+(-1)^((k-1)/2)*2*cos(k*pi*x(i))/(k*pi);
     end
end
plot(x,y, 'r');
title(sprintf('Aproximación de Fourier: %i términos',n))
xlabel('t'); 
ylabel('f(t)')
grid on
hold off

Función impar

Sea ahora la función de periodo P=2

Es una función impar, los coeficientes ak son nulos

b k = 1 0 sin( kπt )dt 0 1 sin( kπt )dt = 1 kπ ( 2+2cos(kπ) )={ 0kpar 4 kπ kimpar

>> syms t P k;
>> bk=int(sin(pi*k*t),t,-1,0)-int(sin(pi*k*t),t,0,1);
>> subs(bk,k,sym('[1 2 3 4 5 6 7]'))
ans =[ -4/pi, 0, -4/(3*pi), 0, -4/(5*pi), 0, -4/(7*pi)]

El desarrollo en serie es

s n (t)= 4sin(πt) π 4sin(3πt) 3π 4sin(5πt) 5π 4sin(7πt) 7π +...

n=7; %Número de términos;
hold on
x=[-1 -1 0 0 1 1];
y=[0 1 1 -1 -1 0];
plot(x,y,'b','linewidth',2)
x=linspace(-1,1,100);
y=zeros(length(x),1);
for i=1:length(x)
    y(i)=0;
    for k=1:2:n
        y(i)=y(i)-4*sin(k*pi*x(i))/(k*pi);
     end
end
plot(x,y, 'r');
title(sprintf('Aproximación de Fourier: %i términos',n))
xlabel('t'); 
ylabel('f(t)')
grid on
hold off