You are on page 1of 12

Vargas Luna Carlos Arturo

SISTEMAS DE COMUNICACIONES

PRACTICA 7

MATLAB II

Universidad Nacional Autnoma De Mxico


Facultad De Ingeniera

Vargas Luna Carlos Arturo 305305024 20 de abril de 2010

Vargas Luna Carlos Arturo

Objetivo:
Aplicar la transformada de Fourier (discreta) mediante MATLAB, con el comando FFT y ver algunas de las variantes que tiene este comando, as como su utilidad en el trabajo con seales.

Metas:
El alumno habr aprendido a manejar la herramienta de MATLAB para obtener las transformadas de furrier, as como a graficarlas en el tiempo y frecuencia, esto servir para el manejo de seales.

Introduccin:
FFT es la abreviatura usual (del ingls Fast Fourier Transform) de un eficiente algoritmo que permite calcular la transformada de Fourier discreta (DFT) y su inversa. La FFT es de gran importancia en una amplia variedad de ap licaciones, desde el tratamiento digital de seales y filtrado digital en general a la resolucin de ecuaciones diferenciales parciales o los algoritmos de multiplicacin rpida de grandes enteros. El algoritmo pone algunas limitaciones en la seal y en el espectro resultante. Por ejemplo: la seal de la que se tomaron muestras y que se va a transformar debe consistir de un nmero de muestras igual a una potencia de dos. La mayora de los analizadores TRF permiten la transformacin de 512, 1024, 2048 o 4096 muestras. El rango de frecuencias cubierto por el anlisis TRF depende de la cantidad de muestras recogidas y de la proporcin de muestreo. En Matlab se utiliza la funcin fft para obtener la transformada de fourier, por ejemplo: Y = fft(X) nos regresa la transformada discreta de fourier (DFT) del vector X, realizada con el algoritmo de la transformada rpida de Fourier (FFT).

FFT con MATLAB


>> X = fft(x) o Hace la FFT del vector x. X es un vector de nmeros complejos ordenados desde k=0...N-1. Se recomienda que la longitud del vector x sea una potencia de 2. Lo que no se recomienda es que la longitud de x sea un nmero primo. o Otra opcin del la FFT es especificar el nmero de puntos con el que se quiere hacer la FFT. o >> X = fft(x,N) Si la longitud de x es menor que N, el vector se rellena con ceros. Si es mayor, el vector es truncado.

Vargas Luna Carlos Arturo >> x = ifft(X) o Hace la FFT inversa del vector X. Tambin se puede especificar el nmero de puntos N con el que quiero hacer la IFFT. o >> x = ifft(X,N) >> X = fftshift(X) o 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.

Materiales:
Una computadora con MATLAB instalado

Desarrollo:
Se realizaron los siguientes programas con ayuda de MATLAB, en los cuales se observo la salida, de ellos los cuales mostraban seales con su transformada de Fourier.

clear all clc A=4; f=1; %hz w0=2*pi*f; t=0:.001:1; fase=pi/6; senoidal=A*sin(w0*t+fase); figure(1) plot(t,senoidal) cosenoidal= A*cos(w0*t+fase); figure(2) plot(t,cosenoidal)

Vargas Luna Carlos Arturo

Posteriormente se fueron quitando algunas funciones al cdigo original, como fftshift, abs, etc. Para ver lo que ocurra con las graficas
clear all clc A=4; f=100; %hz fs=4400; T=1/f; %Periodo de seal Tm=3*T; %Duracin de muestra w0=2*pi*f; N=50; %Num muestras tao=Tm/N; %intervalo muestreo t=0:tao:Tm; fs=1/tao; %frecuencia muestreo df=fs/N; fref=-fs/2:df:fs/2; fase=pi/6; senoidal=A*sin(w0*t+fase); figure(1) plot(t,senoidal) figure(3) tfsin=abs(fftshift((fft(senoidal)))); %tfsin=abs(fftshift(fft(senoidal))); %k=[?N/2+1:N/2] % stem(fref,tfsin)

Vargas Luna Carlos Arturo

