You are on page 1of 24

Seales y sistemas 2

DICIS

PRACTICA 1: GENERACIN Y GRAFICACIN DE SEALES DISCRETAS


OBJETIVOS
1. Comprender como se simulan seales discretas en el tiempo usando MATLAB
2. Generar seales exponenciales, sinusoidales, cuadrada, diente de sierra y escaln, visualizarlas en forma
discreta.
3. Revisar las diferentes modalidades que existen para graficar una seal.,
EXPERIMENTO
Genere un archivo .m nuevo. Escriba cada instruccin y ejectela para ver su funcionamiento. Se le sugiere
separe zonas de ejecucin usando la instruccin pause.
SEALES DISCRETAS
Se le recomienda hacer esta parte de la prctica en un archivo *.m. Antes de continuar borre todos los valores
que se encuentran almacenados en memoria:
>>clear
Esta instruccin tambin puede emplearse para borrar una sola variable. Por ejemplo:
>>clear w o ms de una variable:
>>clear x, v1, v2
Para generar una seal discreta en el tiempo x[n], primero se debe definir un vector ndice temporal 'n'
apropiado. Por ejemplo, para producir una curva exponencial decreciente x[n]=0.9n en el intervalo escriba:
>>n=[-10:10]
La curva exponencial decreciente x[n] se obtiene escribiendo:
>>x=(0.9).^n;
Donde '.^ ' representa la operacin de elevar 0.9 a cada uno de los elementos de n. A continuacin grafquela.
>>stem(n,x)
Obtenga una exponencial creciente:
>>w=(1.11).^n;
Grafquela:
>>stem(n,w)
Genere y grafique la seal par x3[n]=0.9|n|.
>>x3=(0.9).^abs(n);
>>stem(n,x3);
Calcule y grafique la senoidal compleja y[n]
>>y=exp(j*pi*n/5-pi/3);
>>stem(n,y);
Grafique las partes real e imaginaria de y[n]. Cul es el perodo de la seal?. Justifique su respuesta grfica y
analticamente. Calcule la funcin z[n]=x[n]y[n]
>>z=x.*y;
Explique cmo se interpretan las partes real e imaginaria de z[n]. De modo similar a la parte A, genere dos
senoidales reales.
>>v1=cos(pi*n/5-pi/3);
>>v2=sin(pi*n/5+pi/4);

Seales y sistemas 2

DICIS

Obtenga las funciones par e impar de cada una.


>>v1par=0.5*(v1+fliplr(v1));
>>v1imp=0.5*(v1-fliplr(v1));
Calcule los valores de las funciones par e impar en n=0
>>v1par(find(n= =0)) %Sin punto y coma al final
>>v1imp(find(n= =0))
Calcule los valores de las funciones par e impar en n=0 para v1, v2, al igual que para las siguientes seales:
>>u=[zeros(1,10) ones(1,11)]; %Escaln unitario discreto
>>e=x.*u;
Para finalizar genere alguna de las seales peridicas que conoci al generar seales continuas, pero en forma
discreta. Genere un vector discreto de tiempo N de 200 puntos. Pruebe con square(N/pi). Grafique con stem.

ASIGNACION
Luego de haber aprendido algunos comandos Ud. debe realizar la siguiente actividad:
1) Genere un vector de tiempo( que se inicie en t = -1) de 20000 puntos en pasos de 1/10000
2) Genere la siguiente seal: -2+3*cos(20*pi*t)+sin(40*pi*t)
3) Genere una seal cuadrada peridica con perodo igual a 1/10 segundos
4) Genere una seal diente de sierra peridica con perodo igual a 1/10 segundos
5) Genere una seal igual a sgn(t-0.5)
6) Grafique estas 4 seales en una sola hoja usando subplot y plot; a la ltima grfica fjele un eje de tiempo
entre -2 y 2 y un eje de amplitudes entre -2 y 2. A la tercera pngale grilla. A la segunda pngale un ttulo. A la
primera pngale nombre a los ejes.
7) Genere un escaln unitario
8) Determine la parte par e impar del escaln
9) Grafique estas 3 funciones una sobre la otra en tres figuras y colores distintos (use stem)
10) Grafquelas ahora en una misma hoja usando subplot y plot
11) Determine los ndices donde la seal diente de sierra toma valores menores a 0.005 y mayores a -0.005

1.1.2 Ejercicio 2: representacin de dos seales en un cierto rango


Sean x1[n]=d [n] y x2 [n]=d [n + 2] (la funcin d [n] toma valor 1 para n=0 y valor nulo en el resto).
Dibuje aparte el aspecto que tienen ambas seales. Estas seales pueden definirse en MATLAB escribiendo:

>> nx1=[0:10];
>> x1=[1 zeros(1,10)];
>> nx2=[-5:5];
>> x2=[zeros(1,3) 1 zeros(1,7)];
Para representarlas, basta escribir stem(nx1,x1) y stem(nx2,x2). Compruebe que obtiene el resultado esperado.
Represntelas ahora directamente con stem(x1) y stem(x2), funcin que en ausencia de un vector de ndices
asume que ste comienza en 1 y que tiene la misma longitud que la seal. Indique, en esta situacin, cual es la
expresin analtica de las seales que observa:
Seal representada con stem(x1)
Seal representada con stem(x2)
Tenga en cuenta en lo sucesivo que a la hora de representar seales, tan importante como la expresin de la
seal es el vector de ndices con respecto al cual se representa.

