You are on page 1of 9

ESCUELA POLITCNICA DEL EJRCITO LATACUNGA CARRERA DE ELECTRNICA PROCESAMIENTO DE SEALES

1. DATOS: 1.1 Nombres: Cadena Quimbita Alex Marcelo Gualpa Chiluisa Alex Andrs Pacheco Gavilnez Jonathan Alexander 1.2Nivel 1.3Fecha : Quinto : 02 de Julio del 2013

2. TEMA: Ecualizador de 4 bandas 3. OBJETIVO GENERAL: Usar Matlab como herramienta para generar un ecualizador de 4 bandas para discriminar frecuencias 4. RESUMEN: La ecualizacin de canales es una herramienta utilizada para remover los

efectos de distorsin que un canal de comunicaciones introduce en los datos que se transmiten.
5. ABSTRACT: The channel equalization is a tool used to remove the effects of distortion

introduced a communications channel in the data being transmitted.


6. MARCO TERICO 6.1 Ecualizador Un ecualizador es un dispositivo que procesa seales de audio. Modifica el contenido en frecuencias de la seal que procesa. Para ello, cambia las amplitudes de sus coeficientes de Fourier, lo que se traduce en diferentes volmenes para cada frecuencia. Con esto se puede variar de forma independiente la intensidad de los tonos bsicos. Ciertos modelos de ecualizadores grficos actan sobre la fase de las seales que procesan, en lugar de actuar sobre la amplitud. De un modo domstico generalmente se usa para reforzar ciertas bandas de frecuencias, ya sea para compensar la respuesta del equipo de audio (amplificador + altavoces) o para ajustar el resultado a gustos personales. Los hay analgicos y digitales, activos o pasivos, paramtricos, grficos y paragrficos. Los ecualizadores profesionales suelen tener, al menos, 10 bandas. Las normas ISO establecen que las bandas de frecuencia han de ser, al menos, 31, 63, 125, 250, 500, 1000, 2000, 4000, 8000 y 16 000 Hercios. Estas bandas de frecuencias bsicas son controladas por un fader (u otro potencimetro o control alternativo) que puede atenuar o introducir ganancia hasta en 12 dB, o an ms. Para evitar distorsin por saturacin ("clipping"), cada fader cuenta con un diodo LED, que se enciende justo antes de que se recorte la seal. Los ecualizadores estn muy relacionados con los mezcladores ecualizadores y mezcladores. 6.2 Creacin de una GUI sencilla. Para crear una GUI sencilla primero tenemos que llamar a la ventana de comandos de MatLab. Esto se hace picando sobre el icono de MatLab, que al abrirse nos mostrar la siguiente ventana:

Como se puede ver en la ventana de comando la versin que estoy usando es la nueva versin de MatLab para estudiantes 7.4.0.287 (R2007a). Es muy similar a las ltimas versiones para empresas y nicamente tiene restricciones legales que impiden usar esta versin con fines empresariales. La ventana de comandos que aparece aqu tiene el comando redir, que es un programita que me he hecho para que me lleve a directorios seleccionados. Los que no se hayan hecho un programa como ese deben acudir al desplegable que aparece sobre la ventana de comandos como Current Directory y llevar a la ventana de comandos al directorio donde desees trabajar. Para empezar a crear una GUI vamos a File-> New->GUI como en

Al seleccionar que queremos una GUI se nos abre una ventana de dilogo en la que tenemos unas serie de opciones.

Podemos abrir una GUI que ya exista, lo cual haremos despus de haber guardado nuestra primera GUI o comenzar con una GUI en blanco. Las otras ofrecen una plantilla en la que ya existen algunos controles (Uicontrols), o en la que ya hay incorporado un grfico y un men y finalmente incorporar un ventana de dilogo. No obstante todas esas cosas las haremos en estas secciones, de modo que elegimos tener una GUI en blanco.

7. CODIGO EN MATLAB

function ECUALIZADOR_EN_MATLAB_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles); g = imread('play.JPG'); set(handles.PLAY,'CData',g); g = imread('guardar.PNG'); set(handles.guardar,'CData',g); g = imread('reset.JPG'); set(handles.reset,'CData',g); g = imread('abrir.JPG');

