|
Junior Member
Fecha de ingreso: 27/ene/2011
Ubicación: Trujillo-Peru
Mensajes: 2
Poder de Credibilidad: 0 
|
Matlab Procesamiento de sonidos
INTRODUCCIÓN
El procesamiento de sonido es una de las aplicaciones digitales más extendidas. En este proyecto vamos a usar el programa MATLAB y sus herramientas de procesado de señal para editar sonidos, escucharlos y visualizarlos. En particular, vamos a grabar, reproducir, efectos y plotear señales de sonido.
DESCRIPCIÓN
1. ¿Qué es el sonido y cómo se captura en un computador digital?
El sonido es una percepción humana que permite obtener gran cantidad de información de nuestro entorno. El fenómeno físico que lo produce es el movimiento del aire, o mejor dicho, el movimiento de una onda de presión (onda acústica).
El órgano del oído es un sistema muy sofisticado en el que se capta la onda acústica (oído externo y medio), se descompone frecuencia mente y se convierte en estímulos eléctricos (cóclea), se transmite al cerebro (nervio auditivo), y se procesa (cerebro) para construir la percepción subjetiva que llamamos sonido. La capacidad del cerebro para procesar sonidos es increíble y estamos lejos todavía de ser capaces de imitarlo.
Para capturar el sonido se utilizan micrófonos, que convierten la onda acústica (movimiento) en una señal eléctrica, y para generar sonido se utilizan altavoces, que realizan la operación contraria, convirtiendo la señal eléctrica en una onda acústica. Para poder ser usada en un computador digital la señal eléctrica procedente del micrófono debe ser digitalizada. Para ello, primero se muestrea y luego las muestras se cuantifican y codifican.
Los parámetros fundamentales de la digitalización son: la frecuencia de muestreo, en muestras por segundo (hercios), y el número de bits empleado para codificar cada muestra. El resultado es una secuencia de códigos binarios manejable en un computador digital. Cuando el sonido es estéreo, hay dos señales (una por cada canal, izquierdo y derecho) que se digitalizan por separado.
2. ¿Qué es MATLAB?
MATLAB (abreviatura de MATrix LABoratory) es una potente herramienta para el tratamiento matemático de datos en el computador. Las funciones de MATLAB pueden ejecutarse interactivamente mediante comandos, o utilizarse para escribir programas. En particular utilice el toolbox y una GUIDE.
3. ¿Qué es toolbox?
El toolbox (conjunto de funciones predefinidas) para procesado de señales. Por ello, conviene conocer la variedad de funciones disponibles (el programa dispone de ayuda on line).
4. ¿Qué es una GUIDE?
GUIDE es un entorno de programación visual disponible en MATLAB para realizar y ejecutar programas que necesiten ingreso continuo de datos. Una aplicación GUIDE consta de dos archivos: .m y .fig. El archivo .m es el que contiene el código con las correspondencias de los botones de control de la interfaz y el archivo .fig contiene los elementos gráficos. Cada vez que se adicione un nuevo elemento en la interfaz gráfica, se genera automáticamente código en el archivo .m.
5. ¿Cómo ejecutar una GUIDE?
Para ejecutar una Interfaz Gráfica (GUIDE), si la hemos etiquetado con el nombre Grabaciones_de_audio_Raisa.fig, simplemente ejecutamos en la ventana de comandos >> Grabaciones_de_audio_Raisa. O haciendo click derecho en el m-file y seleccionando la opción RUN.
PRESENTACIÓN DEL PROYECTO
La GUIDE de nombre Grabaciones_de_audio_Raisa.fig tiene tres partes:
1. En la primero parte es necesario conectar un micrófono para Grabar voz, pero antes debemos determinar el tiempo de adquisición de sonido, este es ingresado desde consola en un Edit-Text. Luego si haces clic en el pushbutton Reproducir, se escuchará lo que grabaste.
2. En la segunda parte procesaremos los sonidos grabados, dándole efectos como: invertir sonido, multieco, pre eco y eco recursivo. Luego de seleccionar un Radio Button. Hacemos clic en Reproducir para poder apreciar su grafica, como también reproducir estos sonidos con su respectivo efecto.
3. En la tercera parte, desarrolle un reproductor de música de formatos .wav.
PROCESAMIENTO DE SONIDO 1
INVERTIR SONIDO

PROCESAMIENTO DE SONIDO 2
MULTIECO

PROCESAMIENTO DE SONIDO 3
PRE ECO

PROCESAMIENTO DE SONIDO 4
ECO RECURSIVO