Seales y sistemas 2

DICIS

PRACTICA 2. REPRESENTACIN DE SEALES ESPECIALES


Seales especiales.
Vamos a ver una posible forma de representar en MATLAB algunas seales analgicas tpicas. Grafica cada una
de las seales especiales
SEAL ESCALN
% Ejemplo de seal escaln
>> t=-10:0.01:10;
>> f_escalon=[zeros(1,1000),ones(1,1001)];
>> plot(t,f_escalon);
SEAL PULSO
% Ejemplo de seal pulso
>> t=-10:0.01:10;
>> f_pulso=[zeros(1,950),ones(1,101),zeros(1,950)];
>> plot(t,f_pulso);
SEAL SAMPLING
% Ejemplo de seal sampling
>> t=-10:0.01:10;
% Seal sampling nula en t=n*pi, n=1,2,...
>> f_sampling=sin(t)./t;
>> plot(t,f_sampling);
% Seal sinc nula en t=n, n=1,2,...
>> f_sinc=sinc(t);
>> plot(t,f_sinc);
SEAL IMPULSO O DELTA DE DIRAC
% Ejemplo de seal impulso
>> t=-10:0.01:10;
>> f_impulso=[zeros(1,1000),1,zeros(1,1000)];
>> plot(t,f_impulso);
SEAL DIENTE DE SIERRA
% Ejemplo de seal diente de sierra de periodo
0.1Hz
% sawtooth(x,width) seal en diente de sierra con
periodo 2*pi para los
% elementos del vector x. El parmetro width es
un escalar entre

% 0 y 1, y describe la fraccin del periodo 2*pi en el


que ocurre el
% mximo.
>> t=-10:0.01:10;
>> width=0.10;
>> f_sierra=sawtooth(2*pi*0.1*t,width);
>> plot(t,f_sierra);
SEAL TRIANGULAR
% Ejemplo de seal triangular de periodo 0.1Hz
% Es un caso particular de seal diente de sierra con
width=0.5
>> t=-10:0.01:10;
>> f_triangular=sawtooth(2*pi*0.1*t,0.5);
>> plot(t,f_triangular);
SEAL EXPONENCIAL
% Ejemplo de seal exponencial decreciente
>> t=-10:0.01:10;
% tau: constante de tiempo (RC)
>> tau=200e-2;
>> f_expon=exp(-t/tau);
>> plot(t,f_expon);
SEAL CUADRADA
% Ejemplo de seal cuadrada de frecuencia 0.5Hz
% square(x,duty) genera una onda cuadrada de
periodo 2*pi con un duty cycle dado
>> t=-10:0.01:10;
>> duty=50; % porcentaje del periodo en el que la
seal es positiva
>> f_cuadrada=square(2*pi*0.5*t,duty);

Seales y sistemas 2

DICIS
PRACTICA 3. OPERACIONES CON SEALES

Realice todos los ejercicios que se le solicite en ficheros .m, de modo que pueda guardar y modificar sus
resultados sin necesidad de volver a teclear el cdigo de nuevo. Despus de cada ejercicio, solicite al profesor de
prcticas que valide el resultado en su memoria de prcticas.
Realizar la siguiente graficas y analizar los siguientes cdigos:
clear all
clc
A=1;
f=1;
w0=2*pi*f;

t=0:0.01:20;
fase=0;
senoidal=A*sin(w0*t+fase);
plot(t,senoidal)

Siguiente programa realiza la suma de las dos seales discretas


clear
senoidales=senoidal2+senoidal;
clc
figure(1)
A=1;
plot(t,senoidal)
f=100;
hold on
T=1/f; %Periodo de la frecuencia
plot(t,senoidales,'r')
Tm=3*T; %numero de periodos que queremos ver
figure(2)
W0=2*pi*f
simple=fft(senoidal)
N=50
stem(fref,simple) %stem se utiliza para graficar
tao=Tm/N %Incremento obtenido
seales discretas
t=0:tao:Tm
figure(3)
fs=1/tao; %Frecuencia de Muestreo
tfsin=fft(senoidal/length(senoidal))
df=fs/N; %Incremento obtenido en fs
stem(fref,tfsin)
fref=-fs/2:df:fs/2
figure(4)
fase=pi/6;
stem(fref,2*tfsin)
senoidal=A*sin(W0*t+fase)
axis([0,1000,0,4])
senoidal2=A*sin(W0*t+fase)
Escriba un fichero en MATLAB para dibujar n armnicos de una seal cuadrada de periodo 0.2s y amplitud 1.
% Desarrollo en serie de Fourier de una seal
for k=1:size(t,2)
cuadrada de periodo 0.2s y amplitud 1
s(i,k)=(2*(1-cos(pi*i))/(pi*i))*sin(2*pi*i*f*t(k));
clear;
end
% frecuencia de la seal cuadrada (=1/T)
end
f=5;
for k=1:size(t,2)
T=1/f;
st(k)=sum(s(:,k));
% Indice de los coeficientes
end
n=1:10;
st(1)=st(1)+1;
% Generamos la serie de Fourier
plot(t,st,'r');
t=-1:0.01:1; % vector de tiempos
hold on;
for i=1:50