set(handles.abrir,'CData',g); g = imread('grabar.JPG'); set(handles.grabar,'CData',g); g = imread('borrar.JPG'); set(handles.borrar,'CData',g); g = imread('vol.JPG'); set(handles.vol,'CData',g); axes(handles.axes1); box on grid on hold on xlabel('\bfFRECUENCIA [Hz]') ylabel('\bfAMPLITUD') title('\bfESPECTRO DE FRECUENCIA DE LA ENTRADA'); axes(handles.axes2); box on grid on hold on xlabel('\bfFRECUENCIA [Hz]') ylabel('\bfAMPLITUD') title('\bfESPECTRO DE FRECUENCIA DE LA SALIDA'); clc function varargout = ECUALIZADOR_EN_MATLAB_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; % --- Executes on slider movement. function slider1_Callback(hObject, eventdata, handles) % Escribir en el indicador el valor de la barra set(handles.b1, 'String', get(handles.slider1, 'Value')); % --- Executes during object creation, after setting all properties. function slider1_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]); end % --- Executes on slider movement. function slider2_Callback(hObject, eventdata, handles) % Escribir en el indicador el valor de la barra set(handles.b2, 'String', get(handles.slider2, 'Value')); % --- Executes during object creation, after setting all properties. function slider2_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]); end % --- Executes on slider movement. function slider3_Callback(hObject, eventdata, handles) % Escribir en el indicador el valor de la barra set(handles.b3, 'String', get(handles.slider3, 'Value')); % --- Executes during object creation, after setting all properties. function slider3_CreateFcn(hObject, eventdata, handles) % hObject handle to slider3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: slider controls usually have a light gray background. if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]);

end % --- Executes on slider movement. function slider4_Callback(hObject, eventdata, handles) % Escribir en el indicador el valor de la barra set(handles.b4, 'String', get(handles.slider4, 'Value')); % --- Executes during object creation, after setting all properties. function slider4_CreateFcn(hObject, eventdata, handles) % hObject handle to slider4 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: slider controls usually have a light gray background. if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]); end % --- Executes on button press in PLAY. function PLAY_Callback(hObject, eventdata, handles) global Y Fs OUT % Globales entrada, Fs, salida % Obtener las amplificaciones de cada banda AMP1 = get(handles.slider1, 'Value'); AMP2 = get(handles.slider2, 'Value'); AMP3 = get(handles.slider3, 'Value'); AMP4 = get(handles.slider4, 'Value'); % FILTRO DE LA BANDA ENTRE 100Hz Y 1kHz frecuencias_corte=[100 1000]; frecuencias_laterales=[1 1200]; Atenuacion_banda_pasante=0.2; Atenuacion_banda_suprimida=8; Frec_normalizada_corte=frecuencias_corte/(Fs/2); Frec_normalizada_lateral=frecuencias_laterales/(Fs/2); % Frecuencia lateral es antes y despues de las frec de corte. [N, Wn] = cheb1ord(Frec_normalizada_corte, Frec_normalizada_lateral, Atenuacion_banda_pasante, Atenuacion_banda_suprimida, 'z'); % N es el orden del filtro [num den] = cheby1(N, Atenuacion_banda_pasante, Frec_normalizada_corte, 'z'); % 'z' es en tiempo discreto. Y1 = AMP1*filter(num, den, Y); % FILTRO DE LA BANDA ENTRE 1KHz Y 3KHz frecuencias_corte=[1000 3000]; frecuencias_laterales=[800 3200]; Atenuacion_banda_pasante=0.2; Atenuacion_banda_suprimida=8; Frec_normalizada_corte=frecuencias_corte/(Fs/2); Frec_normalizada_lateral=frecuencias_laterales/(Fs/2); [N,Wn]=cheb1ord(Frec_normalizada_corte,Frec_normalizada_lateral,Atenua cion_banda_pasante,Atenuacion_banda_suprimida,'z'); [num,den]=cheby1(N, Atenuacion_banda_pasante, Frec_normalizada_corte,'z'); Y2=AMP2*filter(num,den,Y); % FILTRO DE LA BANDA ENTRE 3KHz Y 5KHz frecuencias_corte=[3000 5000]; frecuencias_laterales=[2800 5200]; Atenuacion_banda_pasante=0.2; Atenuacion_banda_suprimida=8; Frec_normalizada_corte=frecuencias_corte/(Fs/2); Frec_normalizada_lateral=frecuencias_laterales/(Fs*0.5);

