Você está na página 1de 10

Proyecto final parte 2

Para esta parte veremos la transformada de Fourier (discreta) mediante MatLab, con el comando FFT.

Como vamos a trabajar con frecuencias, podremos ahora analizar los sistemas para filtros.

Esta parte del proyecto consta de dos secciones (Teórica y práctica)

Se les pide contestar estas preguntas.

1. ¿Qué es FFT en matlab y cómo funciona de forma práctica?

Practica 1: Realice un programa en matlab de un seno a una frecuencia de 300hz, 1000hz y 5000hz, graficar en tiempo, aplicar el FFT y graficar.

2. Que es un filtro Butterworth y como se utiliza en matlab (butter)?

Practica 2: Realice un programa en matlab para graficar el filtro, multiplique por un seno y grafique la señal de salida; el filtro debe ser pasabajas, pasaaltas, pasamedias.

3. ¿Por qué la voz es una señal aleatoria?(graba tres veces tu voz diciendo alguna vocal, durante un tiempo, Ej.“aaaaaaaa” y checa para cada vez que grabaste las graficas en tiempo y en frecuencia y responde si son o no iguales las graficas y espectros.)

Practica 3. grabe, reproduzca y grafique en tiempo y en frecuencia, tu propia voz; siguiendo el programa de matlab dado.

4. Escuche las señales senoidales de la practica 1.

5. Sume una de las señales senoidales del punto 1, con las señales del punto 3(tu voz), una a una.(3 sumas)

6. Aplique los tres filtros de punto 2 al punto 5 una a una. Con el punto 5. (9 combinaciones)

7. Presente conclusiones de que hizo y para que se hizo.

8. Problema 1: Suponga un locutor grabando con un ruido GIS (frec. Aguda= suponga 15 000hz), debemos limpiar la señal.

9. Problema2: Suponga que se grabó una canción (puede grabar una música que contenga platillos(agudos), tambores(grave)), con gis. Limpie señal.

10. Problema 3: Suponga Locutor grabado con ruido blanco(aparece en todo el espectro de frecuencias). Limpie lo mejor posible la señal

11. Problema 4: Suponga canción con ruido blanco. Limpie lo mejor posible la señal.

12. Enviar a mail profesora_elizabeth@yahoo.com.mx , hasta el lunes 18 de mayo.

Laboratorios de señales y sistemas EFCH

%Lab. 1. Desplejando senoidal y cosenoidal en el dominio del tiempo

clear all clc

A=4;

f=1; %frecuencia fundamental 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)

%Lab.2 Desplegando una señal senoidal en el dominio del tiempo y de la frecuencia.

clear all clc

A=4;

f=100; %hz T=1/f; %Periodo de señal Tm=3*T; %Duración 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(2)

simple=fft(senoidal) %No da como debería stem(fref,simple)

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 y obtengo lo que debe aparecer

axis([0,1000,0,4])

%debe aparecer una espiga grande de magnitud A=4; exactamente a la frecuencia pedida f=100 hz ahora llamada frecuencia fundamental, y lo demás son armónicos o frecuencias múltiplos con magnitud pequeña.

%lab3 Sumando dos señales clear all clc

A=4;

f1=100; %hz

f2=300;

T1=1/f1; %Periodo de señal

T2=1/f2;

Tm=3*T2;%Duraciòn 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

plot(t,senoidal2,'r')

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

clear all clc

A=2;

f=1000; %frecuencia fundamental hz

%Datos de entrada fs=8000; %Dato de entrada N=24000; %Dato de entrada

ts=1/fs;

T=N*ts; %Duración de la señal

stopTime=T*(1-1/N);

t=0:ts:stopTime;

w0=2*pi*f;

fase=pi/6;

senoidal=A*sin(w0*t+fase);

figure(1)

plot(t,senoidal)

axis([0,0.003,-1.2*A,1.2*A])

wavplay ( senoidal,fs)

Frecuencias de las notas musicales La: 55_110_220_440 / Mi: 165_330_660 / Do: 275_550 Sol: 385_770 / Si: 495 / Re: 605 / Fa: 715

%Lab5. Comentarios. De manera general este programa graba voz o algún ruido por micrófono, después se escucha la voz en una bocina, después se le suma un ruido(sinoidal), después se filtra ese ruido con el butter, y se escuchara la voz sin ruido.

Pasos para grabar, almacenar y escuchar una voz en matlab. 1) Grabar voz signal = wavrecord (samples,fs,1,’double’); 2) escuchar lo grabado wavplay ( signal,fs) 3) grabar a un archivo [fid,message] = fopen (’voz.dat’,'wt’); fprintf(fid,’%f\n’,signal); fclose(fid); 4) cargar el archivo grabado

load voz.dat %Crea la variable vozQ12 signal=voz; clear voz; 5) observar el oscilograma del espectro plot(signal);

%Lab. 5. Programa completo que graba una voz en matlab, y la mezcla con un tono, luego %con un filtro le quita el ruido y queda la voz limpia. %Este programa servirá como base para que el alumno lo modifique y realice su %proyecto final.

tiempoReg = 5; %-Periodo de la grabación fs = 44100; %-Frecuencia de muestreo NO MODIFICAR