Seales y sistemas 2

DICIS

PRACTICA 3.1. ESPECTROS DE DENSIDAD DE POTENCIA Y ENERGA


Las seales se pueden clasificarse segn sean de energa o de potencia.
Energa de una seal:
Potencia de una seal:
Una seal se dice que es de energa si su E es finita, lo que implica que su potencia es cero. Por ejemplo, los
pulsos limitados en el tiempo.Una seal se dice que es de potencia si su potencia es finita, lo que implica que su
energa es infinita. Un ejemplo de este tipo de seales lo encontramos en las seales peridicas. Para el clculo
de estos espectros disponemos, adems de las funciones para el anlisis de Fourier anteriores, de la funcin
psd(), que proporciona la densidad espectral de potencia de una seal en dB.
>>Sg=psd(x,);
Ejercicio 7
Genere un fichero MATLAB donde realice la densidad espectral de potencia de una seal coseno de frecuencia
100Hz.
% Densidad espectral de potencia
t=-pi:0.001:pi;
w=2*pi*100;
g=cos(w*t);
PSD=psd(g,2^10,lenght(g));
plot(PSD);
Pruebe el cdigo anterior y de 2 ejemplo ms cambiando la seal base

Seales y sistemas 2

DICIS
PRACTICA 4. MUESTREO

Objetivo: En esta prctica se estudiaran las consecuencias del teorema de muestreo, haciendo especial hincapi
en los efectos que se pueden producir si se muestra una seal con la frecuencia incorrecta
Ejemplo 1: Se desea generar 2 periodos de una sinusoidal analgica de amplitud 1y frecuencia 200 Hz
muestreada a 1 KHZ

Ejercicio. Consigue la seal adquirida del texto anterior y realiza la misma operacin pero ahora la sinusoidal a
muestrear a 1.2 KHz
Ejemplo 2. Genere una seal cuadrada de 1000 puntos con frecuencia de 150 Hz y muestreada a 1000 Hz.
Represente el espectro de la seal y explique el resultado

Ejercicio. Consigue la seal adquirida del texto anterior y realiza la misma operacin pero ahora la sinusoidal a
muestrear a 1.5 KHz y con 500 muestras

Seales y sistemas 2

DICIS

PRACTICA 5. CONVOLUCIN DE PULSOS RECTANGULARES.


Suponga que y son iguales al pulso rectangular definido por:

Encuentre el producto de convolucin utilizando la funcin de matlab conv.


Solucin:
Los comandos en MATLAB para calcular la convolucin para este caso son:
p=[0 ones(1,10) zeros(1,5)]; % corresponde para n=-1 hasta n=14
x=p; v=p;
y= conv(x,v);
n=-2:25;
stem(n,y(1:length(n)))
a) Dibuje con la instruccin stem la grfica y etiqutela con title, xlabel, ylabel, es decir pngale una nombre a
los ejes y ttulo a la grfica.
b) Determine N (Nx)_____, M (Nh)________ y el largo del dominio (no cero) de la seal resultante de la
convolucin
c) Determine la convolucin de la seal resultante consigo misma y a la vez haga lo mismo con la salida
d) A lo largo del ejercicio emplearemos las tres seales siguientes:

Genere un fichero MATLAB donde realice la convolucin de una seal coseno de frecuencia 100Hz y una seal
escaln. Compruebe que se verifican las propiedades de la transformada de Fourier respecto al producto de
convolucin.
% 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 las seales
t = -pi:0.001:pi;
g_escalon=[zeros(1,1000*pi+1), ones(1,1000*pi+1)];
w = 2*pi;
g = cos(w*100*t);
g_conv = conv(g,g_escalon);
figure(1);
subplot(3,1,1);
plot(t,g_escalon);
title('SEAL ESCALON');

Seales y sistemas 2

DICIS