[N,Wn]=cheb1ord(Frec_normalizada_corte,Frec_normalizada_lateral,Atenua cion_banda_pasante,Atenuacion_banda_suprimida,'z'); [num,den]=cheby1(N, Atenuacion_banda_pasante, Frec_normalizada_corte,'z'); Y3=AMP3*filter(num,den,Y); % FILTRO DE LA BANDA ENTRE 5KHz Y 9KHz frecuencias_corte=[5000 9000]; frecuencias_laterales=[4800 9200]; Atenuacion_banda_pasante=0.2; Atenuacion_banda_suprimida=8; Frec_normalizada_corte=frecuencias_corte/(Fs/2); Frec_normalizada_lateral=frecuencias_laterales/(Fs/2); [N,Wn]=cheb1ord(Frec_normalizada_corte,Frec_normalizada_lateral,Atenua cion_banda_pasante,Atenuacion_banda_suprimida,'z'); [num,den]=cheby1(N, Atenuacion_banda_pasante, Frec_normalizada_corte,'z'); Y4=AMP4*filter(num,den,Y); % Suma de las bandas en un solo sonido; OUT = Y1+Y2+Y3+Y4; sound(OUT, Fs); % sound reproduce axes(handles.axes2); % direcciono la imagen cla L = length(OUT); NFFT = 2^nextpow2(L); % Next power of 2 from length of y % NFFT es el numero de elementos de la transformada d fourier, para % calculos rapidos. % nextpow aproxima a la potencia de 2 mas cercanda. ejm. L = 17... L = 32; SALIDA = fft(OUT,NFFT)/L; f = Fs/2*linspace(0,1,NFFT/2+1); % linspace te crea un vector de 0, a 1, con NFFT/2+1 elementos. % Plot single-sided amplitude spectrum. plot(f,2*abs(SALIDA(1:NFFT/2+1))) xlim([0 9e3]) % --- Executes on button press in reset. function reset_Callback(hObject, eventdata, handles) % Establecer las barras en 1 set(handles.slider1, 'Value', 1); set(handles.slider2, 'Value', 1); set(handles.slider3, 'Value', 1); set(handles.slider4, 'Value', 1); % Establecer los indicadores en 1 set(handles.b1, 'String', 1) set(handles.b2, 'String', 1) set(handles.b3, 'String', 1) set(handles.b4, 'String', 1) % --- Executes on button press in abrir. function abrir_Callback(hObject, eventdata, handles) global Y Fs if get(handles.r1, 'Value') == 0 [filename, pathname] = uigetfile({'*.wav';},'File Selector'); % Para abrir los archivos .wav if filename ~= 0 % Entra solo si se ha cargado algun archivo. [Y, Fs] = wavread(filename); axes(handles.axes2); % Direcciona la imagen al axes 2 cla % Limpia el axes axes(handles.axes1); % Direcciona la imagen al axes 1