farm = 200; %-Frecuencia fundamental samples = fs*tiempoReg; %-Num de muestras display(’****MENU DE OPCIONES DE SEÑAL****’); display(’.'); display(’ a) Muestreo de voz’); display(’ b) Recuperar una muestra de voz ya grabada’); display(’.'); opcion=input(’Elija una opción ‘,’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') %deberás 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 %********************************************************

%

señal: oscilograma y espectro

%

%

variables

% signal : contiene oscilograma

% signalw : contiene espectro

% frecDomain : contiene dominio frecuencia

%******************************************************** display(’.'); display(’********************************************************’); display(’ señal: oscilograma y espectro’); display(’********************************************************’); display(’.'); display(’Presione una tecla para observar el oscilograma y el espectro’); input(’de la señal de voz’); figure(1); plot(signal); title(’Oscilograma de la señal de voz’); ylabel(’Amplitud’); signalw=fft(signal,samples); %Cálculo 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)));%exhibicióndel

espectro title(’Espectro de la señal de voz’); display(’.'); display(’********************************************************’); display(’ señal + ruido: oscilograma y espectro’); display(’********************************************************’); display(’.'); display(’Presione una tecla para observar el oscilograma y el espectro’); input(’de la señal + 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 señal + ruido’); ylabel(’Amplitud’); noisySignalw=fft(noisySignal,samples); %Cálculo 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)));

%exhibición del espectro title(’Espectro de la señal + 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( señal + ruido): oscilograma y espectro

%******************************************************** display(’.'); display(’********************************************************’); display(’ filtrado( señal + ruido): oscilograma y espectro’); display(’********************************************************’);

display(’.'); display(’Presione una tecla para observar el oscilograma y el espectro’); input(’de la señal + ruido’); %%%%%%%%%%%%%%%%%%%%%%Filtro supresor 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 señal + ruido fitlrada’); ylabel(’Amplitud’); filteredSignalw=fft(filteredSignal,samples); %Cálculo de la DFT frecDomain=fs*(0:samples-1)’/samples; %Dominio de la frecuencia en Hz

figure(6);plot(frecDomain(400:44100),abs(filteredSignalw(400:44100)));

%exhibición del espectro title(’Espectro de la filtro señal + 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

clear all clc %filtro pasaaltas [b,a]=butter(9,0.7,'high') %[b,a]=butter(n,Wn,'Tipo')

figure(1)

Freqz(b,a,128,1000) %similar a bode. Freqz es lineal. Bode logaritmico %freqz(num, den,w) se puede sust en los prog. %anteriores

%filtro pasabajas de 5 orden que corte en 300hz [b,a]=butter(5,300/500,'low'); %Se establece los parámetros del filtro

figure(2)

Freqz(b,a,128,1000); %Gráfica de la frecuencia en decibeles y defazamiento de ángulo.

%respuesta al impulso de un filtro pasabandas de 100 a 200hz de

5orden.

n=5;Wn=[100 200]/500; %parámetros del filtro [b,a]=butter(n,Wn); %comando para un filtro butterworth [y,t]=impz(b,a,101); %cambio de dominio

figure(3)

stem(t,y)

%otro filtro pasobajos

[n,Wn]=buttord(2*pi*1000,2*pi*2000,1,30,'s')

[nu,de]=butter(n,Wn,'s') [z,p,k]=buttap(n) H=tf(nu,de)

figure(4)

bodemag(H)

Ejemplos de valores butter para mover la frecuencia de corte. El valor es entre 0

Ejemplos de valores butter para mover la frecuencia de corte. El valor es entre 0 y 1 en cada extremo, al centro .5 mas a la derecha 0.7, o más a la izquierda .3, por ejemplo.

Este método es para evitar utilizar la frecuencia de muestreo que verán en las próximas materias y sabrán utilizar.

%INFORMACION SACADA DE PDF TUTORIALCONTROLTOOLBOX %ADICIONALMENTE PARA ENCONTRAR LAS RAICES EN CAP3 DE EBOOK MATLAB Y SIST t = [0:0.2:20]';%no comentar

wn = 1;

num = [wn^2];

% no comentar

%SISTEMA ESTABLE.

d = 2; %descomentar parte e

den = [1,2*d*wn,wn^2]; %fin de descomentar parte e

%SISTEMA OSCILATORIO

% d = 0; %descomentar parte o

% den = [1,2*d*wn,wn^2]; %descomentar parte i

%SISTEMA INESTABLE

% d = -0.1; %descomentar parte i

% den = [1,2*d*wn,wn^2]; %descomentar parte i

ye = step (num,den,t); figure (1) plot (t,ye);

title ('Respuesta a un escalon unitario'); xlabel ('tiempo(seg)');

grid;

figure(2)

impulse (num,den,t); ramp = t;

y = lsim (num,den,ramp,t);

figure(3)

plot (t,y,t,ramp); title ('Respuesta a una rampa'); xlabel ('tiempo(seg)'); noise = rand (size(t));

y = lsim (num,den,noise,t);

figure(4)

plot (t,y,t,noise); title ('Respuesta a un ruido aleatorio'); xlabel ('tiempo(seg)');

figure(5)

pzmap(num,den)

figure(6)

bode(num,den)

figure(7)

freqz(num, den, 128, 1000)