xlabel('Tiempo (t)');ylabel('e(t)');
subplot(3,1,2);
plot(t,g);
title('cos(2pit)');
xlabel('Tiempo (t)');ylabel('cos(2*pi*100*t)');
% Convolucion
g_conv = conv(g,g_escalon);
subplot(3,1,3);
plot(t,g_conv(1:length(g)),'r')
title('Convolucion');
xlabel('Tiempo (t)');
% Transformada y representacion en frecuencia de la convolucion
G_conv=fftshift(fft(g_conv));
% Magnitud de la transformada
Gm_conv=abs(G_conv);
% Base de frecuencias
delta_t = t(2)-t(1);
f = ((1:length(g_conv)) - ceil(length(g_conv)/2)) / length(g_conv) / delta_t;
figure(2);
subplot(2,1,1);
plot(f,Gm_conv,'r');zoom;
title('Transformada de Fourier del producto de convolucion)');
xlabel('frecuencia (Hz)');ylabel('|X(jw)|');
% Obtener G_conv como el producto de los espectros
G_escalon=fftshift(fft(g_escalon));
G=fftshift(fft(g));
G_conv2=G.*G_escalon;
% Base de frecuencias
delta_t = t(2)-t(1);
f2 = ((1:length(t)) - ceil(length(t)/2)) / length(t) / delta_t;
subplot(2,1,2);
plot(f2,abs(G_conv2),'r');zoom;
title('Producto de las transformadas de Fourier)');
xlabel('frecuencia (Hz)');ylabel('|X(jw)|');
Genere un fichero MATLAB (convolucion.m) donde se realice la convolucin de una seal coseno de
frecuencia 50Hz y una seal pulso. Represente Grficamente las seales obtenidas.

Seales y sistemas 2

DICIS

PRACTICA 7. TRANSFORMADA Y COEFICIENTES DE FOURIER


A partir de la serie de Fourier, es posible reconstruir una seal peridica. Cuanto mayor sea el nmero de
armnicos utilizado en el desarrollo en serie, mejor ser la reconstruccin. Un parmetro importante en la
reconstruccin de seales es la velocidad de convergencia, o lo que es lo mismo, la velocidad con la que los
coeficientes de Fourier tienden a 0.
Escriba un fichero MATLAB que proporcione los coeficientes de Fourier de una seal cuadrada de periodo 0.2s
(frecuencia 5Hz) y amplitud igual a 1V.
% Obtener los coeficientes de Fourier para una
co=1;
seal cuadrada de periodo
subplot(2,1,1);
% 0.2s y amplitud 1.
stem(n,abs(cn));
clear;
ylabel('Magnitud de cn');
% frecuencia de la seal cuadrada (=1/T)
subplot(2,1,2);
f=5;
stem(n,angle(cn));
T=1/f; % Indice de los coeficientes
ylabel('fase de cn');
n=1:10; % Coeficientes de Fourier
xlabel('n');
cn=2*(cos(n*pi)-1)./(-2*j*n*pi);
Pruebe el siguiente cdigo para encuentrar la transformada de Fourier
clear all
df=fs/N;
clc
fref=-fs/2:df:fs/2;
A=4;
fase=pi/6;
f=100; %hz
senoidal=A*sin(w0*t+fase);
fs=4400;
figure(1)
T=1/f; %Periodo de seal
plot(t,senoidal)
Tm=3*T; %Duracin de muestra
figure(3)
w0=2*pi*f;
tfsin=abs(fftshift(fft(senoidal)));
N=50; %Num muestras
%k=[?N/2+1:N/2] %
tao=Tm/N; %intervalo muestreo
stem(fref,tfsin)
t=0:tao:Tm;
fs=1/tao; %frecuencia muestreo
MATLAB est equipado con funciones especiales que nos van a permitir realizar un anlisis de Fourier de
funciones definidas por un conjunto de valores discretos. Por ejemplo, el comando fft() nos permite obtener la
transformada rpida de Fourier (fast Fourier Transform) de una secuencia de nmeros definida por el vector x.
Por ejemplo:
>> X=fft(x);
donde X es un vector de nmeros complejos ordenados desde k=0...N-1. Si queremos que sea ms eficiente en
el clculo de la ffT, la longitud del vector x deber ser una potencia de 2. Podemos rellenar de ceros el vector x
para que tenga la longitud apropiada. Esto se consigue automticamente haciendo:
>> X=fft(x,N);
donde N es exponente de 2. Mientras ms largo sea x, ms fina ser la escala para la ffT. Debido a un fenmeno
de plegamiento del espectro, slo la primera mitad de los puntos obtenidos son de utilidad. La funcin fftshift()

Seales y sistemas 2

DICIS

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.
>> X=fftshift(X);
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);
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)');

Seales y sistemas 2

DICIS

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)');
Definir una funcin seno de forma simblica y calcular su transformada de Fourier.
% Anlsis de Fourier con clculo simblico
syms t % crear variable simblica
g=sin(2*pi*t);
G=Fourier(g); % Transformada de Fourier
ezplot(g);
ginv=iFourier(G); % Transformada inversa
Escriba un fichero en MATLAB (coeficientes_Fourier.m) que proporcione los coeficientes de Fourier de la
seal de la fig 1. Genere un fichero en MATLAB (dibuja_armonicos.m) que permita dibujar n armnicos de
dicha seal.
Genere un fichero en MATLAB (transformada_Fourier.m) para obtener la transformada de Fourier de la
seal, x(t)=sen(2pi200t+sin(2pi2t)). Realice la transformada inversa y obtenga la seal en el tiempo a
partir de su transformada.

Seales y sistemas 2

DICIS

PRACTICA 8. FUNDAMENTO DE LOS FILTROS DIGITALES POR MATLAB