cla % Proceso para calcular la FFT (sacado de la ayuda de Matlab) %+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++ L = length(Y); NFFT = 2^nextpow2(L); % Numero de elementos de la transformada. 2^n T = fft(Y,NFFT)/L; f = Fs/2*linspace(0,1,NFFT/2+1); plot(f,2*abs(T(1:NFFT/2+1)), 'Linewidth', 2) %+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++ xlim([0 9e3]) % limita el eje de frecuencias hasta 9 KHz end else errordlg('Seleccione primero el modo "Cargar Sonido"','Error', 'help'); end % --- Executes on button press in guardar. function guardar_Callback(hObject, eventdata, handles) global OUT Fs D = get(handles.nombre, 'String'); % Nombre de como se llamar el archivo wavwrite(OUT, Fs, [D, '.WAV']); % Escribir el archivo de sonido para guardarlo S = ['Sonido guardado como: ', D]; % Concatenar para sacar en el mensaje msgbox(S, 'Hecho', 'help'); % --- Executes on button press in grabar. function grabar_Callback(hObject, eventdata, handles) % hObject handle to grabar (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global Y Fs if get(handles.r1, 'Value') == 1 % Conocer cual opcion est habilitada tiempo = str2num(get(handles.tiempo, 'String')); % Tiempo de grabacion en segundos if length(tiempo) == 1 && isnumeric(tiempo) % Entra solo si es un numero el tiempo ingresado tiemp = str2num(get(handles.tiempo, 'String')); Fs = 44.1e3; % Frecuencia de muestreo Y = wavrecord(tiemp*Fs, Fs); % Graba el tiempo requerido a la frecuenicia de muestreo indicada axes(handles.axes2); % Direcciona al axes2 cla % Borra la imagen del axes axes(handles.axes1);% Direcciona al axes1 % Proceso para hallar la FFT (Sacado de la ayuda de matlab) %+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + L = length(Y); NFFT = 2^nextpow2(L); % Next power of 2 from length of y T = fft(Y,NFFT)/L; f = Fs/2*linspace(0,1,NFFT/2+1); cla plot(f,2*abs(T(1:NFFT/2+1)), 'Linewidth', 2) %+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + xlim([0 9e3]) % Para delimitar el eje de la frecuencia hasta 9KHz else

errordlg('Ingrese el tiempo de grabacin', 'ERROR DE ENTRADA'); end else errordlg('Cargue un archivo de sonido','Error', 'help'); end function edit1_Callback(hObject, eventdata, handles) --- Executes during object creation, after setting all properties. function edit1_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end function tiempo_Callback(hObject, eventdata, handles) function tiempo_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes when selected object is changed in uipanel10. function uipanel10_SelectionChangeFcn(hObject, eventdata, handles) if hObject == handles.r1 % Saber cual boton esta habilitado set(handles.tiempo, 'Enable', 'on'); % Habilitar el tiempo de grabacion else set(handles.tiempo, 'Enable', 'off');% Deshabilitar el tiempo de grabacion end % --- Executes on button press in borrar. function borrar_Callback(hObject, eventdata, handles) % Establecer las barras en 1 set(handles.slider1, 'Value', 1); set(handles.slider2, 'Value', 1); set(handles.slider3, 'Value', 1); set(handles.slider4, 'Value', 1); % Establecer los indicadores en 1 set(handles.b1, 'String', 1) set(handles.b2, 'String', 1) set(handles.b3, 'String', 1) set(handles.b4, 'String', 1) % Borrar lo escrito en "nombre y tiempo" set(handles.tiempo, 'String', ''); set(handles.nombre, 'String', ''); axes(handles.axes1); % direccionarse al axes1 cla % Borrar grafica axes(handles.axes2);% direccionarse al axes1 cla% Borrar grafica function nombre_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function nombre_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- Executes on button press in vol. function vol_Callback(hObject, eventdata, handles) % soundsc reproduce el sonido a un nivel estandarizado sin importar el % volumen original de este. global OUT Fs

soundsc(OUT, Fs); 8. ANALISIS DE RESULTADOS Mediante la siguiente grafica podemos notar el filtrado de la primera banda

Al utilizar las herramientas matemticas y a la ves la terica podemos demostrar que la frecuencia de muestreo es importante para obtener una buena seal de salida. Al escoger nuestro rango de frecuncia de corte nosotros no dejamos pasar estas frecuencias a las salida 9. CONCLUSIONES: Con la grfica podemos demostrar con todas las 3 bandas restantes que si nosotros no queremos una frecuencia filtramos la no desea Podemos concluir que podemos filtrar cualquier tipo de seal no deseada para el usuario y as generar un nuevo audio mejorando o disminuyendo la calidad del audio 10. BIBLIOGRAFIA http://www.redalyc.org/articulo.oa?id=84917249022 http://revistas.udistrital.edu.co/ojs/index.php/reving/article/view/2312/3134 http://ewh.ieee.org/sb/argentina/comahue/ed1/Papers/1EdRate05/TRATE05007.pdf

You might also like