Você está na página 1de 16

UNIVERSIDAD CATÓLICA DE SANTA MARÍA

ESCUELA PROFESIONAL DE INGENIERÍA ELECTRÓNICA


CÓDIGO : 7409222
GUÍA DE LABORATORIO NO 03
ASIGNATURA : PROCESAMIENTO DIGITAL DE SEÑALES

Docente (s):

SEGUNDA FASE Ing. Víctor Hugo Rivera Chávez.


Ing. Diana Valdivieso Herrera
PROCESAMIENTO DE SEÑALES DE AUDIO
Fecha: 2019.05.18.

Alumno DIAZ GONZALES JORGE LUIS


Grupo A

I. OBJETIVOS
 Procesar señales de audio
 Implementar efectos sobre dichas señales

II. ACTIVIDADES
 En base a las actividades realizadas y sus respuestas, realice sus conclusiones.
2.1 Crear y guardar un archivo de audio *.wav de al menos 30 seg de duración y frecuencia
de muestreo arriba de 11KHz.
[Y, FS]=audioread(filename) clear all
>> info = audioinfo(filename) clc
%grabar audio t=segundos
Fs=11025;
info = recObj =
audiorecorder(Fs,16,1);
Filename: disp('grabando....')
'C:\Users\jorge\Documents\MATLAB\ recordblocking(recObj,30)
disp('FIN DE LA
PRUEBA1-DSP.wav'
GRABACION...');
CompressionMethod: %REPRODUCCION DE LA GRABACION
'Uncompressed' play(recObj);
NumChannels: 1
SampleRate: 11025 reproduc1 =
TotalSamples: 330750 getaudiodata(recObj);
Duration: 30 plot(reproduc1)
title('Dominio del tiempo');
Title: []
Comment: [] %guardar audio
Artist: [] filename = 'PRUEBA1-DSP.wav';
BitsPerSample: 16 audiowrite(filename,reproduc1
>> tiempo = size(Y,1)/Fs ,11025);

tiempo =

30

2.2 Abra el archivo y cárguelo en un vector y, almacene también fs


[Y, FS]=audioread(filename)
%El vector ‘Y’ es demasiado extenso, asi que mostraremos solo el tamaño que
%se creo.

>> FS'

ans =

11025

2.3 Determinar el número de muestras N usando el comando length.

>> n_muestras=length(Y)
%se comprueba lo mencionado anteriormente ‘en el ejercicio 3.2’
n_muestras =

330750

2.4 Definir la mitad del número de muestras, redondee el número de muestras usando el
comando round.

>> mitad_n_muestras= n_muestras./2

mitad_n_muestras =

165375

>> mitad_n_muestrass=round(mitad_n_muestras)

mitad_n_muestrass =

165375

Para las siguientes preguntas, considere utilizar el comando subplot para graficar la señal en
el tiempo y frecuencia.

2.5 Graficar la señal en el tiempo y el espectro en frecuencias.


%grafica en el dominio del tiempo
figure(1)
plot(reproduc1)
title('Dominio del tiempo');
%Grafica en el dominio de la frecuencia
G=abs(fft(reproduc1));
figure(2)
plot((1:10000),G(1:10000),'k')
title('Dominio de la frecuencia');

%Graficando
2.6 Generar el efecto de reverberación
>> a=0.5; %Magnitud de la reverberacion n=330025;
>> R=5000; %Numero de muestras para el a=0.5; %Magnitud de la
efecto reverberacion
>> x=zeros(size(y)); R=5000; %Numero de muestras para
>> for i=1:1:R+1 el efecto
x(i) = y(i); %vector de efecto x=zeros(size(reproduc1));
for i=1:1:R+1
end
x(i) = reproduc1(i);
>> for i=R+1:1:n
%vector de efecto
x(i)= y(i)+ a*y(i-R); %sonido más efecto end
end; for i=R+1:1:n
>> sound(x,fs); x(i)= reproduc1(i)+
a*reproduc1(i-R); %sonido más
efecto
end;
sound(x,Fs);

%Grafica en el dominio de la
frecuencia
G1=abs(fft(x));
figure(2)
plot((1:10000),G1(1:10000),'k')
title('Dominio de la
frecuencia');

2.7 Repita el paso 6 con al menos dos valores diferentes de a y R, consigne en cada caso
los espectros en frecuencia, compare con el de la señal original, comente los
resultados obtenidos.
Para a =0.25 R =2500 n=330025;
a=0.25; %Magnitud de la
reverberacion
R=2500; %Numero de muestras
para el efecto
x=zeros(size(reproduc1));
for i=1:1:R+1
x(i) = reproduc1(i);
%vector de efecto
end
for i=R+1:1:n
x(i)= reproduc1(i)+
a*reproduc1(i-R); %sonido más
efecto
end;
sound(x,Fs);

%Grafica en el dominio de la
frecuencia
G1=abs(fft(x));
figure(2)
plot((1:10000),G1(1:10000),'k'
)
title('Dominio de la
frecuencia');
Para a =0.75 R = 7500 n=330025;
a=0.75; %Magnitud de la
reverberacion
R=7500; %Numero de muestras
para el efecto
x=zeros(size(reproduc1));
for i=1:1:R+1
x(i) = reproduc1(i);
%vector de efecto
end
for i=R+1:1:n
x(i)= reproduc1(i)+
a*reproduc1(i-R); %sonido más
efecto
end;
sound(x,Fs);

%Grafica en el dominio de la
frecuencia
G1=abs(fft(x));
figure(2)
plot((1:10000),G1(1:10000),'k'
)
title('Dominio de la
frecuencia');

2.8 Aplique un filtro pasa bajos de orden 30 con frecuencia de corte 0.20 (1/5 de Fs) y
ganancia 0.4
Wn = 0.20; %Frecuencia de Corte. }
>> Wn = 0.20; %Frecuencia de Corte.
N = 30; %Grado del filtro
}
LP = fir1(N,Wn); %filtro pasa bajos
>> N = 30; %Grado del filtro gLP = 0.4;
>> LP = fir1(N,Wn); %filtro pasa y1 = conv(LP,reproduc1); %
bajos Convolución señal y filtro
>> gLP = 0.4; fre=round(length(y1)/2);
>> y1 = conv(LP,y); % Convolución % Detector de Frec. medias de sonido
señal y filtro if 2*fre==length(y1)
>> fre=round(length(y1)/2); fd3=-fre;
>>% Detector de Frec. medias de fd4=fre-1;
sonido else 2*fre>length(y1)
>> if 2*fre==length(y1) fd3=1-fre;
fd3=-fre; fd4=fre-1;
end
fd4=fre-1;
yC= gLP * y1; %Señal por filtro pasa
else 2*fre>length(y1)
baja
fd3=1-fre; espectrobajos=abs(fftshift(fft(yC)));
fd4=fre-1; %frecuencias
end sound(yC,Fs);
>> yC= gLP * y1; %Señal por filtro
pasa baja
>>
espectrobajos=abs(fftshift(fft(yC)));
%frecuencias
>> sound(yC,fs);
2.9 Aplique un filtro pasabanda de orden 30 con frecuencias de corte 0.20 y 0.5 y
ganancia 1.5. Complete el código, tome como referencia la pregunta 2.8.
>> Wn1 = [0.20, 0.50]; Wn1 = [0.20, 0.50]; %Frecuencias de corte
%Frecuencias de corte BP = fir1(N,Wn1); %Filtro Pasa bandas
>> BP = fir1(N,Wn1); gBP = 1.5;
%Filtro Pasa bandas y2 = conv(BP,reproduc1); %convolucion señal y
>> gBP = 1.5; filtro
fre=round(length(y2)/2);
>> y2 = conv(BP,y);
% Detector de Frec. medias de sonido
%convolucion señal y
if 2*fre==length(y2)
filtro fd3=-fre;
>> fd4=fre-1;
fre=round(length(y2)/2 else 2*fre>length(y2)
); fd3=1-fre;
fd4=fre-1;
end
yB= gLP * y2; %Señal por filtro pasa banda
espectrobajos=abs(fftshift(fft(yB)));%frecuenc
ias
sound(yB,Fs);

2.10 Aplique un filtro pasaaltos de orden 30 con frecuencias de corte 0.5 y ganancia 1.5.
Complete el código, tome como referencia la pregunta 2.8.
Wn2 = .50; %Frecuencia de corte
>> Wn2 = .50; %Frecuencia de corte
HP = fir1(N,Wn2,'high');%filtro pasa
>> HP = fir1(N,Wn2,'high');%filtro
altas
pasa altas gHP = 1.5;
>> gHP = 1.5; y3 = conv(HP,reproduc1); %convolucion
>> y3 = conv(HP,y); %convolucion señal y filtro
señal y filtro fre=round(length(y3)/2);
>> yA= gHP * y3; %Señal por filtro % Detector de Frec. medias de sonido
pasa altas if 2*fre==length(y3)
>> fd3=-fre;
espectroaltas=abs(fftshift(fft(yA)));% fd4=fre-1;
frecuencias else 2*fre>length(y3)
>> sound(yA,fs); fd3=1-fre;
fd4=fre-1;
end

yA= gHP * y3; %Señal por filtro pasa


altas
espectroaltas=abs(fftshift(fft(yA)));
%frecuencias
sound(yA,Fs);

2.11 Recupere la señal original a partir de las señales filtradas


>> yD = yA + yB + yC; %Suma de yD = yA + yB + yC; %Suma de señales
señales filtradas filtradas
>> espectrotodo=abs(fftshift(fft(yD))); espectrotodo=abs(fftshift(fft(yD)));
>> sound(yD,fs); sound(yD,Fs);
>> fre=round(length(yD)/2 fre=round(length(yD)/2)
>> recup_senal_original
fre =
165390

2.12 Muestre los espectros en frecuencia de los filtros aplicados y de la señal original
subplot(4,1,1)
>> subplot(4,1,1)
plot(fd3:fd4,espectroaltas);
>> plot(fd3:fd4,espectroaltas);
>>
xlabel('Frecuencia');ylabel('Amplitud'
);
xlabel('Frecuencia');ylabel('Amplitud'
title('Señal en Frecuencia Pasa
);
Altas');
>> title('Señal en Frecuencia Pasa subplot(4,1,2)
Altas'); plot(fd3:fd4,espectrobanda,'r');
>> subplot(4,1,2) xlabel('Frecuencia');ylabel('Amplitud'
>> plot(fd3:fd4,espectrobanda,'r'); );
>> title('Señal en Frecuencia Pasa
xlabel('Frecuencia');ylabel('Amplitud' Banda');
); subplot(4,1,3)
>> title('Señal en Frecuencia Pasa plot(fd3:fd4,espectrobajos,'k');
Banda'); xlabel('Frecuencia');ylabel('Amplitud'
>> subplot(4,1,3) );
>> plot(fd3:fd4,espectrobajos,'k'); title('Señal en Frecuencia Pasa
Bajos');
>>
subplot(4,1,4)
xlabel('Frecuencia');ylabel('Amplitud'
plot(fd3:fd4,espectrotodo);
); xlabel('Frecuencia');ylabel('Amplitud'
>> title('Señal en Frecuencia Pasa )
Bajos'); title('Señal en Frecuencia Completa');
>> subplot(4,1,4)
>> plot(fd3:fd4,espectrotodo);
>>
xlabel('Frecuencia');ylabel('Amplitud'
)
>>title('Señal en Frecuencia
Completa');
2.13 Adicione ruido blanco gaussiano a la señal original y reprodúzcala nuevamente. Para
cada señal:
>> % y el vector de señal, N el % y el vector de señal, N el número de
número de muestras muestras
>> % P potencia del ruido. Considere % P potencia del ruido. Considere 2
2 valores para P valores para P
>> b=rand(length(y),1); P=0.5;
b=rand(length(reproduc1),1);
>> fi=2*pi*rand(length(y),1)
fi=2*pi*rand(length(reproduc1),1);
>> r=sqrt(-2*P*log(1-b)
r=sqrt(-2*P*log(1-b));
>> ruido=r.*cos(fi) ruido=r.*cos(fi);
>> yruido=y+ruido yruido=reproduc1+ruido;
>> sound(y,fs); sound(yruido,Fs);
>> ….
>> espectroruido=abs(fftshift(fft(yruido)
espectroruido=abs(fftshift(fft(yruido ));
))); [menor ,pri]=sort(espectroruido);
>> [menor pri]=sort(espectroruido); %Ordena espectro
%Ordena espectro if 2*fi==a % Detector de Frec. medias
>> if 2*fl==a % Detector de Frec. de sonido
medias de sonido fd1=-fi;
fd1=-fl; fd2=fi-1;
fd2=fl-1; else 2*fi>a
>> else 2*fl>a fd1=1-fi;
fd1=1-fl; fd2=fi-1;
end
fd2=fl-1;
end
>>….
a. Grafique y comente la señal original y la señal con ruido en el tiempo.
GRAFICA DE LA SEÑAL ORIGINAL (T) GRAFICA DE LA SEÑAL CON RUIDO (T) COMENTARIOS DE LAS
GRAFICAS
>> %grafica en el dominio del tiempo >> %grafica en el dominio del tiempo Es notorio que el ruido
blanco interviene en la
figure(1) figure(1)
señal original, y no se
plot(y) plot(yruido) logra distinguir de ella.
title('Dominio del tiempo'); title('Dominio del tiempo'); Crea una capa en la que
no se puede notar con
claridad la señal original

b. Grafique y comente el espectro en frecuencia de la señal original y la señal con


ruido
GRAFICAS ORIGINALES GRAFICAS CON RUIDO BLANCO COMENTARIOS DE CADA
GRAFICA
Sucederá lo mismo para todas
las gráficas de frecuencia, el
ruido creara una capa en la que
no se podrá distinguir las
distintas señales original,
pasabanda,pasabajos,pasaaltas

SEÑAL ORIGINAL SEÑAL ORIGINAL (modificada)


%Grafica en el dominio de la
frecuencia
GT1=abs(fft(yC));
figure(1)
plot((1:10000),GT1(1:10000),'k')
title('Dominio de la
frecuencia');

SEÑAL FILTRADA CON PASABAJOS

SEÑAL FILTRADA CON PASABAJOS


%Grafica en el dominio de la
frecuencia
GT2=abs(fft(yB));
figure(1)
plot((1:10000),GT2(1:10000),'k')
title('Dominio de la
frecuencia');

SEÑAL FILTRADA CON PASABANDA


SEÑAL FILTRADA CON PASABANDA
%Grafica en el dominio de la
frecuencia
GT3=abs(fft(yA));
figure(1)
plot((1:10000),GT3(1:10000),'k')
title('Dominio de la
frecuencia');

SEÑAL FILTARDA CON PASALTOS

SEÑAL FILTARDA CON PASALTOS

III. CONCLUSIONES (Verifique sus respuestas y elabore al menos 4 conclusiones.)


 Es muy útil poder elaborar filtros en matlab digitalmente, ya que simplificamos de
manera muy rápida muchos pasos, si lo elaboramos con circuitos como OPAM y entre
otros
 Existen comandos que atajan varios pasos para la grabación y reproducción de audio,
como audiorecorder,audiorecord, entre otros.
 La reverberación se parece mucho a un desfasador en la señal, que se logra escuchar
como un eco lejano.
 Poder manejar la señal en ida y vuelta resulta muy conveniente y es un beneficio muy
grande para filtros digitales, ya que podemos manejarla en su origen, en el proceso, y
volverla a reconstruirla al final.

IV. CUESTIONARIO FINAL


4.1 Investigue sobre sistemas LTI filtros ideales y represente graficamente los cuatro tipo de
filtros básicos.
SISTEMAS LTI FILTROS IDEALES:

Si el objetivo del sistema LTI es dejar pasar selectivamente un rango de frecuencias


determinado, se le denomina filtro.

Se denomina filtro ideal aquel que cumple:


Su ganancia (| H(F)|) es constante en la banda de paso y cero fuera de ella.
Su respuesta de fase (arg(H(F))) es lineal.
Si la señal de entrada sólo tiene frecuencias en .

Las respuestas en frecuencia de los 4 filtros ideales en el rango de [-π π] son:

4.2 Investigue sobre diseño de filtros como se puede convertir un filtro pasa bajos en uno
pasa altos. Fundamente su respuesta.
Yo creo que se puede diseñar por lo menos en el entorno de matlab con 1 simple
comandos. “Fir1”

LP = fir1(N,WnBajos); %filtro pasa bajos


De donde usamos : para filtros pasabajos
b = fir1(n,Wn)
donde:
n-> grado del filtro
Wn -> frecuencia de muestreo
Y Para un filtro pasaaltos
b = fir1(n,Wn,ftype)
en ftype se coloca ‘high’ para filtros pasaAltos
y asi se pasaria de un filtro a otro.

4.3 Diseñe un ecualiazador digital de tres bandas y realice las evaluaciones correspondietes
con tres señales de audio diferentes. (Deberá probarlo en el laboratorio)

%PROGRAMA ECUALIZADOR DE 3 BANDAS


%AUTOR: DIAZ GONZALES JORGE LUIS
%CURSO: PROCESAMIENTO DIGITAL DE SEÑALES
%FECHA ELABORADA: 03/05/2019
function
[]=ECUALIZADOR_3_BANDAS(Fs,song,WnBajos,N,gLP,WnBanda,gBP,WnAltos,gHP)

%Fs -> frecuencia de muestreo , ejem: 11025 ,16025, etc ... (hz)
%song -> aqui se introduce la señal de auidio , ejm: 'song1.wav'
%WnBajos -> Frecuencia de Corte filtropasaBajos
%N -> Grado del filtro a usar
%gLP -> Ganancia filtro pasabajos
%WnBanda -> frecuencia de corte filtropasaBanda
%gBP -> ganancia del filtro pasaBanda
%WnAltos -> Frecuencia de corte filtropasaAltos
%gHP -> ganancia del filtropasaAltos

%.................-------------------...............................

%...........------Etapa de seleccion-------
................................

disp('seleccionar GRABAR o REPRODUCIR : ');


s1=input('escribe "0 = grabar" , "1 = reproducir"\n');

%........-------Grabar audio O Reproducir un audio ya hecho-----


..........

for i=1:1
if s1==0
recObj = audiorecorder(Fs,16,1);
disp('grabando....');
recordblocking(recObj,10)
disp('FIN DE LA GRABACION...');

%REPRODUCCION DE LA GRABACION
play(recObj);
reproduc1 = getaudiodata(recObj);

%guardar audio
grabado=('audio1.wav');
audiowrite(grabado,reproduc1,Fs);

%reproducir audio grabado


[Y1, FS1]=audioread(grabado);
sound(Y1,FS1);
else
end
end

if s1==1
%reproducir audio externo
[reproduc1, FS1]=audioread(song);
sound(reproduc1,FS1);
else
end

%..........------Etapa para escojer la señal a ecualizar---------


..........
%...........------Etapa de seleccion de filtros-------
.....................

%constantes:
yA=0;
yB=0;
yC=0;

for i=1:3
disp('seleccionar que filtro usar: ');
selector=input('escribe 0 = pasabajos , 1 = pasabanda , 2 = pasaltas
, 3 = no ejecutar ningun filtro \n');

if selector == 3
disp('SALTO AL VACIO :p');
else
end
%------------------------------------------------------------------------
%.........--------EJECUCION del filtro pasabajos------...................

if selector==0
LP = fir1(N,WnBajos); %filtro pasa bajos
y1 = conv(LP,reproduc1); % Convolución señal y filtro
fre=round(length(y1)/2);
% Detector de Frec. medias de sonido
if 2*fre==length(y1)
fd3=-fre;
fd4=fre-1;
else 2*fre>length(y1)
fd3=1-fre;
fd4=fre-1;
end
yC= gLP * y1; %Señal por filtro pasa baja
espectrobajos=abs(fftshift(fft(yC)));%frecuencias
sound(yC,Fs);
fre=round(length(yC)/2);
%Grafica en el dominio de la frecuencia (FILTROPASABAJOS)
subplot(4,1,3)
plot(fd3:fd4,espectrobajos,'k');
xlabel('Frecuencia');ylabel('Amplitud');
title('Señal en Frecuencia Pasa Bajos');

else

end
%------------------------------------------------------------------------

%.........--------EJECUCION del filtro pasaBanda------...................

%WnBanda ->Frecuencias de corte


% ganancia ->gBP

if(selector==1)
BP = fir1(N,WnBanda); %Filtro Pasa bandas
y2 = conv(BP,reproduc1); %convolucion señal y filtro
fre=round(length(y2)/2);
% Detector de Frec. medias de sonido
if 2*fre==length(y2)
fd3=-fre;
fd4=fre-1;
else 2*fre>length(y2)
fd3=1-fre;
fd4=fre-1;
end
yB= gBP * y2; %Señal por filtro pasa banda
espectrobanda=abs(fftshift(fft(yB)));%frecuencias
sound(yB,Fs);
fre=round(length(yB)/2);

%Grafica en el dominio de la frecuencia (FILTROPASABANDA)

subplot(4,1,2)
plot(fd3:fd4,espectrobanda,'r');
xlabel('Frecuencia');ylabel('Amplitud');
title('Señal en Frecuencia Pasa Banda');

else

end
%------------------------------------------------------------------------
%.........--------EJECUCION del filtro pasaAltos------...................

%WnAltos -> Frecuencia de corte


%gHP -> Ganancia

if selector==2
HP = fir1(N,WnAltos,'high');%filtro pasa altas
y3 = conv(HP,reproduc1); %convolucion señal y filtro
fre=round(length(y3)/2);

% Detector de Frec. medias de sonido


if 2*fre==length(y3)
fd3=-fre;
fd4=fre-1;
else 2*fre>length(y3)
fd3=1-fre;
fd4=fre-1;
end

yA= gHP * y3; %Señal por filtro pasa altas


espectroaltas=abs(fftshift(fft(yA)));%frecuencias
sound(yA,Fs);
fre=round(length(yA)/2);

%Grafica en el dominio de la frecuencia (FILTROPASAALTOS)


subplot(4,1,1)
plot(fd3:fd4,espectroaltas);
xlabel('Frecuencia');ylabel('Amplitud');
title('Señal en Frecuencia Pasa Altas');

else
end
end
%......................................................................
%------------Eleccion para reconstruir la señal nuevamente-------------
disp('ELIGE SI ECUALIZAMOS LAS SEÑALES:');
s2=input('SI = 1" , "NO = 0 "\n');

if s2==1
%Etapa de reconstruccion de la señal
yD= yA + yB + yC ;
espectrotodo=abs(fftshift(fft(yD)));
sound(yD,Fs);
fre=round(length(yD)/2);

%Grafica en el dominio de la frecuencia (SEÑAL


RECONSTRUIDA)

subplot(4,1,4)
plot(fd3:fd4,espectrotodo);
xlabel('Frecuencia');ylabel('Amplitud')
title('Señal en Frecuencia ECUALIZADA');

disp('FIN DEL PROGRAMA . "GRACIAS POR EJECUTARME, HASTA


LUEGO"');
else s2==0
disp('FIN DEL PROGRAMA . "GRACIAS POR EJECUTARME, HASTA
LUEGO"');
end
end

%EJECUCION DEL PROGRAMA IMPLEMENTADO:

>> ECUALIZADOR_3_BANDAS(11025,'Khalid.wav',0.2,30,0.4,[0.20, 0.50],1.5,0.50,1.5)


seleccionar GRABAR o REPRODUCIR :
escribe "0 = grabar" , "1 = reproducir"
1
seleccionar que filtro usar:
escribe 0 = pasabajos , 1 = pasabanda , 2 = pasaltas , 3 = no ejecutar ningun filtro
0
seleccionar que filtro usar:
escribe 0 = pasabajos , 1 = pasabanda , 2 = pasaltas , 3 = no ejecutar ningun filtro
1
seleccionar que filtro usar:
escribe 0 = pasabajos , 1 = pasabanda , 2 = pasaltas , 3 = no ejecutar ningun filtro
2
ELIGE SI ECUALIZAMOS LAS SEÑALES:
SI = 1" , "NO = 0 "
1
FIN DEL PROGRAMA . "GRACIAS POR EJECUTARME, HASTA LUEGO"
>>

Você também pode gostar