%lab3 Sumando dos seales clear all clc A=4; f1=100; %hz f2=300; T1=1/f1; %Periodo de seal T2=1/f2; Tm=3*T2;%Duracin de muestra de la frec mas grande w01=2*pi*f1; w02=2*pi*f2; N=256; %Num muestras, potencia de dos grande tao=Tm/N; %intervalo muestreo t=0:tao:Tm; fs=1/tao; %frecuencia muestreo df=fs/N; fref=-fs/2:df:fs/2; fase=pi/16; senoidal1=A*sin(w01*t+fase); senoidal2=A*sin(w02*t+fase); senoidal=senoidal1+senoidal2;%finalmente las sumo. %plot(senoidal) figure(1) plot(t,senoidal1) hold on % para graficar dos seales a la vez plot(t,senoidal2,'r')% la 'r' es para darle color a la grafica figure(3) tfsin=abs(fftshift(fft(senoidal)/length(senoidal)));% desplazamos stem(fref,tfsin) figure(4) %para frecuencias positivas stem(fref,2*tfsin) %multiplico por 2 axis([0,1000,0,2.2*max(tfsin)])%controlando ejes x y y

Vargas Luna Carlos Arturo

Despus utilizamos el comando help para saber que hace la funcin pulstran en matlab, lo que hace bsicamente esta funcin es crear un tren de pulsos, aqu la explicacin completa: posteriormente se genero un cdigo del cual podemos observar lo siguiente:
%seal triangular clear all clc A=4; f=100; %hz fs=4400; T=1/f; %Periodo de seal Tm=3*T; %Duracin de muestra w0=2*pi*f; N=50; %Num muestras tao=Tm/N; %intervalo muestreo t=0:tao:Tm; fs=1/tao; %frecuencia muestreo df=fs/N; fref=-fs/2:df:fs/2; %t = 0 : 1/1e3 : 1; % 1 kHz sample freq for 1 sec

Vargas Luna Carlos Arturo


d = 0 : Tm : 1; % 3 Hz repetition freq genfuncion = pulstran(t,d,'tripuls',0.1,-1); figure(1) plot(t,genfuncion) tfourier=abs(fftshift(fft(genfuncion)));%para sacar la transformada de fourier %k=[?N/2+1:N/2] % figure(3) stem(fref,tfourier) figure(4) plot(fref,tfourier)

Vargas Luna Carlos Arturo


% seal cuadrada clear all clc A=4; f=100; %hz fs=4400; T=1/f; %Periodo de seal Tm=3*T; %Duracin de muestra w0=2*pi*f; N=15; %Num muestras tao=Tm/N; %intervalo muestreo t=0:tao:Tm; fs=1/tao; %frecuencia muestreo df=fs/N; fref=-fs/2:df:fs/2; u=[zeros(1,10),ones(1,6)]; %funcion escalon u1=[zeros(1,10),ones(1,6)]; u2=[zeros(1,6),ones(1,10)]; pulso=u1-u2;% funcion pulso ancho=0.5; triangular=A*sawtooth(w0*t+ ancho);% funcion trinagular genfuncion=triangular; figure,plot(t,genfuncion) tfourier=abs(fftshift(fft(genfuncion))); %k=[?N/2+1:N/2] % figure, stem(fref,tfourier) tfourier2=abs(fftshift(fft(pulso))); figure(4) stem(fref,tfourier2) figure(5) plot(t,pulso)

Vargas Luna Carlos Arturo

Se procedi a realizar unas pruebas con las funciones zeros y ones, las cuales generan un vector del tamao especificado donde todos sus elementos son ceros(para la funcin zeros) o unos (para la funcin ones)

Vargas Luna Carlos Arturo Por ultimo se realizo un programa que graba la voz:
tiempoReg = 5; %-Periodo de la grabacin fs = 44100; %-Frecuencia de muestreo NO MODIFICAR farm = 200; %-Frecuencia fundamental samples = fs*tiempoReg; %-Num de muestras display('****MENU DE OPCIONES DE SEAL****'); display('.'); display(' a) Muestreo de voz'); display(' b) Recuperar una muestra de voz ya grabada'); display('.'); opcion=input('Elija una opcin ','s') ; %debes oprimir tecla s if (opcion=='a'||opcion=='A') display('.'); display('Se muestrear a 44100Hz por 5 segundos'); input('Presiona cualquier tecla para empezar a grabar'); signal = wavrecord (samples,fs,1,'double'); display('.'); input('Presiona cualquier tecla para reproducir lo grabado'); wavplay ( signal,fs) %Para escuchar lo grabado display('.'); display('El registro de voz quedar en un archivo de disco: voz.dat'); [fid,message] = fopen ('voz.dat','wt'); fprintf(fid,'%f\n',signal); fclose(fid); elseif (opcion=='b'||opcion=='B') %debers oprimir b o B display('.'); display('Se tomar una frase ya grabada en disco') load voz.dat %Crea la variable vozQ12 signal=voz; clear voz; opcion=input('Desea escuchar el archivo? ','s'); if (opcion=='s'||opcion=='S') wavplay ( signal,fs) %Para escuchar lo grabado end end %******************************************************** % seal: oscilograma y espectro % % variables % signal : contiene oscilograma % signalw : contiene espectro % frecDomain : contiene dominio frecuencia %******************************************************** display('.'); display('********************************************************') ; display(' seal: oscilograma y espectro'); display('********************************************************') ; display('.'); display('Presione una tecla para observar el oscilograma y el espectro'); input('de la seal de voz'); figure(1); plot(signal); title('Oscilograma de la seal de voz');

