Você está na página 1de 28

UNIVERSIDAD CATOLICA DE SANTA MARIA

ACULTAD DE CIENCIAS E INGENIERIAS FÍSICAS Y

FORMALES PROGRAMA PROFESIONAL DE INGENIERIA

ELECTRÓNICA

PROCESAMIENTO DIGITAL DE SEÑALES


INFORME FINAL

“PRACTICA 3: PROCESAMIENTO DE SEÑALES DE


AUDIO”
ALUMNO:

MAMANI QUINCHO ALEX


Docente:
Ing. DIANA VALDIESO HERRERA

GRUPO DE PRACTICA 04

Arequipa – Perú
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.20.

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

II. CUESTIONARIO PREVIO

1) Revise los comandos de MatLab que se usan para procesar audio


2) Explique los pasos a seguir para diseñar un Filtro Digital
3) Revise los comandos de MatLab que se usan para el diseño de Filtros Digitales.

III. ACTIVIDADES
 Al finalizar la práctica realice una tabla indicando los comandos utilizados, sintaxis y
preguntas donde fueron aplicadas.
 En base a las actividades realizadas y sus respuestas, realice sus conclusiones.
3.1 Crear y guardar un archivo de audio *.wav de al menos 30 seg de duración y frecuencia
de muestreo arriba de 11KHz.
Programa para grabar audio en tiempo real:

>> fs=11025; Borre este código y coloque la


>> t=twavrecord(30*fs,fs); captura de pantalla del programa
implementado en Matlab.
>> sound(y,fs)
>> wavwrite(t,fs,'ejemplo.wav')
Ventana de Comando matlab:

Sintaxis Usada:

Señal en el Dominio del Tiempo Obtenida después de la grabación:


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

Programa Matlab

Vectores creados

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

Programa Matlab

Comprobación en los datos obtenidos después de la grabación:


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

Programa Malab
Numero de muestras = 330750
Mitad del número de muestras = 165375

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

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


Programa Matlab:

Graficando:
3.6 Generar el efecto de reverberación
>> a=0.5; %Magnitud de la reverberacion Borre este código y
>> R=5000; %Numero de muestras para el efecto coloque la captura de
>> x=zeros(size(y)); pantalla del programa
>> for i=1:1:R+1 implementado en Matlab.
x(i) = y(i); %vector de efecto
end
>> for i=R+1:1:n
x(i)= y(i)+ a*y(i-R); %sonido más efecto
end;
>> sound(x,fs);

Programa en matlab:

Grafica obtenida:
3.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 =2 R =3000
Grafica en el Dominio del Tiempo :

Espectro de la Frecuencia :
Para a =4 R =8000
Señal en el dominio del Tiempo

Señal en el Dominio de la Frecuencia :


3.8 Aplique un filtro pasa bajos de orden 30 con frecuencia de corte 0.20 (1/5 de Fs) y
ganancia 0.4

Programa en Matlab:
Señales Obtenidas en el Dominio del Tiempo :

Señales obtenidas en el dominio de la Frecuencia:


3.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.
Código Implementado:

Señal en el Dominio del Tiempo Obtenido:


Señal en el Dominio de la Frecuencia Obtenido:

3.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.
Código Implementado:
Señal en el dominio del Tiempo:

Señal en el Dominio de la Frecuencia


