You are on page 1of 19

------------------------------------------------------------------------------------------------------------------------------------------------

Practica 1b: Sistemas Discretos

Objetivos:
Implementar el algoritmo de la convolucion e utilizarlo para realizar procesamiento de seales de audio.

Implemente en Matlab el algoritmo de la convolucion en tiempo discreto. Puede tomar como referencia el captulo 6
de la referencia [1].

CODIGO:

%%Convolucion_Mio
%%Carlos Guerrero
%%Universidad de Cuenca
function y_n =myconvolucion(x0,h0)
x_l = length(x0);
h_l = length(h0);
x_a = [x0, zeros(1,h_l)] %igualacion de matrices para
h_a=[h0,zeros(1,x_l)] %que x y h sean del mismo tamano llenando de ceros

for i =1: x_l+h_l-1 %% Numero de nuestras convolucion


y(i) = 0; %% Vector de salida lleno de ceros
for j=1:x_l %% Sumatoria desde 1 hasta la longitud de x o de h
if(i - j+1> 0) %% Se inicia un acumulador para cada n sumando solo si i-j+1
es >0
y(i) = y(i) + x_a(j)*h_a(i -j+1);
convolucion(i) = y(i);
else
end
end
end
y_n=convolucion

Explicacin del Algoritmo:

1. La funcin myconvolucion tiene dos parmetros de ingreso x0 y h0, los cuales son los vectores de x y h
respectivamente.
2. Luego se obtiene la longitud de los vectores x y h.
3. Se procede a igualar la longitud de ambas matrices, llenado de ceros las posiciones faltantes.
4. El primer for nos da el nmero de muestras de la convolucion que de acuerdo a la literatura es la longitud de
x ms la longitud de h menos 1.
5. Se le llena de ceros a la variable de salida y en nuestro caso
6. El siguiente for ira desde 1 hasta la longitud de x, debido a que Matlab no evala los vectores en posiciones
menores o iguales a 0, se le agrega un if donde (i-j+1) debe ser mayor a cero, as se asegura no tener
nmeros negativos.
7. Se declara la frmula de la convolucion y(n)=x(k)h(n-k) en el cdigo y(i)=x(j)h(i-j+1)
8. Se declara una variable convolucion dependiente de i, as se ira sumando de forma iterativa.
9. Al final se devuelve en la variable y_n, y as se termina la funcin.

Prueba del Cdigo:


1.2. Procesamiento de Audio

Para cada una de las respuestas al impulso elegidas usted debera graficar en el dominio del tiempo y en el dominio
de la frecuencia lo siguiente:

1. La seales de audio correspondiente a la entrada x[n], en el dominio del tiempo y en dominio de la


Frecuencia

Figure 1 Seal de audio correspondiente a la entrada x[n], en el dominio del tiempo


Figure 2 Seal de audio correspondiente a la entrada x[n] en Frecuencia

En las Figure 1 y 2 se puede evidenciar la seal de ingreso tanto en tiempo como en frecuencia respectivamente en
este caso la seal es un audio llamado Celos.wav

2. La seales de audio correspondiente a la respuesta al impulso h1 [n] y h2 [n], tanto en el dominio de tiempo
y
Frecuencia.
Grafica de h1[n]
0.8

0.6

0.4

0.2

-0.2

-0.4

-0.6

-0.8
0 1 2 3 4 5 6 7 8 9
4
x 10
Figure 3 Respuesta al impulso h1[n] en el dominio del Tiempo
Grafica de H1(w)
30

25

20

15

10

0
-4 -3 -2 -1 0 1 2 3 4

Figure 4 Respuesta al impulso h1[n] en el dominio de la frecuencia

En la figure 3 y 4 se observa la respuesta al impulso de la seal de audio Rays.wav tanto en el tiempo como en
frecuencia

Grafica de h2[n]
1

0.8

0.6

0.4

0.2

-0.2

-0.4

-0.6
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
4
x 10
Figure 5 Figure 6 Respuesta al impulso h2[n] en el dominio del Tiempo
Grafica de H2(w)
25

20

15

10

0
-4 -3 -2 -1 0 1 2 3 4

Figure 6 Respuesta al impulso h1[n] en el dominio de la frecuencia

En la figure 5 se observa la respuesta al impulso nmero dos de una seal de audio Trig Room.wav tanto en el
tiempo como en frecuencia