Vargas Luna Carlos Arturo


ylabel('Amplitud'); signalw=fft(signal,samples); %Clculo de la DFT frecDomain=fs*(0:samples-1)'/samples; %Dominio de la frecuencia en Hz figure(2);plot(frecDomain(400:44100),abs(signalw(400:44100)));%exhi bicindel espectro title('Espectro de la seal de voz'); display('.'); display('********************************************************') ; display(' seal + ruido: oscilograma y espectro'); display('********************************************************') ; display('.'); display('Presione una tecla para observar el oscilograma y el espectro'); input('de la seal + ruido'); t=(0:1/fs:tiempoReg)'; t=t(1:samples); noisySignal = signal + 0.01*sin(2*pi*farm*t); figure(3);plot(noisySignal(1:samples)); title('Oscilograma de la seal + ruido'); ylabel('Amplitud'); noisySignalw=fft(noisySignal,samples); %Clculo de la DFT frecDomain=fs*(0:samples-1)'/samples; %Dominio de la frecuencia en Hz figure(4);plot(frecDomain(400:44100),abs(noisySignalw(400:44100))); %exhibicin del espectro title('Espectro de la seal + ruido'); ylabel('Amplitud'); xlabel('Frecuencia en Hz'); opcion=input('Desea escuchar el archivo? ','s'); if (opcion=='s'|| opcion=='S') wavplay ( noisySignal,fs) %Para escuchar lo grabado end %******************************************************** % filtrado( seal + ruido): oscilograma y espectro %******************************************************** display('.'); display('********************************************************') ; display(' filtrado( seal + ruido): oscilograma y espectro'); display('********************************************************') ; display('.'); display('Presione una tecla para observar el oscilograma y el espectro'); input('de la seal + ruido'); %Filtro supersor de banda orden=3; [b,a] = butter(orden,[(farm-30)*2/fs,(farm+30)*2/fs],'stop'); filteredSignal=filter(b,a,noisySignal); figure(5);plot(filteredSignal(1:samples)); title('Osilograma de la seal + ruido fitlrada'); ylabel('Amplitud'); filteredSignalw=fft(filteredSignal,samples); %Clculo de la DFT

Vargas Luna Carlos Arturo


frecDomain=fs*(0:samples-1)'/samples; %Dominio de la frecuencia en Hz figure(6);plot(frecDomain(400:44100),abs(filteredSignalw(400:44100) )); %exhibicin del espectro title('Espectro de la filtro seal + ruido'); ylabel('Amplitud'); xlabel('Frecuencia en Hz'); opcion=input('Desea escuhcar el archivo? ','s'); if (opcion=='s'||opcion=='S') wavplay ( filteredSignal,fs) %Para escuchar lo grabado end %******************************************************** display('.'); display('Presione una tecla para observar la respuesta'); input('en frecuencia del filtro'); [H,W]=freqz(b,a,256); %256 muestras W=W*fs/(2*pi); figure(7);plot(W(1:128),abs(H(1:128))); %para producir ruido blanco es con randn(); o wgn. % http://www.it.uniovi.es/old/material/telematica/ftd/Practica2.pdf

Conclusiones:
En esta prctica pudimos aprender a utilizar la transformada de Fourier as como algunas de sus variantes y la aplicacin que estas tienen en el rea de sistemas de comunicaciones en Matlab, as como graficar seales en tiempo y en frecuencia, la funcin pulstran, ones y zeros y tomando como base el ultimo cdigo podremos empezar modificar cdigo para la entrega de el proyecto.

You might also like