1. Objetivos de la prctica El objetivo de la prctica es utilizar MATLAB para estudiar el fundamento De los
filtros digitales.
2. Ejercicios MATLAB tiene una funcin para calcular la respuesta frecuencial de un sistema LTI (lineal e
invariante en el tiempo). Esta funcin se denomina freqz(). El siguiente cdigo MATLAB muestra cmo definir
una funcin que nos muestre la respuesta frecuencial de un filtro FIR dado sus coeficientes:
% Funcion que dibuja la respuesta en frecuencia de un filtro FIR
% dado un vector con sus coeficientes b=[a0, a1, a2, a3, a4,....]
function dibujarFiltroFIR(b)
ww=0:(pi/100):pi;
H=freqz(b,1,ww);
subplot(211);
plot(ww,abs(H));
title(Respuesta en frecuencia);

xlabel(\omega);
ylabel(Amplitud);
subplot(212);
plot(ww,angle(H));
xlabel(\omega);
ylabel(Amplitud);

Edita un nuevo fichero en MATLAB y copia y pega el cdigo anterior tal y como est. Guarda dicho fichero en tu
directorio de trabajo con el nombre
dibujarFiltroFIR.m.
Podemos utilizar dicho fichero como funcin para calcular y dibujar la magnitud (funcin abs) y la fase (funcin
angle) de la respuesta frecuencial de diversos filtros FIR. Empezaremos con los ejemplos de clase.
En primer lugar visualizaremos la respuesta impulsional de un filtro promedio de dos muestras en funcin del
rango Introduce en la lnea de comandos de MATLAB el siguiente cdigo:
>> plot(t,f_cuadrada);
Realice
a) x1*h1+x1*h2, x1*(h1+h2)
b) X1*(h1*h2) , (x1*h1)*h2, (x1*h2)*x1
Grafique los resultados con su valor adecuado de n y escriba sus conclusiones

Seales y sistemas 2

DICIS

PRACTICA 8.1. APLICACIN DE FILTRADO EN UNA SEAL DE AUDIO


Objetivo: Aplicar distintos filtros a una seal (audio), en MATLAB para suprimir el ruido y obtener una seal
libre.
Desarrollo: Vamos a aplicar los filtros pasa altas y pasa bajas con la funcin BUTTER para ver cmo se comporta
la seal de audio que tenemos pregrabada con MATLAB. Escribe y concluye este cdigo, anota tus
observaciones respecto a cada seal
clear all
tiempoReg = 15; %-Periodo de la grabacin
fs = 44100; %-Frecuencia de muestreo NO MODIFICAR
farm = 2000; %-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 15 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
%

Seales y sistemas 2
% 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))); %exhibicindel 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('********************************************************');

DICIS

Seales y sistemas 2

DICIS

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=5;
[b,a] = butter(orden,[1000*2/fs],'high');
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)));

La desventaja de filtros pasa-baja y pasa-alta es que pueden eliminar frecuencias tiles sin que nosotros lo
queramos as. A pesar de la desventaja mencionada no son del todo intiles, porque si lo que se persigue es
eliminar todo un rango de frecuencias bajas o altas, ese tipo de filtro lo hace, y muy bien.
Lo mejor fue que planteamos las soluciones a los problemas de forma que se pudo visualizar el efecto de los dos
tipos de filtros vistos en el laboratorio en una grabacin hecha.
Adems nos qued claro que el filtro supresor de banda es la mejor opcin para eliminar un rango de
frecuencias intiles o indeseadas, o de ruidos de frecuencia conocida. Que entre ms alto sea el orden del filtro
Butterworth, ms drstica la cada de la curva de atenuacin. Esto hace posible cortar a partir de la frecuencia
que queremos.
Muestra las seales del oscilograma y espectro con ruido y las respectivas graficas al aplicarla el filtro pasa bajas
y pasa altas y la respuesta en frecuencia y entrega tus pespectivas conclusiones

Seales y sistemas 2

DICIS
PRACTICA 9. FILTROS DIGITALES

Objetivo:
Se pretende conocer las herramientas que este software posee para el diseo de filtros tanto analgicos
como digitales para afianzar los conocimientos vistos en clase. Comparar entre distintos filtros digitales y a
su vez con su par analgico. Determinar los parmetros de un filtro y observar cmo podra ayudarnos a
encontrar los coeficientes que luego podremos usar al programar un microprocesor.
Normalizacin de las frecuencias crticas:
Debido a que las funciones trabajan con frecuencia normalizada en radianes W en vez de hacerlo con
F en Hz necesitaremos hacer un cambio en las variables y el modo de presentarlas en la frmula.
Para normalizar stas frecuencias fp y fs (frecuencias de paso y corte en Hz)

Donde Fs es la frecuencia de muestreo y Ts su recproco, es decir el perodo de muestreo.