3.11 Recupere la señal original a partir de las señales filtradas
>> yD = yA + yB + yC; %Suma de señales filtradas Borre este código y coloque la captura de
>> espectrotodo=abs(fftshift(fft(yD))); pantalla del programa implementado en
>> sound(yD,fs); Matlab
>> fre=round(length(yD)/2

Codigo en matlab:

Señales Obtenidas en el Domio del tiempo en la Frecuencia:


3.12 Muestre los espectros en frecuencia de los filtros aplicados y de la señal original

Función implementada:

Ventana de Comando Matlab:


3.13 Adicione ruido blanco gaussiano a la señal original y reprodúzcala nuevamente. Para
cada señal:

a. Grafique y comente la señal original y la señal con ruido en el tiempo.

El ruido blanco gaussiano se superpones a la señal original haciendo que señal se


distorsione pero esto solo es notorio en la gráfica pero cuando se escucha el Audio el
ruido no es muy notorio
b. Grafique y comente el espectro en frecuencia de la señal original y la señal con
ruido.

El ruido gaussiano se superpone a la señal pero no se superpone para una amplitud alta
como lo muestra el grafico es decir el ruido es de baja amplitud no afectando a la señal
original cuando posee una amplitud elevada
IV. CONCLUSIONES

V. En la prueba de Eco podemos ver que a frecuencias altas el eco se hace más notorio
(ver paso 3.6) aumentado en parámetro R=10000 y aumentando la ganancia del eco
se pudo corroborar que el eco se hacia mas notorio (ver gráficas punto 3.6)

VI. Mediante el comando ffshift y fft podemos hallar la transformada desplazada de


Fourier y la transformada rápida de Fourier.

VII. Al Realizar el procesamiento de la señal es decir usar filtros pasa bajos (PB) pasa
Altos (PA) y pasa banda (PB) pudimos corroborar que la suma de las tres señales
independientes era la señal resultante o la señal original de audio

VIII. Al aplica el ruido blanco gaussiano a nuestra señal original no se puedo apreciar el
efecto mediante el sonido (parlantes) pero viendo la señal en el dominio del tiempo
pudimos apreciar que el ruido se superpone a nuestra señal original
IX. Para poder representar una señal analógica (señal de Audio ) en el dominio de la
frecuencia tenemos que usar la transformada discreta de Fourier
X. CUESTIONARIO FINAL
10.1 Investigue sobre sistemas LTI filtros ideales y represente graficamente los cuatro
tipo de filtros básicos.

En Conclusion sobre Filtros Ideales:


Podemos mencionar lo siguiente acerca de la respuesta al impulso de un filtro
ideal.
 no es absolutamente sumable.
 no es casual, y es de doble longitud infinita
 Los otros tres filtros también son caracterizados por ser doble mente
infinitos, con respuesta al impulso no causal y estos tampoco son
absolutamente sumables.
 Por lo tanto, los filtros ideales con respuestas en frecuencia de forma
rectangular no pueden ser realizados con un filtro LTI de dimensiones
finitas.
2 Filtros IIR y FIR
Los filtros IIR (Infinite Impulse Response o Respuesta al Impulso Infinito) y los filtros FIR
(Finite Impulse Response o Respuesta al Impulso Finito) constituyen las dos grandes
clasificaciones de los sistemas discretos en general, los cuales requieren estudiarse por
separado debido a sus características particulares y a los métodos de análisis y diseño que
son propios de cada uno de ellos. En esta sección se presentan brevemente y en forma
comparativa, algunos de los conceptos más importantes relacionados con dichos filtros,
los cuales pueden servir como un primer paso en la selección y diseño de éstos de acuerdo
a la aplicación específica.
4.2.1 Selección de filtros IIR y FIR
En el dominio de la frecuencia, si la linealidad de la fase es el factor más importante en el
comportamiento del filtro que se va a diseñar, un filtro FIR es la opción adecuada, que
además tiene la ventaja de ser estable con coeficientes cuantificados. De no ser así,
conviene usar un filtro IIR, ya que en la mayoría de los casos el orden del filtro será menor
que el del FIR equivalente.

10.2 Investigue sobre diseño de filtros como se puede convertir un filtro pasa
bajos en uno pasa altos. Fundamente su respuesta.

Para el diseño de filtros digitales IIR, se utilizan siempre como prototipos de diseño, filtros
analógicos pasa-bajo normalizados, por lo que el filtro digital resultante también es
pasabajo. Esto es así por la facilidad que representa el diseño de dichos filtros digitales a
partir de filtros analógicos pasa-bajo prototipos, para los cuales existen funciones de
transferencia normalizadas, ecuaciones y tablas de coordenadas de polos y ceros, y familias
de curvas normalizadas para cada tipo de respuesta (Butterworth, Chebyshev, Bessel,
Gaussian, elípticos, etc).
Al diseñar un filtro es necesario, por lo tanto, modificar las características de éste para
satisfacer las especificaciones iniciales de diseño. Estas modificaciones se realizan en dos
fases: transformar el filtro pasa-bajo diseñado en el tipo de filtro requerido, y
desnormalizar los valores originales del diseño de dicho filtro pasa-bajo.
Las transformaciones que se pueden realizar del filtro pasa-bajo prototipo son las
siguientes:
1. pasa-bajo a pasa-bajo.
2. pasa-bajo a pasa-alto.
3. pasa-bajo a pasa-banda.
Circuito Base : Filtro Pasa Bajas :

Una vez obtenidos los elementos del prototipo del filtro pasabajos es decir ya normalizado
con tablas estos tienen que ser transformados en elementos pasivos reales mediante las
siguientes relaciones :

Filtro pasa Altos Normalizado :


10.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?
function varargout = proyecto_dsp(varargin)
% Programa original:
% http://www.mathworks.com/matlabcentral/fileexchange/3719-simulink-
stereo-player-featuring-vocal-remover
% Desarrollado por: Ansuman Barik
% Traducción al español y modificación: Diego Barragán G.
% www.matpic.com
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @proyecto_dsp_OpeningFcn, ...
'gui_OutputFcn', @proyecto_dsp_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin & isstr(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before proyecto_dsp is made visible.

function proyecto_dsp_OpeningFcn(hObject, eventdata, handles, varargin)


%*-*-*-*-*CONDICIONES INICIALES-*-*-*-*-*-*-*-*-*
%Centrar la interfaz
movegui(hObject,'center')
%*******************
%Deshabilitar botones de mando
set(handles.reproducir,'Enable','off');
set(handles.pausa,'Enable','off');
set(handles.continuar,'Enable','off');
set(handles.parar,'Enable','off');
handles.output = hObject;
find_system('Name','modelo');%Buscar el modelo en el path
open_system('modelo');%Abrir el modelo
set_param('modelo/volumen','Value','0.4');%Setear el volumen en 0.4
set_param('modelo/selector','Value','7'); % Tema original por defecto
set_param('modelo/grabare','Value','0'); % Grabar OFF
% Valores iniciales de canales L y R
set_param('modelo/L','Gain','0.5');
set_param('modelo/R','Gain','0.5');
% Update handles structure
guidata(hObject, handles);
%*-*-*-*-*-FIN DE CONDICIONES INICIALES-*-*-*-*-*-*-

function varargout = proyecto_dsp_OutputFcn(hObject, eventdata, handles)


varargout{1} = handles.output;

% *-------------E F E C T O S------------------------------
function tema_original_Callback(hObject, eventdata, handles)
%Reproducir tema original
set_param('modelo/selector','Value','7');
set(handles.el_efecto,'String','Tema original')

function ecualizador_Callback(hObject, eventdata, handles)


%Acrivar ecualizador
set_param('modelo/selector','Value','2');
set(handles.el_efecto,'String','Ecualizador')

function reverb_Callback(hObject, eventdata, handles)


%Efecto de REVERVERACIÓN
set_param('modelo/selector','Value','1')
set(handles.el_efecto,'String','Reverberación')

function coro_Callback(hObject, eventdata, handles)


%Efecto de CORO
set_param('modelo/selector','Value','5')
set(handles.el_efecto,'String','Coro')

function eco_Callback(hObject, eventdata, handles)


%Efecto de ECO
set_param('modelo/selector','Value','6')
set(handles.el_efecto,'String','Eco')

function bajos_Callback(hObject, eventdata, handles)


%Selecciona el efecto de BAJOS de la señal
set_param('modelo/selector','Value','3')
set(handles.el_efecto,'String','Bajos')

function agudos_Callback(hObject, eventdata, handles)


%Selecciona el efecto de agudos de la señal
set_param('modelo/selector','Value','4')
set(handles.el_efecto,'String','Agudos')

%**********************ECUALIZADOR--------------------------------
function freq1_Callback(h, eventdata, handles)
amplitud=get(h,'Value');
set_param('modelo/ecualizador/Gain','dB',num2str(amplitud));
set(handles.indic_1,'String',round(amplitud));

function freq2_Callback(h, eventdata, handles)


amplitud=get(h,'Value');
set_param('modelo/ecualizador/Gain1','dB',num2str(amplitud));
set(handles.indic_2,'String',round(amplitud));

function freq3_Callback(h, eventdata, handles)


amplitud=get(h,'Value');
set_param('modelo/ecualizador/Gain2','dB',num2str(amplitud));
set(handles.indic_3,'String',round(amplitud));

function freq4_Callback(h, eventdata, handles)


amplitud=get(h,'Value');
set_param('modelo/ecualizador/Gain3','dB',num2str(amplitud));
set(handles.indic_4,'String',round(amplitud));

function freq5_Callback(h, eventdata, handles)


amplitud=get(h,'Value');
set_param('modelo/ecualizador/Gain4','dB',num2str(amplitud));
set(handles.indic_5,'String',round(amplitud));
function freq10_Callback(h, eventdata, handles)
amplitud=get(h,'Value');
set_param('modelo/ecualizador/Gain9','dB',num2str(amplitud));
set(handles.indic_6,'String',round(amplitud));

function freq11_Callback(h, eventdata, handles)


amplitud=get(h,'Value');
set_param('modelo/ecualizador/Gain10','dB',num2str(amplitud));
set(handles.indic_7,'String',round(amplitud));

function freq12_Callback(h, eventdata, handles)


amplitud=get(h,'Value');
set_param('modelo/ecualizador/Gain11','dB',num2str(amplitud));
set(handles.indic_8,'String',round(amplitud));

function freq13_Callback(h, eventdata, handles)


amplitud=get(h,'Value');
set_param('modelo/ecualizador/Gain12','dB',num2str(amplitud));
set(handles.indic_9,'String',round(amplitud));

function freq14_Callback(h, eventdata, handles)


amplitud=get(h,'Value');
set_param('modelo/ecualizador/Gain13','dB',num2str(amplitud));
set(handles.indic_10,'String',round(amplitud));
%*****************************************************************
%****VOLUMEN******
function vol_Callback(h, eventdata, handles)
%Control del nivel de volumen de reproducción
volumenn=get(h,'Value');
set_param('modelo/volumen','Value',num2str(volumenn));

function reproducir_Callback(hObject, eventdata, handles)


% set_param('modelo/selector','Value','7');%Para reproducir la canción
original
%Incia la simulación del modelo. Ejecuta START en el modelo--v
set_param(gcs,'SimulationCommand','Start')

function pausa_Callback(hObject, eventdata, handles)


%Pausar la simulación del modelo
set_param(gcs,'SimulationCommand','Pause')

function continuar_Callback(hObject, eventdata, handles)


%Continuar la simulación del modelo
set_param(gcs,'SimulationCommand','Continue')

function parar_Callback(hObject, eventdata, handles)


%Detener la simulación del modelo
set_param(gcs,'SimulationCommand','Stop')

%******************SELECCIONAR EL TEMA*****************
function abrir_tema_Callback(h, eventdata, handles)
%Abrir el tema a reproducir
[nombre ruta]=uigetfile('*.wav','Seleccione el tema');
if nombre == 0% Si se selecciona CANCELAR
return
end
%La siguiente línea establece el nombre del tema en simulink
%en el bloque que reproduce la canción en formato.wav
set_param('modelo/From Wave File','FileName',fullfile(ruta,nombre));
%Habilitar los botones de mando
set(handles.reproducir,'Enable','on');
set(handles.pausa,'Enable','on');
set(handles.continuar,'Enable','on');
set(handles.parar,'Enable','on');
%*******************************************************

function figure1_DeleteFcn(hObject, eventdata, handles)


%Parar la simulación si se cierra la interfaz
try
set_param(gcs,'SimulationCommand','Stop')%Detiene la simulación
save_system%Guarda los cambios en el sistema
close_system('modelo.mdl')%Cierra el modelo
catch
end

% --- Executes on selection change in popupmenu1.


function popupmenu1_Callback(hObject, eventdata, handles)
%Acrivar ecualizador
set_param('modelo/selector','Value','2');
set(handles.el_efecto,'String','Ecualizador')

val= get(hObject,'Value');

switch val
case 1
preset=[5,3,-2,-3,-1,1,5,6,6,6]; % Rock
case 2
preset=[0,0,0,0,0,0,-4,-4,-4,-6]; %Clásico
case 3
preset=[-4,0,3,3,3,3,3,1,1,1]; % Live
case 4
preset=[-1,1,2,2,1,-1,-1,-1,-1,-1];%Pop
case 5
preset=[4,3,0,-2,-2,0,4,5,5,5];%Techno
case 6
preset=[2,1,-1,-1,0,1,3,4,4,6];%Soft
case 7
preset=[6,6,6,4,0,-2,-5,-7,-7,-7];%Full bass
case 8
preset=[-7,-7,-7,-2,1,6,12,12,12,12];%Full Treble
otherwise
preset=[0,0,0,-2,0,2,2,0,0,0];%Reggae
end
set(handles.freq1,'Value',preset(1));
set(handles.freq2,'Value',preset(2));
set(handles.freq3,'Value',preset(3));
set(handles.freq4,'Value',preset(4));
set(handles.freq5,'Value',preset(5));
set(handles.freq10,'Value',preset(6));
set(handles.freq11,'Value',preset(7));
set(handles.freq12,'Value',preset(8));
set(handles.freq13,'Value',preset(9));
set(handles.freq14,'Value',preset(10));

freq1_Callback(handles.freq1, eventdata, handles)


freq2_Callback(handles.freq2, eventdata, handles)
freq3_Callback(handles.freq3, eventdata, handles)
freq4_Callback(handles.freq4, eventdata, handles)
freq5_Callback(handles.freq5, eventdata, handles)
freq10_Callback(handles.freq10, eventdata, handles)
freq11_Callback(handles.freq11, eventdata, handles)
freq12_Callback(handles.freq12, eventdata, handles)
freq13_Callback(handles.freq13, eventdata, handles)
freq14_Callback(handles.freq14, eventdata, handles)

% --- Executes on button press in grabar.


function grabar_Callback(hObject, eventdata, handles)
grabar=get(hObject,'Value');
if grabar==1
set(hObject,'String','GRABAR ON');
set_param('modelo/grabare','Value','1');
else
set(hObject,'String','GRABAR OFF');
set_param('modelo/grabare','Value','0');
end

% VOLUMEN DE CANALES L Y R
% --- CANAL L
function L_slider_Callback(hObject, eventdata, handles)
volumenn=get(hObject,'Value');
set_param('modelo/L','Gain',num2str(volumenn));

% --- CANAL R
function R_slider_Callback(hObject, eventdata, handles)
%Control del nivel de volumen de reproducción
volumenn=get(hObject,'Value');
set_param('modelo/R','Gain',num2str(volumenn));

Pruebas Realizadas:

Efecto de Eco:

0.5

-0.5

-1
0 0.5 1 1.5 2 2.5 3 3.5
señal original 5
x 10

-1

-2
0 0.5 1 1.5 2 2.5 3 3.5
señal mejorada 5
x 10
Efecto de Agudos:

0.5

-0.5

-1
0 0.5 1 1.5 2 2.5 3 3.5
señal original 5
x 10

1.5

0.5

-0.5

-1

-1.5
0 0.5 1 1.5 2 2.5 3 3.5
señal mejorada 5
x 10

Señal de graves:

0.5

-0.5

-1
0 0.5 1 1.5 2 2.5 3 3.5
señal original 5
x 10

-1

-2
0 0.5 1 1.5 2 2.5 3 3.5
señal mejorada 5
x 10

Você também pode gostar