3. La seales de audio correspondiente a la salidas del sistema y[n] = x[n] h[n], con los dos impulsos tanto
en el tiempo como en frecuencia.

Figure 7 Grafica de convolucion x[n]*h1[n] en el dominio del Tiempo


4
x 10 Grafica de Convolucion x(n)*h1(n) en Frecuencia
4

3.5

2.5

1.5

0.5

0
-4 -3 -2 -1 0 1 2 3 4

Figure 8 Grafica de convolucion x[n]*h1[n] en el dominio de la frecuencia.

Las Figure 8 y 9 muestra la convolucion entre la seal x[n] y h1[n], tanto en tiempo como en frecuencia, cabe
destacar que las seales x[n],h1[n] y h2[n] se muestrearon con la funcin audioread de Matlab. luego se procedi a
hacer la convolucion con la funcin conv pasndole como parmetro los vectores x[n],h1[n] y h2[n], luego se
procedi a graficar las mismas. El cdigo de Matlab se lo puede revisar al final de este tema.

1. Como se modific la seal en el dominio del tiempo?

La seal se elev en ganancia de 0.5 a 4, adems la seal tiene una duracin ms larga en donde en el ltimo tramo
decrece casi hasta cero.

2. Como se modific la seal en el dominio de la frecuencia?

Se modifico ganancia de la misma adems parece haber ms ceros en las muestras, pero se puede evidenciar que
tiene la misma duracin de pi a pi.

3. Cul es su percepcin de la variacin del sonido original luego de haber pasado por el sistema con la respuesta al impulso
h[n]?

A la seal le ingresa ruido que se escucha claramente al fondo de la misma, adems la seal presente un aumento de volumen.

4. Cules son las longitudes de las secuencias: x[n], h[n] y y[n] = x[n] h[n] ? Escriba los clculos correspondientes que
justifiquen el porqu de la longitud de y[n].

En matlab se procedi a calcular la longitud total de las seales. Segn la teora la longitud de la convolucion debe ser longitud
de x(n) ms la longitud de h(n) menos uno.

lon_x_n = 320493 muestras

lon_h_1_n = 87635 muestras

Por lo tanto la longitud de y1(n) teora es 320493+87635 -1 dndonos 408127 muestras

Comparando con Matlab nos da:


Con lo que se concuerda que la longitud de y(n) es la misma tanto de forma teora como experimental.

Figure 9 Grafica de convolucion x[n]*h2[n] en el dominio del Tiempo

4
x 10 Grafica de Convolucion x(n)*h2(n) en Frecuencia
4

3.5

2.5

1.5

0.5

0
-4 -3 -2 -1 0 1 2 3 4

Figure 10 Grafica de convolucion x[n]*h2[n] en el dominio de la frecuencia.

Las Figure 10 y 11 muestran las grficas de las convolucion entre x[n] y h2[n], as mismo se muestrearon las seales
descritas con audioread y se procedi a convolucionar con conv, y luego a grafica tanto en el tiempo como en
frecuencia. Se puede evidenciar que en el dominio de la frecuencia la seal no difiere mucho de la seal de ingreso
x[n].
Como se modific la seal en el dominio del tiempo?

La seal se eleva en ganancia adems se presentan ms picos en la seal.

Como se modific la seal en el dominio de la frecuencia?

La seal tiene ms amplitud pero tiene casi la misma forma de la original.

Cul es su percepcin de la variacin del sonido original luego de haber pasado por el sistema con la respuesta al impulso
h[n]?

Presenta ruido, su volumen aumento considerablemente.

Cules son las longitudes de las secuencias: x[n], h[n] y y[n] = x[n] h[n] ? Escriba los clculos correspondientes que
justifiquen el porqu de la longitud de y[n].

En Matlab se procedi a calcular la longitud total de las seales. Segn la teora la longitud de la convolucion debe ser longitud
de x(n) ms la longitud de h(n) menos uno.

lon_x_n = 320493 muestras

lon_h_2_n = 46338 muestras

Por lo tanto la longitud de y1(n) teora es 320493+46338 -1 dndonos 366830 muestras.

Comparando con Matlab nos da:

Como se aprecia tericamente y experimentalmente se obtiene el mismo nmero de muestras.

Cdigo en Matlab:

%%Universidad de Cuenca
%%Carlos Guerrero
%%1.2 Audios
close all
clear all
clc
%load handel

%Read stereo audio file


%%Primero la x[n]
[x,Fs]=audioread('CelloS.wav');
%%Primer Impulso
[h1,Fs1]=audioread('Rays.wav');
%%Segundo Impulso
[h2,Fs2]=audioread('Trig Room.wav');
%storing only one channel in x1:
x1 = x(:,2);
h_1 = h1(:,2);
h_2 = h2(:,2);
%playing audio file
sound(x1,Fs);
%%Primera convolucion
pause(5)
y_n_1= conv(x1,h_1);
sound(y_n_1,Fs);
%pause(3)
%%********************Grafico de x1(n)***************
y_n_2=conv(x1,h_2);
pause(5)
sound(y_n_2,Fs);
%%Grafica x(n)
figure(1)
stem(x1,'red')
title('Grafica de x[n] ')
%%*************Grafica X(w)********
figure(2)
X_w = abs(fftshift(fft(x1)));
plot(-pi: 2*pi/length(X_w): pi-2*pi/length(X_w),X_w)
title('Grafica de X(w) ')
%%********************Grafico de h1(n)***************
figure(3)
stem(h_1,'red')
title('Grafica de h1[n] ')
%%********************Grafico de H1(w)***************
figure(4)
X_w = abs(fftshift(fft(h_1)));
plot(-pi: 2*pi/length(X_w): pi-2*pi/length(X_w),X_w)
title('Grafica de H1(w) ')
%%********************Grafico de h2(n)***************
figure(5)
stem(h_2,'red')
title('Grafica de h2[n] ')
%%********************Grafico de H2(w)***************
figure(6)
X_w = abs(fftshift(fft(h_2)));
plot(-pi: 2*pi/length(X_w): pi-2*pi/length(X_w),X_w)
title('Grafica de H2(w) ')
%%********************Grafico de Convolucion x(n)*h1(n)***************
figure(7)
stem(y_n_1,'black')
title('Grafica de Convolucion x(n)*h1(n) ')
%%********************Grafico de Convolucion x(n)*h1(n) en frecuencia***************
figure(8)
X_w = abs(fftshift(fft(y_n_1)));
plot(-pi: 2*pi/length(X_w): pi-2*pi/length(X_w),X_w)
title('Grafica de Convolucion x(n)*h1(n) en Frecuencia ')
%%********************Grafico de Convolucion x(n)*h1(n)***************
figure(9)
stem(y_n_2,'black')
title('Grafica de Convolucion x(n)*h2(n) ')
%%********************Grafico de H2(w)***************
figure(10)
X_w = abs(fftshift(fft(y_n_1)));
plot(-pi: 2*pi/length(X_w): pi-2*pi/length(X_w),X_w)
title('Grafica de Convolucion x(n)*h2(n) en Frecuencia ')
%%Calculo de la longitudes
lon_x_n=length(x1)
lon_h_1_n=length(h_1)
lon_h_2_n=length(h_2)
lon_y_n_1=length(y_n_1)
lon_y_n_2=length(y_n_2)
1.3. Moving Average Filter

Visualice las tres seales en el dominio del tiempo: 1) audio, 2) audio con ruido y 3) seal filtrada.
Senal de Audio
0.5

0.4

0.3

0.2

0.1

-0.1

-0.2

-0.3

-0.4
0 0.5 1 1.5 2 2.5 3 3.5
5
x 10

Figure 11 Seal de audio

Grfico de la seal de audio Celos.wav realizada con la funcin audioread.

Senal de Ruido
0.05

0.04

0.03

0.02

0.01

-0.01

-0.02

-0.03

-0.04

-0.05
0 0.5 1 1.5 2 2.5 3 3.5
5
x 10

Figure 12 Seal de Ruido

Generacin de la seal de ruido con la funcin randn con longitud de la seal Celos.wav, con atenuacin de 0.01
Figure 13 Seal de audio con ruido.

Grafica de la seal de Ruido sumada a la seal de ingreso x[n](Celos.wav).

Figure 14 Seal Filtrada con ventana de 5 muestras.

Grafica de la seal filtrada con el filtro de promedio mvil con una ventana de 5 muestras, se puede notar una seal
muy parecida a la original.
Figure 15 Seal Filtrada con ventana de 10 muestras.

