You are on page 1of 13

ANALISIS DE SEALES ALEATORIAS

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

Discreta de Fourier DFT.


La FFT explota las simetras en la matriz W para aproximarse "divide y
conquistaras". No hablaremos del actual algoritmo de la FFT aqu, veamos estas
notas si usted est interesado en leer ms a cerca de la idea detrs de la FFT.
>> X = fft(x)
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.
Otra opcin del la FFT es especificar el nmero de puntos con el que se quiere hacer
la FFT.
>> 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.
>> x = ifft(X)
Hace la FFT inversa del vector X. Tambin se puede especificar el nmero de puntos
N con el que quiero hacer la IFFT.
>> x = ifft(X,N)
>> X = fftshift(X)
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.
2. Que es un filtro Butterworth y como se utiliza en matlab (butter)?
El filtro de Butterworth es uno de los filtros electrnicos ms bsicos, diseado para
producir la respuesta ms plana que sea posible hasta la frecuencia de corte. En
otras palabras, la salida se mantiene constante casi hasta la frecuencia de corte,
luego disminuye a razn de 20
ndB por dcada, donde n es el nmero de polos del filtro.
Por qu la voz es una seal aleatoria?

Forma de onda de la palabra 'Explorador'.

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

Ejemplos para seguir y generar un excelente programa al respecto de las figuras:


1.Tinicial=0; % Definimos el tiempo inicial
Tfinal=0.01; % Definimos el tiempo final
step=0.001; % Definimos el paso entre instantes de tiempo
t=Tinicial:step:Tfinal-step; % Se genera el vector de tiempos
y=1*sin(300*2*pi*t); % Se genera y
plot(t,y); hold on; % Dibujamos y

----------------------------------------------------------------------------------------------------------------------clear all
clc
A=4;
f=1000; %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))); %k=[?N/2+1:N/2]
stem(fref,tfsin)

-------------------------------------------------------------------------------------------------------------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.-

Obtenga la transformada de Fourier de una seal exponencial modulada en amplitud con


una frecuencia de portadora de 200Hz, x(t)=exp(-2t)sin(2pi200t).
% Ejemplo de una ffT de una seal exponencial modulada en amplitud
% con una frecuencia portadora de 200Hz.
% Definicion de la seal
t=-0.25:0.001:0.25;
x=exp(-2*t).*sin(2*pi*200*t);
% Representacion en el tiempo
subplot(3,1,1);
plot(t,x);
title('x(t)=exp(-2t)sin(2pi200t)');
xlabel('Tiempo (t)');ylabel('x(t)');
% Transformada de Fourier
X=fftshift(fft(x));
% 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;
% Representacion en frecuencia
subplot(3,1,2);
plot(f,Xm,'r');
title('Mdulo de transformada de Fourier de x(t)');
xlabel('frecuencia (Hz)');ylabel('|X(jw)|');
subplot(3,1,3);
plot(f,Xf,'r');zoom;
title('fase de la transformada de Fourier de x(t)');
xlabel('frecuencia (Hz)');ylabel('fase X(jw)');
A partir de la transformada de Fourier, es posible reconstruir la seal en el dominio del
tiempo. El comando ifft() sirve para obtener la transformada inversa de Fourier de una
serie de nmeros complejos:
>> x=ifft(X);
3.Obtenga la transformada de Fourier de una seal exponencial modulada en amplitud,
x(t)=exp(-2t)sin(2pi3t). Realice la transformada inversa y obtenga la seal en el tiempo a
partir de su transformada.
% Ejemplo de una ffT de una seal exponencial modulada en amplitud
% Obtencin de la seal en el tiempo a partir de su transformada
% Definicion de la seal
t=-0.25:0.001:0.25;

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.

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


n=5;
Wn=[100 200]/500; %parmetros del filtro
[b,a]=butter(n,Wn); %comando para un filtro butterworth
[y,t]=impz(b,a,101); %cambio de dominio
figure(4)
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(5)
bodemag(H)
figure(6)
freqz(nu,de);

Escuchando una senoidal


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; %Duracin de la seal
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)
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');

%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
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)))