Ts=1/Fs . Algunas funciones de matlab para el diseo de filtros son:
Funcin FIR1
>> B = fir1(N,Wn,type,window);
Disea un filtro FIR paso bajo de orden N (longitud N+1) y frecuencia de corte Wn (normalizada con
respecto a la frecuencia de Nyquists, 0 Wn 1). Se pueden especificar otro tipo de filtros de la misma
forma que con los filtros IIR mediante el parmetro type. Por ejemplo, para un filtro parabanda:
>> B = fir1(N,[W1 W2],'stop');
Por defecto la funcin FIR usa la ventana de Hamming. Otro tipo de ventanas pueden tambin
especificarse:
>> B = fir1(N,Wn,bartlett(N+1));
>> B = fir1(N,Wn,'high',chebwin(N+1,R));
De entre las ventanas que se pueden seleccionar tenemos: rectwin,kaiser,blackman o hamming
entre otras.
Funcin FIR2
>> B = fir2(N,F,M,window);
Disea un filtro FIR utilizando el mtodo del muestreo frecuencial. Los parmetros de entrada es el orden del
filtro N (longitud N+1) y dos vectores F y M que especifican la frecuencia y la magnitud, de forma que
plot(F,M) es una grfica de la respuesta deseada del filtro. Se pueden indicar saltos bruscos en la respuesta
frecuencial duplicando el valor de la frecuencia de corte. F debe estar entre 0 y 1, en orden creciente, siendo el
primer elemento igual a 0 y el ltimo 1. El parmetro window indica el tipo de ventana a utilizar. Por defecto,
usa la ventana de Hamming.
>> B = fir2(N,F,M,bartlett(N+1));

Seales y sistemas 2

DICIS

Se pueden especificar ms parmetros en esta funcin,


>> B = fir2(N,F,M,npt,lap,window);
La funcin fir2 interpola la respuesta frecuencial deseada ( F,M) con npt puntos (por defecto, npt=512). Si dos
valores sucesivos de F son iguales, se crea una regin de lap puntos alrededor de este punto (por defecto,
lap=25). Funcin FIRLS
>> B = firls(N,F,M);
Diseo de filtros FIR usando la minimizacin del error por mnimos cuadrados. Los argumentos de entrada son el
orden del filtro N, y dos vectores F y M, cuyo formato difiere de los anlogos en la funcin fir2. El filtro obtenido
es la mejor aproximacin a ( F,M) por mnimos cuadrados. F es un vector que indica los lmites de las bandas de
frecuencia en parejas (por tanto el tamao de F debe ser par), y en orden ascendente entre 0 y 1. M es un vector
del mismo tamao que F que indica la magnitud deseada para cada banda de frecuencias. La respuesta deseada
es la lnea que conecta los puntos ( F(k),M(k)) y ( F(k+1),M(k+1)) para k impar. Las bandas de frecuencia entre
F(k+1) y F(k+2) para k impar son tratadas por firls como bandas de transicin. Tambin existe un argumento
opcional que consiste en un vector W cuyo tamao es la mitad de F. W es un factor de ponderacin del error
para cada banda de frecuencias.
>> B = firls(N,F,M,W);

Ejercicio. Estimar la longitud de un filtro FIR con fase lineal con las siguientes especificaciones: flanco de la
banda de paso = 180 Hz, flanco de la banda de rehazo = 200 Hz, rizo de la banda de paso p = 0.002 y rizo
de la banda de rechazo s = 0.001, con razn de muestreo de 12 KHz.
Solucin.
Como fp (= 180 Hz) < fs (= 200 Hz) se trata de un filtro pasa-bajas. Para determinar la longitud del filtro FIR con
un programa en MATLAB, se puede usar la frmula de Kaiser o la funcin remezord. Con la funcin remezord:
[ord, f, m, wgt] = remezord(fedge, mag, dev, FT)
su codificacin en MATLAB queda:
...
fedge = [180 200];
mag = [1 0];
dev = [0.002 0.001];
FT = 12000;
[N, f, m, wgt] = remezord(fedge, mag, dev, FT)
y el resultado es:
N = 1827
f = [0 0.030 0.0333 1.0000]
m = [1 1 0 0]
wgt = [1 2]

Seales y sistemas 2

DICIS