Grafica de la seal filtrada con el filtro de promedio mvil con una ventana de 10 muestras, se puede notar un
pequeo decremento en la amplitud, pero es muy similar a la original.

Figure 16 Seal Filtrada con ventana de 20 muestras.

Grafica de la seal filtrada con el filtro de promedio mvil con una ventana de 20 muestras.
Figure 17 Seal Filtrada con ventana de 50 muestras.

Grafica de la seal filtrada con el filtro de promedio mvil con una ventana de 50 muestras.

Figure 18 Seal Filtrada con ventana de 100 muestras.

Grafica de la seal filtrada con el filtro de promedio mvil con una ventana de 100 muestras.

Para las siguientes graficas la seal de rojo corresponde a la filtrada, la de azul a la seal con ruido y la de color
negro corresponde a la seal de ingreso.
Figure 19 Grafica de Seales de Audio, Audio con ruido y audio filtrado con ventana de 5 muestras.

Se puede notar que la seal filtrada(rojo) es muy parecida a la seal ruidosa, pero se puede evidenciar en algunas
partes que no le toma de la manera ms adecuada.

Figure 20 Grafica de Seales de Audio, Audio con ruido y audio filtrado con ventana de 10 muestras.

En la Figure 21 se puede evidenciar que la seal de filtrado(rojo) con una ventana de 20 sigue la tendencia de la
ruidosa pero de menor amplitud, siendo la mejor aproximacin.
Figure 21 Grafica de Seales de Audio, Audio con ruido y audio filtrado con ventana de 20 muestras.

En esta grafica se puede notar que se ha perdido mucha informacin debido al nmero de muestras de la ventana,
adems se ve claramente que la amplitud de la seal se ha reducido.

Figure 22 Grafica de Seales de Audio, Audio con ruido y audio filtrado con ventana de 50 muestras.

Se nota claramente que se perdido mucha informacin con este tamao de ventana, adems su amplitud se reduce
nuevamente comparada con la ventana de 20 muestras.
Figure 23 Grafica de Seales de Audio, Audio con ruido y audio filtrado con ventana de 100 muestras.

En la grfica se muestra que la seal filtrada (rojo) ha reducido drsticamente su amplitud y no se parece en nada a
la seal ruidosa.

1. Se produjo una mejora sustancial en el audio tras la aplicacin del filtro de promediado mvil? Explique
sus percepciones.

Si la seal ha mejorado bastante el ruido se ha reducido, pero todava existo el mismo en la seal.

2. Cul es la influencia del tamao de la ventana sobre el resultado del filtrado?

El filtro de promediado mvil tiene como objetivo obtener un promedio de la seal en un tamao de ventana
determinado, si la ventana es pequea se obtiene un promedio muy parecido a la seal de ingreso eliminando as el
ruido.

Pero al ser ms amplia la ventana en el promedio se toma diferentes valores ya no los ms cercanos haciendo que la
seal quede muy distorsionada.

3. Cul es el tamao de ventana que brinda los mejores resultados? Justifique su respuesta.

Con la ventana de 10 muestras se encontr un mejor audio, casi sin ruido, segn la grfica muestra una seal filtrada
de menor tamao que la original.

4. Por qu una ventana ms grande tiende a resultar en un sonido ms opaco?

Debido a que el filtro es un promedio de las muestras , al ser la ventana de gran tamao el promedio de las
mismas va ser de menor tamao siempre haciendo que la seal decrezca en amplitud.

5. El filtro tiene el mismo efecto en la mejora del audio si el ruido agregado a la seal original se incrementa
considerablemente? Por ejemplo, con un coeficiente de 0.1.

No debido a que la seal de ruido es mucho mayor que la seal de ingreso haciendo que se escuche solo la seal de ruido es decir el filtro
ya no es efectivo.

Cdigo en Matlab
%%Universidad de Cuenca
%%Carlos Guerrero
%%1.3 Audios
close all
clear all
clc
%load handel

%Read stereo audio file


