Documente Academic
Documente Profesional
Documente Cultură
ING. ELECTRNICA
7A
Matemticas avanzadas
OCTUBRE 2016
La transformacin de Fourier y la FFT.
Hemos visto que una seal peridica que se repite en el tiempo como
un EKG- puede representarse como suma de ondas senoidales. Las
funciones a sumar pueden ser muy diferentes, al igual que 1+4 y 2+3
suman 5. Las que nos interesarn especialmente, y en eso se basa el
anlisis de Fourier son las que tienen unas frecuencias determinadas.
Las elegidas son, la frecuencia que caracteriza la seal que queremos
analizar (por ejemplo 80 por minuto podra ser un valor tpico de un
EKG), y sus mltiplos: el doble, el triple
f, 2f, 3f, 4f, 5f
Y as, cualquier seal podr descomponerse en una suma como la
siguiente
>>fft(x)
En donde x es nuestra serie de datos. El resultado numrico de la
transformacin no se interpreta directamente. Se trata de nmeros
complejos, que tendrn un mdulo que ser la amplitud- y un ngulo
la fase- de cada una de las componentes. Adems, estarn
repetidos, dando una serie de datos simtrica. Nos interesa slo la
mitad. Y adems estarn multiplicados por N/2, siendo N el nmero de
datos de nuestra serie. Si recuperaremos la ltima seal que
generamos.
>>bar(y)
Ejercicio 1
Seales y Anlisis de Fourier En esta prctica se pretende revisar
parte de la materia del tema 2 de la asignatura desde la perspectiva de
un entorno de clculo numrico y simulacin por ordenador. El objetivo
fundamental es familiarizarse con la definicin, manipulacin y
representacin de seales en MATLAB. Para ello, en primer lugar,
repasaremos y consolidaremos las nociones de MATLAB adquiridas
en la prctica anterior; en particular la definicin, operacin y
representacin de seales en el dominio del tiempo. Posteriormente,
utilizaremos algunas de las funciones que ofrece MATLAB para el
Anlisis de Fourier as como para la manipulacin de seales en los
dominios del tiempo y la frecuencia, Como ya estudiamos en diversos
ejemplos de la prctica anterior, MATLAB es muy utilizado en la
definicin, manipulacin y representacin de seales analgicas.
Siendo rigurosos, el procedimiento seguido en esos ejemplos no es
adecuado para el anlisis de seales analgicas; es ms, en general,
MATLAB no permite analizar seales analgicas. Esto se debe a que
la forma natural de representar una seal en MATLAB es definir una
secuencia finita de valores
mediante un vector fila. As, como veremos en el siguiente ejercicio,
podemos definir la secuencia de instantes de tiempo equidistantes
>> f_sierra=sawtooth(2*pi*0.1*t,width);
>> plot(t,f_sierra);
SEAL TRIANGULAR
% Ejemplo de seal triangular de periodo 0.1Hz
% Es un caso particular de seal diente de sierra con width=0.5
>> t=-10:0.01:10;
>> f_triangular=sawtooth(2*pi*0.1*t,0.5);
>> plot(t,f_triangular);
SEAL EXPONENCIAL
% Ejemplo de seal exponencial decreciente
>> t=-10:0.01:10;
% tau: constante de tiempo (RC)
>> tau=200e-2;
>> f_expon=exp(-t/tau);
>> plot(t,f_expon);
SEAL CUADRADA
2. Anlisis de Fourier
% Ejemplo de seal cuadrada de frecuencia 0.5Hz
% square(x,duty) genera una onda cuadrada de periodo 2*pi con un
duty cycle dado
>> t=-10:0.01:10;
>> duty=50; % porcentaje del periodo en el que la seal es positiva
>> f_cuadrada=square(2*pi*0.5*t,duty);
>> plot(t,f_cuadrada);
Cdigo#3
Anlisis de Fourier
T=1/f;
% Indice de los coeficientes
n=1:10;
% Coeficientes de Fourier
cn=2*(cos(n*pi)-1)./(-2*j*n*pi);
co=1;
subplot(2,1,1);
stem(n,abs(cn));
ylabel('Magnitud de cn');
subplot(2,1,2);
stem(n,angle(cn));
ylabel('fase de cn');
xlabel('n');
Ejercicio 3
MATLAB est equipado con funciones especiales que nos van a permitir realizar un
anlisis de Fourier de funciones definidas por un conjunto de valores discretos. Por
ejemplo, el comando fft() nos permite obtener la transformada rpida de Fourier (fast
Fourier Transform) de una secuencia de nmeros definida por el vector x. Por ejemplo:
>> X=fft(x);
donde X es un vector de nmeros complejos ordenados desde k=0...N-1. Si queremos
que sea ms eficiente en el clculo de la ffT, la longitud del vector x deber ser una
potencia de 2. Podemos rellenar de ceros el vector x para que tenga la longitud
apropiada. Esto se consigue automticamente haciendo:
>> X=fft(x,N);
donde N es exponente de 2. Mientras ms largo sea x, ms fina ser la escala para la
ffT. Debido a un fenmeno de plegamiento del espectro, slo la primera mitad de los
puntos obtenidos son de utilidad. La funcin fftshift() reordena el vector X en orden
creciente de frecuencia. Si X es el vector resultante de hacer una ffT, utilizando esta
funcin reordenamos los puntos en funcin de la frecuencia.
>> X=fftshift(X);
Ejercicio 4
Ejercicio 5
title('x(t)=exp(-2t)sin(2pi200t)');
xlabel('Tiempo (t)');ylabel('x(t)');
% Transformada y representacion en frecuencia
Xt=fft(x);
X=fftshift(Xt);
% Magnitud y fase de la transformada
Xm=abs(X);
Xf=unwrap(angle(X))*180/pi;
% Base de frecuencias
delta_t = t(2)-t(1);
f = ((1:length(t)) - ceil(length(t)/2)) / length(t) / delta_t;
figure(2);
subplot(2,1,1);
plot(f,Xm,'r');zoom;
title('Mdulo de transformada de Fourier de x(t)');
xlabel('frecuencia (Hz)');ylabel('|X(jw)|');
subplot(2,1,2);
plot(f,Xf,'r');zoom;
title('fase de la transformada de Fourier de x(t)');
xlabel('frecuencia (Hz)');ylabel('fase X(jw)');
% Obtener la seal en el dominio del tiempo a partir de su
transformada
xrec=ifft(Xt);
figure(3);
plot(t,xrec);
title('Transformada inversa')
xlabel('Tiempo (t)');ylabel('xrec(t)');
cdigo#4
function fousen(N)
x=-2:0.005:2;
sumparcial=0;
b=zeros(1,N);
for k=1:N
b(k)=2/(k*pi);
sumparcial=sumparcial+b(k)*sin(k*x*pi/2);
end
f=(x<0).*(-1-x/2)+(x>=0).*(1-x/2);
plot(x,f,b,x,sumparcial,g),shg
function fou(N)
x=-1:0.05:1;
a=zeros(1,N);
sumparcial=1/3;
for k=1:N
a(k)=quadl(@fun,-1,1,1e-9,[],k);
sumparcial=sumparcial+a(k)*cos(k*x*pi);
end
f=x.^2;
plot(x,f,b,x,sumparcial,g),shg
function y=fun(t,n)
y=(t.^2).*cos(n*pi*t);
REFERENCIAS
http://personales.unican.es/alvareze/CalculoWeb/CalculoII/practicas/P
R7_Armonicos_14_15.pdf
http://www2.imse-cnm.csic.es/~belen/Ficherospdf/practica2.pdf