Problema. Haz el mismo ejemplo pero ahora con una banda de rechazo de 300 Hz y el riso de banda 0.0000001
Da un ejemplo de las siguientes funciones
Funciones para determinar el orden necesario para implementar un determinado filtro :
[N, Wn] = buttord(Wp, Ws, Rp, Rs)
Calcula el orden de un filtro pasobajo digital de Butterworth, con Ws la frecuencia de pasabanda, Wp la
parabanda, y Rp y Rs las Atenuaciones respectivas de pasabanda y parabanda en decibelios. Wp y Ws deben ser
entre (0,1), siendo 1 la frecuencia de Nyquist (fs/2). N es el orden del filtro y Wn la frecuencia de 3db.
[N, Wn] = buttord(Wp, Ws, Rp, Rs,'s')
Lo mismo que antes, pero para un filtro pasobajo analgico. Aqu los valores de Wp y Ws pueden tomar
cualquier valor en radianes. Para calcular el orden de otros tipos de filtro (pasoalto, parabanda o pasabanda)
deberemos aplicar primero las transformaciones al prototipo de filtro pasobajo (Tabla 2).
[N, Wn] = cheb1ord(Wp, Ws, Rp, Rs)
Clculo del orden necesario para un filtro digital pasobajo de Chebyshev I, con las especificaciones dadas. Las
mismas consideraciones que en el caso del filtro de Butterworth.
[N, Wn] = cheb1ord(Wp, Ws, Rp, Rs, 's')
Lo mismo pero para el filtro analgico
[N, Wn] = cheb2ord(Wp, Ws, Rp, Rs)
Filtro digital de Chebyshev II
[N, Wn] = cheb2ord(Wp, Ws, Rp, Rs, 's')
Filtro analgico de Chebyshev II
[N, Wn] = ellipord(Wp, Ws, Rp, Rs)
Filtro digital elptico
[N, Wn] = ellipord(Wp, Ws, Rp, Rs, 's')
Para los filtros digitales
>> H = freqz(B,A,F,Fs)
Devuelve el vector H de nmeros complejos, que es la respuesta frecuencial al filtro cuya funcin de
transferencia en z viene dada por B y A. La respuesta frecuencial se evala en los puntos especificados por el
vector F en Hz, siendo la frecuencia de muestre Fs Hz. Ms opciones en el Help de MATLAB.
gd = grpdelay(B,A,F,Fs)

Seales y sistemas 2

DICIS

Calcula retraso de grupo ( -d /dt) de la funcin de Transferencia formada por los polinomios B y A. Se evala en
los puntos especificados por W en radianes. Para ms opciones de esta funcin ver el Help de MATLAB.
plot(F,abs(H))
Dibuja la magnitud de la respuesta frecuencial del filtro.
plot(F,unwrap(angle(H)))
Dibuja la fase de la respuesta frecuencial del filtro.
plot(F,gd)
Dibuja el retraso de grupo de la funcin de Transferencia Discreta.
Ejermplo: Disear un filtro digital paso bajo de orden 5 con frecuencia de corte fc=1.3 KHz, por el mtodo de
Yule-Walker. Calcular las atenuaciones a 1 KHz y 2 KHz. Primero hay que elegir una frecuencia de muestreo.
Tomamos fs=5 KHz.
>>[B,A]=yulewalk(5,[0 1 1.3 2 2.5]/2.5,[1 1 0.708 0 0])
B = [0.3155 0.8087 0.7811 0.4675 0.3284 0.1492]
A = [1.0000 0.6490 0.5046 0.5031 0.1355 0.0577]
>> H = 20*log10(abs(freqz(B,A,[1000 2000],5000)))
ans = -0.2422 -20.9538 % En decibelios
>> F=0:10:2500;Fs=5000;
>> Hz = freqz(B,A,F,Fs);
>> semilogy(F,abs(Hz));

Ejercicios. Haz el mismo ejemplo pero ahora con una fc=5.5 KHz y la atenuacin de 5 kHz y 6 KHz que
cambio se nota con respecto al ejemplo anterior.
Finalmente, cuando diseemos un filtro digital nos interesar poder aplicar ese filtro a una seal temporal. Eso
se consigue con la funcin de MATLAB filter.
>> y = filter(B,A,x)
El vector x es la entrada y el vector y es la salida filtrada. B y A son los coeficientes del filtro digital. Existe otra
funcin llamada filtfilt, que funciona de la misma manera que filter, pero hace dos filtrados. Primero filtra el
vector x, y su respuesta la rota y le vuelve a aplicar el mismo filtro. La respuesta final evita la distorsin de fase
propia de los filtros IIR. Ms detalles en el Help de MATLAB.

Seales y sistemas 2

DICIS

>> y = filtfilt(B,A,x)
Ejemplo de Diseo de un Filtro de paso bajo usando las frmulas anteriores: Se pretende disear un Filtro de
paso bajo para extraer ruido blanco que ha contaminado una seal de 1 Vpp de 1 Hz.
Para comenzar el diseo comenzaremos con el filtro de Butterwhort,, para ello probaremos con una frecuencia
de corte de 5 Hz. Las frecuencias normalizadas las calcularemos fcilmente teniendo en cuenta que Fs/2 sera
nuestro valor de 1. Las dems frecuencias en Hz se pueden convertir usando una simple regla.
Nos quedara Wc=0.01 , Ws=0.08 (supongo 40 Hz) , 0.5 de atenuacin en la banda de paso en db y 60 db en la
banda de rechazo. Utilizaremos una frecuencia de muestreo de 1000 Hz.
[N,Wn]=buttord(0.01, 0.08, 0.5, 60); %Nos d el orden y frec. De corte del filtro
[num,den]=butter(N,Wn); %Calcula los coeficientes del numerador y denominador del filtro.
w=0:pi/255:pi; %Hacemos variar la frecuencia entre 0 y pi. Barrido
figure(1)
Hlp=freqz(num,den,w); %Calcula la respuesta en frecuencia del filtro para ls Fs elegida.
%plot(F,abs(Hlp))
%plot(F,unwrap(angle(Hlp)))
%plot(F,unwrap(angle(Hlp)))
semilogy(w/pi,abs(Hlp)) %Escala logaritmica de amplitud
grid
H = 20*log10(abs(Hlp));
figure(2)
plot(w/pi,H)
axis([0 1 -60 5]);
ylabel('Ganancia en dB');
xlabel('Frecuencia normalizada: w/pi');
t=0:1/1024:1-1/1024; %Creo una seal de muestra
x=sin(2*pi*1*t); %Asigno esos valores calculados al vector x
figure(3)
plot(t,x) %Muestro Seal original
y=x+0.1*randn(size(t)); %Sumo ruido gaussiano de varianza 0.1
figure(4)
plot(t,y) %Muestro la seal con ruido
figure(5)
%stem(t,y)
Sal=filter(num,den,y) %Aplico el filtro diseado a la seal de prueba.
plot(t,Sal) %Muestro la seal Filtrada
Ejercicio. Muestra la Funcin Transferencia del Filtro (Magnitud) y la Seal Contaminada con ruido blanco y la
seal filtrada respecto al cdigo anterior