%%Primero la x[n]
[x,Fs]=audioread('CelloS.wav');
%storing only one channel in x1:
x1 = x(:,2);
figure(1)
plot(x1,'red')
title('Senal de Audio')
%%generacion de ruido
ruido=0.01*randn(1,length(x1));
figure(2)
plot(ruido)
title('Senal de Ruido')
figure(3)
ruidosa=x1+ruido'
%sound(ruidosa,Fs)
stem(ruidosa,'blue')
title('Senal de Audio con ruido')
%%Implememntacion filtro promediado movil
M=5;
for n=1:(length(ruidosa)- M)
y(n)=(1/M)*sum(ruidosa(n:n+M-1));
end
sound(y,Fs)
figure(4)
stem(y,'black')
title('Senal Filtrada con ventana de 5 muestras')
%%*******Muestras********
pause(5)
M=10;
for n=1:(length(ruidosa)- M)
y_10(n)=(1/M)*sum(ruidosa(n:n+M-1));
end
sound(y_10,Fs)
figure(5)
stem(y_10,'black')
title('Ventana de 10 muestras')
%%Muestas
M=20;
for n=1:(length(ruidosa)- M)
y_20(n)=(1/M)*sum(ruidosa(n:n+M-1));
end
figure(7)
stem(y_20,'black')
title('Ventana de 20 muestras')
%%Muestas
M=50;
for n=1:(length(ruidosa)- M)
y_50(n)=(1/M)*sum(ruidosa(n:n+M-1));
end
figure(8)
stem(y,'black')
title('Ventana de 50 muestras')
%%Muestas
pause(5)
M=100;
for n=1:(length(ruidosa)- M)
y_100(n)=(1/M)*sum(ruidosa(n:n+M-1));
end
sound(y_100,Fs)
figure(9)
stem(y_100,'black')
title('Ventana de 100 muestras')
%%******************Tssssss 500 muestras******Ventana de 5
figure(10)
stem(x1,'black')
hold on
stem(ruidosa,'blue')
hold on
stem(y,'red')
title('Mezcla de Senales con ventana de 5 muestras ')
xlim([0 499])
%%******************Tssssss 500 muestras******Ventana de 10
figure(11)
stem(x1,'black')
hold on
stem(ruidosa,'blue')
hold on
stem(y_10,'red')
title('Mezcla de Senales con ventana de 10 muestras ')
xlim([0 499])
%%******************Tssssss 500 muestras******Ventana de 20
figure(12)
stem(x1,'black')
hold on
stem(ruidosa,'blue')
hold on
stem(y_20,'red')
title('Mezcla de Senales con ventana de 20 muestras ')
xlim([0 499])
%%******************Tssssss 500 muestras******Ventana de 50
figure(13)
stem(x1,'black')
hold on
stem(ruidosa,'blue')
hold on
stem(y_50,'red')
title('Mezcla de Senales con ventana de 50 muestras ')
xlim([0 499])
%%******************Tssssss 500 muestras******Ventana de 100
figure(14)
stem(x1,'black')
hold on
stem(ruidosa,'blue')
hold on
stem(y_100,'red')
title('Mezcla de Senales con ventana de 100 muestras ')
xlim([0 499])

1.4. Conclusiones

- Se pudo evidenciar de manera prctica lo aprendido en clases acerca de la convolucion de seales, adems al
plantear nuestra propia funcin se entendi como funciona la convolucion.

- Debido a que Matlab no trabaja con la posicin de cero en las matrices se hizo difcil realizar el cdigo para la
convolucion, pero con la ayuda de la bibliografa se lo pudo llevar a cabo.

- En Matlab se procedi a hacer las respuestas a impulsos de diferentes audios, logrando entender en que consiste
el procesamiento de audio tanto en el tiempo como en frecuencia.

- Las seales de audio que se obtuvieron luego de hacer la convolucion eran diferentes se introdujo ruido y se
amplificaron las seales, de manera que no se le escucha muy bien.
- La etapa del filtrado de promediado mvil es una eficiente alternativa consiste en sacar el promedio de un
numero tal de muestras hacia delante, de una posicin dada.

- El nmero de muestras promedio se debe elegir de acuerdo a cada seal, para la prctica con una ventana de 10
muestras el sonido mejoraba bastante.

- Adems se comprob que una ventana de tamao grande, hace que la seal se atenu demasiado ya que se pierde
mucha informacin al hacer el promedio de las seal.

1.4. Bibliografia

[1]Matlab Documentation, Conv, Disponible en: http://www.mathworks.com/help/matlab/ref/conv.html

[2] Steven W. Smith, The Scientist and Engineers Guide to Digital Signal Processing, www.dspguide.com, 1997-
2013.