CÓDIGO: El siguiente código lo recorte de Grabaciones_de_audio_Raisa.m , es decir sólo los objetos principales.
.
Código:
% --- Executes during object creation, after setting all properties.
function edit1_Callback(hObject, eventdata, handles)
global waitime;
waitime = str2double(get(handles.edit1,'String'));
% --- Executes on button press in pushbutton1. Boton que Grabar
function pushbutton1_Callback(hObject, eventdata, handles)
global waitime;
global run;
global data;
global graphics;
global left;
global right;
waitime = str2double(get(handles.edit1,'String'));
t = timer('StartDelay',waitime,'TimerFcn','disp('''')');
disp('Running')
run = 1;
while run
start(t)
set(handles.pushbutton2,'Enable','on');
if(run == 0)
set(handles.pushbutton2,'Enable','on');
break;
else
Fs = 44100;
N = waitime*Fs;
data = wavrecord(N,Fs,'double');
set(handles.axes2,'XScale','log');
set(handles.axes1,'XScale','log');
axes(handles.axes1);
plot(data),grid on;
axes(handles.axes2);
plot(data), grid on;
xlabel('Pump Number');
ylabel('Amplitud');
axes(handles.axes2);
xlabel('Pump Number');
ylabel('Amplitud');
axes(handles.axes1);
run =0;
end;
wait(t)
set(handles.pushbutton1,'Enable','on');
set(handles.pushbutton2,'Enable','off');
disp('Stopped')
end;
% --- Executes on button press in pushbutton2.Boton de Stop en la grabacion
function pushbutton2_Callback(hObject, eventdata, handles)
global run;
if (run==0)
set(handles.pushbutton1,'Enable','on');
end
% --- Executes on button press in pushbutton3.Boton Reproducir la grabacion
function pushbutton3_Callback(hObject, eventdata, handles)
global t2;
global data;
t2 = timer('StartDelay',8,'TimerFcn','disp('''')');
start(t2);
wavplay(data,44100);
set(handles.pushbutton3,'Enable','on');
set(handles.pushbutton2,'Enable','on');
% --- Executes on button press in volumen.
function volumen_Callback(hObject, eventdata, handles)
% --- Executes on button press in stop.
function stop_Callback(hObject, eventdata, handles)
global runn;
if (runn == 1)
set(handles.stop,'Enable','off');
set(handles.play,'Enable','on');
end
% --- Executes on button press in play.
function play_Callback(hObject, eventdata, handles)
global musica
global ruta
global runn
if isequal(ruta,0)
set(handles.play,'Enable','off');
else
runn=1;
set(handles.pushbutton1,'Enable','on');
set(handles.stop,'Enable','on');
set(handles.mute,'Enable','on');
set(handles.volumen,'Enable','on');
wavplay(musica,44100);
end
% --- Executes on button press in mute.
function mute_Callback(hObject, eventdata, handles)
% --- Executes on button press in openfiles.
function openfiles_Callback(hObject, eventdata, handles)
global ruta
global musica
disp('Running')
run = 1;
fs=44100;
bits=16;
ruta=uigetfile('*.wav','Selecciona un archivo wav');
if isequal(ruta,0)
disp('User pressed cancel')
set(handles.openfiles,'Enable','on');
set(handles.play,'Enable','off');
else
disp('User selected ')
set(handles.openfiles,'Enable','on');
set(handles.play,'Enable','on');
[musica fs bits]=wavread(ruta);
set(handles.openfiles,'Enable','on');
end
% --- Executes on button press in radiobutton1.
function radiobutton1_Callback(hObject, eventdata, handles)
global audiotype
audiotype = 1;
set(handles.radiobutton1,'Value',1)
off = [handles.radiobutton2,handles.radiobutton3,handles.radiobutton4];
mutual_exclude(off);
% --- Executes on button press in radiobutton2.
function radiobutton2_Callback(hObject, eventdata, handles)
global audiotype
audiotype = 2;
set(handles.radiobutton2,'Value',1)
off = [handles.radiobutton1,handles.radiobutton3,handles.radiobutton4];
mutual_exclude(off);
% --- Executes on button press in radiobutton3.
function radiobutton3_Callback(hObject, eventdata, handles)
global audiotype
audiotype = 3;
set(handles.radiobutton3,'Value',1)
off = [handles.radiobutton1,handles.radiobutton2,handles.radiobutton4];
mutual_exclude(off);
% --- Executes on button press in radiobutton4.
function radiobutton4_Callback(hObject, eventdata, handles)
global audiotype
audiotype = 4;
set(handles.radiobutton4,'Value',1)
off = [handles.radiobutton1,handles.radiobutton2,handles.radiobutton3];
mutual_exclude(off);
% --- Executes on button press in Reproducir_Efecto.
function Reproducir_Efecto_Callback(hObject, eventdata, handles)
global audiotype;
global data;
global left;
global right;
global out;
switch audiotype
case 1 %invertimos sonido
fs=44100;
data_rev=flipud(data);
soundsc(data_rev,fs);
axes(handles.axes2);
plot(data_rev), grid on;
xlabel('Pump Number');
ylabel('Amplitud');
case 2 %eco canal izquiedo
fs=44100;
left=data(:,1);
leftout = left;
N=10000;
for n=N+1:length(left)
leftout(n)=left(n)+left(n-N);
end
soundsc(leftout,fs);
axes(handles.axes2);
plot(leftout), grid on;
xlabel('Pump Number');
ylabel('Amplitud');
case 3%pre eco
fs=44100;
left=data(:,1);
leftout = left;
N=20000;
for n=1:length(left)-N
leftout(n)=0.5*left(n)+left(n+N); % Para que se escuche el efecto del eco
end
soundsc(leftout,fs);
axes(handles.axes2);
plot(leftout), grid on;
xlabel('Pump Number');
ylabel('Amplitud');
case 4 %eco recursio
fs=44100;
% N=20000;
out=data; % nuevo arreglo
N=1000; % monto del retardo N/8192 segundos
for n=N+1:length(data)
out(n)=.8*out(n-N)+data(n); % eco recursivo, ya que le sumo la misma onda
end
soundsc(out,fs) % escuchamos un eco recursivo
axes(handles.axes2);
plot(out), grid on;
xlabel('Pump Number');
ylabel('Amplitud');
otherwise
end
% --- Executes when user attempts to close figure1.
function figure1_CloseRequestFcn(hObject, eventdata, handles)
opc=questdlg('¿Desea salir del programa?','SALIR','Si','No','No');
if strcmp(opc,'No')
return;
end
delete(hObject);
% --- Executes on button press in zoom1.
function zoom1_Callback(hObject, eventdata, handles)
zoom on;
EXPLICACIÓN DE OBJETOS DEL CODIGO:
En una GUIDE se genera la función ó método del objeto que voy a codificar, luego de haberlo creado manualmente, es decir la programación es independiente. No va depender de cuantos objetos tenga en un momento sino que conforme vaya necesitando mas objetos los crearé , programaré a mi aplicación.
Los objetos que creé son los siguiente:
1. function edit1_CreateFcn(hObject, eventdata, handles); es un Edit Text donde almaceno el tiempo de adquisicion de sonido.
2. function pushbutton1_Callback(hObject, eventdata, handles); es un Pushbutton que me permite grabar sonidos.
3. function pushbutton2_Callback(hObject, eventdata, handles); es un Pushbutton que me permite detener la grabacion de sonidos.
4. function pushbutton3_Callback(hObject, eventdata, handles); es un Pushbutton que me permite reproducir los sonidos que e grabado.
5. function volumen_Callback(hObject, eventdata, handles);es un pushbutton que me permite manejar el volumen de sonido cuando reprodusco una cancion format .wav.
6. function play_Callback(hObject, eventdata, handles); es un pushbutton que me permite reproducer musica con format .wav.
7. function mute_Callback(hObject, eventdata, handles); es un pushbutton que me permite quitar el sonido cuando estoy reproduciendo un cancion con format .wav.
8. function openfiles_Callback(hObject, eventdata, handles); es un pushbutton que me permite abrir el directorio donde se encuntran mis archives para luego reproducir una canción.
9. function radiobutton1_Callback(hObject, eventdata, handles); es un radiobutton que me permite invertir la señal usando el commando flipud.
10. function radiobutton2_Callback(hObject, eventdata, handles); es un radiobutton que me permite crear eco al canal izquierdo de la señal de audio.
11. function radiobutton3_Callback(hObject, eventdata, handles); es un radiobutton que me permite crear un pre eco a mi señal de audio grabada.
12. function radiobutton4_Callback(hObject, eventdata, handles): es un radiobutton que me permite crear eco recursivo a mi señal de audio grabada.
13. function Reproducir_Efecto_Callback(hObject, eventdata, handles); es un pushbutton que me permite reproducir los efectos que le correponde a cada radiobutton.
14. function zoom1_Callback(hObject, eventdata, handles); es un pushbutton que me permite hacer uso del zoom en mis graficas de señal de audio.
15. function figure1_CloseRequestFcn(hObject, eventdata, handles); aquí aparece un mensaje si desea salir del programa o continuar.
|