Seales y sistemas 2

DICIS

Ejemplo 2 Obtener la funcin de transferencia y graficar la respuesta en frecuencia de un filtro digital IIR pasabajas elptico de 5 orden con frecuencia de paso de 0.4, y rizo de paso de 0.5 dB, y atenuacin mnima en la
banda de rechazo de 40 dB.
clear;
w=0:pi/255:pi; %Barrido de frecuencia
N = 5;
Rp = 0.5;
Rs = 40;
Wn = 0.4;
[b,a] = ellip(N,Rp,Rs,Wn);
disp('Polinomio del numerador:'); disp(b);
disp('Polinomio del denominador:'); disp(a);
% Obtencin de la respuesta en frecuencia
h = freqz(b,a,w);
H = 20*log10(abs(h));
ph = angle(h)*180/pi;
% Graficacin de la respuesta en frecuencia
figure(1);
subplot(211);
plot(w/pi,H);
axis([0 1 -60 5]);
ylabel('Ganancia en dB');
xlabel('Frecuencia normalizada: w/pi');
grid;
subplot(212);
plot(w/pi,ph);
ylabel('Fase en grados');
xlabel('Frecuencia normalizada: w/pi');
grid;
% Detalle de la respuesta en frecuencia ****************
figure(2);
plot(w/pi,H);
axis([0 0.5 -3.5 0.5]);
ylabel('Ganancia en dB');
xlabel('Frecuencia normalizada: w/pi');
grid
Realiza la funcin de transferencia y graficar la respuesta en frecuencia de un filtro digital IIR pasa-bajas elptico
de 7 orden con frecuencia de paso de 0.1, y rizo de paso de 0.9 dB, y atenuacin mnima en la banda de
rechazo de 30 dB y compara tus resultados respecto al ejercicio de ejemplo, entrega tus respectivas
conclusiones.

Seales y sistemas 2

DICIS

PRACTICA 10. RESPUESTA EN FRECUENCIA Y SOLUCIN DE ECUACIONES DIFERNCIALES


Objetivo: En esta prctica se estudiara el concepto de la respuesta en frecuencia de un sistema. Veremos cmo
podemos utilizar sta para determinar la salida de un sistema dada una cierta entrada y la relacin entre los
polos y ceros de la transformada Z y la respuesta en frecuencia de un determinado sistema.
Ejemplo: Considero un sistema definido por la ecuacin de diferencias
Siendo

una constante

El siguiente programa en MATLAB determina la salida del sistema usando la respuesta en frecuencia

Seales y sistemas 2

DICIS

Ejercicio: Grafica las secuencias obtenidas


Ejemplo 2. En este ejercicio se va a demostrar el efecto del solape temporal de una seal utilizando

Ejercicio: Muestra lo obtenido para este programa para a=97 y N=25 primero la seal original y luego apartar del
muestreo en frecuencia

Seales y sistemas 2

DICIS

PRACTICA 10.1 SOLUCIN DE ECUACIONES DE DIFERENCIA POR RECURSIN


1. Simule en el Matlab la ecuacin
y [ ]=(1+ 12) [ 1] [ ], =0,1,2,.
Escriba el programa M que resuelve la siguiente ecuacin.
Considere I= 0.12, x=200 y y(0)=6000
%ecuacin de diferencia (ejercicio)
% Calcula y(n)
y0=input ('y ');
I=input ('constante ');
x=input (' entrada constante ');
y=[]; %se define a y como un vector vacio
y(1)=(1+(I/12))*y0-x;
for n=2:360
y(n)=(1 + (I/12))*y(n-1)-x;
if y(n) < 0, break, end
end
Actividad a realizar posterior a la prctica: Modifique el problema de forma que pueda tener una entrada
arbitraria x diferente de una constante
2. Haga un programa en el Matlab que resuelva la ecuacin de diferencias:
[ ]= ( ) ( 1) ( 1)
dada la entrada e(n) dada por: [ ]= 1
0
Grafique la respuesta y la entrada.
NOTAS
DESPUES DE CADA PRCTICA DEBE IR SUS CONCLUSIONES GENERALES.

You might also like