Professional Documents
Culture Documents
INTRODUCCIN:
Seal aleatoria: su fase, frecuencia y amplitud son desconocidas y no se pueden predecir
antes de observar la seal. Los valores futuros de la seal no se pueden predecir a partir
de los observados.
La seal de voz es una seal especial pues codifica mediante sonidos el lenguaje hablado.
Se organiza jerrquicamente: Dilogo, Frase, Palabra, Slaba, Fonema Y Sonido
Seal aleatoria: Existe incertidumbre sobre el valor que tomar la seal (previo a su
ocurrencia).
Una seal aleatoria, tiene mucha fluctuacin respecto a su comportamiento. Los valores
futuros de una seal aleatoria no se pueden predecir con exactitud, solo se pueden basar
en los promedios de conjuntos de seales con caractersticas similares.
Seal Aleatoria
OBJETIVO:
Aprender a aplicar la transformada de Fourier en Matlab y sus variantes con el Anlisis
de Voz
De Igual Forma aprender a aplicar transformada de Fourier (discreta) mediante MatLab,
con el comando FFT.
MATERIAL:
MICROFONO
COMPUTADORA
SOFTWARE MATLAB
1. Qu es FFT en matlab y cmo funciona de forma prctica?
La Transformada Rpida de Fourier (Fast Fourier Transform) (FFT) es un algoritmo
eficiente O(NlogN) para calcular la DFT
orignalmente descubierta por Gauss a primcipios de 1800
redescubierta por Cooley y Tukey en IBM durante 1960
C.S. Burrus, de la Universidad de Rice University siendo jefe del departamento de
Ingeniera, literalmente "escribi el libro" de los algoritmos de la rpida
Transformada
La seal de voz est constituida por un conjunto de sonidos generados por el aparato
fonador. Esta seal acstica puede ser transformada por un micrfono en una seal
elctrica. La seal de voz en el tiempo puede ser representada en un par de ejes
cartesianos. Como todos los sonidos, est formado esencialmente por curvas elementales
(senos y cosenos) pero las posibles combinaciones de stas pueden ser complejas. A
manera de ejemplo, se muestra la forma de onda de la palabra explorador. La
representacin de la seal de voz en funcin del tiempo es importante puesto que brinda
informacin sobre caractersticas importantes como la energa y los cruces por cero, las
cuales facilitan su estudio y anlisis.
DESARROLLO:
Ejercicio 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.
PARA LA FRECUENCIA DE 300 Hz Seria esta la respuesta y contine con las otras.
Dominio en el tiempo
Dominio en la frecuencia
----------------------------------------------------------------------------------------------------------------------clear all
clc
A=4;
f=1000; %hz
fs=4400;
-------------------------------------------------------------------------------------------------------------clear all
clc
A=4;
f=5000; %hz
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(2)
simple=fft(senoidal) %No da como debera
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])
2.-
x=exp(-2*t).*sin(2*pi*3*t);
% Representacion en el tiempo
figure(1);
plot(t,x);
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)');
4.clear
close all
clc
f1=90;
f2=100;
f3=240;
f4=360;
fm=input('Frecuencia de muestreo (Hz) ');
tt=input('Duracin del muestreo en ms ');
N=input('Longitud de la DFT aumentada ');
t=(fm*tt)*0.001;
x1=cos(2*pi*(f1/fm)*(0:t-1))+cos(2*pi*(f2/fm)*(0:t-1));
x2=x1+cos(2*pi*(f3/fm)*(0:t-1))+cos(2*pi*(f4/fm)*(0:t-1));
y=fft(x2);
t1=0:(fm/t):fm-(fm/t);
plot(t1,abs(y),'*-r');
yy=fft(x2,N);
hold on
t2=0:(fm/N):fm-(fm/N);
plot(t2,abs(yy),'+-k')
axis([0 fm/2 0 max([abs(y) abs(yy)])]);
grid
-------------------------------------------------------------------------------------------------------------------------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
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
Dos seales
Ejercicio 2.- Realice un programa en matlab para graficar el filtro, multiplique por
un seno y grafique la seal de salida; el filtro debe ser pasabajas, pasaaltas,
pasamedias.
En base al siguiente cdigo mostramos el pasa altas fig1 y pasa bajas fig2
%filtro pasaaltas
[b,a]=butter(9,300/500,'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
figure(2)
%H=tf(a,b)
bode(b,a)
%freqz(b,a)
%filtro pasabajas de 5 orden que corte en 300hz
[b,a]=butter(5,300/500,'high'); %Se establece los parmetros del filtro
figure(3)
Freqz(b,a,128,1000); %Grfica de la frecuencia en decibeles y desfasamiento de ngulo.
wavplay ( senoidal,fs)
Ejercicio 3. Grabe, reproduzca y grafique en tiempo y en frecuencia, tu propia voz;
siguiendo el programa de matlab dado.
Diagramas de las notas musicales
Primer sonido
La
Estas pueden graficarse con el siguiente programa:
clear all
clc
A=2;
%Aqu se modifica la frecuencia para
%La: 55_110_220_440
%Mi: 165_330_660
%Do: 275_550
%sol: 385_770
%si: 495
%Re: 605
%Fa: 715
f=440; %Frecuencia fundamental en Hz.
%Datos de entrada
fs=8000; %dato de entrada
N=24000; %Dato de entrada
ts=1/fs;
T=N*ts; %Duracion de la seal
stopTime=T*(1-1/N);
t=0:ts:stopTime);
w0=2*pi*f;
fase=pi/6;
senoidal=Asin(w0*t+fase);
figure(1)
plot(t,senoidal)
axis(
[ 0,0.003,1.2A ,1.2A ]
wavplay(senoidal,fs)
As tambin grabe, reproduzca y grafique en tiempo y en frecuencia, tu propia voz;
realizando algn programa en Matlab, aplicando adems una funcin ventana.
%Este programa sirve como muestra para que ser usado
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');
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)));%exhibicin del 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');