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
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);
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
%
% 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(’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 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; % 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)