Instituto Tecnológico y de Estudios Superiores de Occidente
Departamento de Electrónica, Informática y Sistemas
Tutorial Matlab/Octave
Introducción al procesamiento de audio
L. M. Bazdresch
Agosto 2009
Tutorial Octave: Procesamiento de audio
L. M. Bazdresch
Este tutorial presenta algunas de las herramientas básicas para iniciarse en el
procesamiento de audio en Matlab/Octave. El código presentado en este tutorial
ha sido probado sólo en Octave; en Matlab pudiera ser necesario hacer algunos
ajustes.
En Windows, la instalación de Octave incluye un paquete de procesamiento
de audio y de señales con los comandos que usaremos aquı́. En Linux, es necesario
instalar los paquetes a mano. Los que se necesitan son audio y signal. El paquete
de audio es viejo, se recomienda instalar en su lugar el paquete aaudio disponible
en [Link]
Fuentes de audio
Octave tiene dos formas generales de leer una fuente de audio. Una es leyendo
un archivo con las muestras de audio (por ejemplo, un archivo .WAV). Otra es
grabando audio directamente de un micrófono, utilizando la tarjeta de sonido.
Lectura de archivo
Octave incluye un comando para leer un archivo .WAV:
[ x , f s , b i t s ] = wavread ( f i l e n a m e ) ;
donde x es una matriz con una columna por cada canal de audio, fs es la
frecuencia de muestreo (especificada en el encabezado del archivo .WAV), bits
es el número de bits por muestra (también tomado del encabezado), y filename
es el nombre del archivo .WAV entre comillas simples.
Grabación
Para grabar directamente de un micrófono, se puede usar el comando aurecord
del paquete de audio:
[ x , f s u , chanu ] = a u r e c o r d ( t , f s , chan ) ;
donde t es el tiempo que se desea que dure la grabación, fs es la frecuencia de
muestreo deseada, y chan es el número de canales deseados. Es posible que la
tarjeta de sonido no soporte la frecuncia de muestreo o el número de canales
que se pidieron; en las variables fsu y chanu regresa los valores que realmente
se usaron. Las muestras de audio se regresan en la matrix x.
Utilizando el paquete aaudio, la grabación se puede hacer con el comando:
Y = a r e c o r d ( fr a mes , c h a n n e l s , f s ) ;
1
donde frames es el número de muestras que se quiere capturar, channels es el
número de canales, y fs es la frecuencia de muestreo.
Destinos del audio
Una vez que el audio ha sido leı́do y procesado, se pueden hacer dos cosas
con él: grabarlo en un archivo o reproducirlo.
Escritura de archivos .WAV
La forma más fácil de escribir un archivo de audio es con wavwrite:
wavwrite ( x , f s , b i t s , f i l e n a m e )
donde las variables tienen el mismo significado que en wavread. El archivo .WAV
que resulta puede ser reproducido fuera de Octave con cualquier programa
de audio (mplayer, vlc, Windows Media Player, WinAmp, iTunes, Audacity,
etcétera).
Reproducción
Para reproducir el audio desde Octave, se pueden usar los comandos
sound ( x , f s )
del paquete audio o bien
aplay (x , f s )
del paquete aaudio.
Análisis en frecuencia
Junto con el procesamiento del audio, es conveniente poder analizarlo en
frecuencia. Con una señal que generalmente contiene muchas frecuencias y es
de larga duración (decenas o centenas de segundos), la transformada de Fourier
directa de la señal no da mucha información. Por ejemplo, la siguiente figura
muestra el espectro de magnitud de nueve segundos de una cancion. No se
puede observar gran cosa: las frecuencias bajas tienen más energı́a que las altas,
y a partir de unos 5000-8000Hz la señal tiene pocas componentes; y la canción
contiene frecuencias hasta unos 22kHz, que es lo que se espera de una señal
tomada de un CD. Sin embargo, la transformada de Fourier pierde la información
de cómo cambian las frecuencias con el tiempo.
2
Espectro de Magnitud
0.014
0.012
0.01
0.008
Amplitud
0.006
0.004
0.002
0
-30000 -20000 -10000 0 10000 20000 30000
Frecuencia (Hz)
El espectrograma suele ser más util para el análisis de audio. Es una figura
tridimensional que rescata la dinámica temporal de la canción. La señal se divide
en intervalos muy pequeños y se obtiene la transformada de cada intervalo; la
información frecuencial de cada intervalo se aprecia con colores. La siguiente
figura muestra el espectrograma de la misma canción.
n=16, fs=44.1e3
20000
15000
frecuencia
10000
5000
0
0 1 2 3 4 5 6 7 8 9
tiempo
El código para generar este espectrograma es el siguiente:
3
% ó f u n c i n pa r a g e n e r a r e s p e c t r o g r a m a s de una ñ s e a l de a udio
% argumento de e n t r a d a : e l nombre d e l a r c h i v o . wav que c o n t i e n e e l a udio
% hay que p a s a r e l nombre como s t r i n g , e s d e c i r , e n t r e c o m i l l a s s i m p l e s
function s p e c g r ( f i l e n a m e )
%%%
% l e e r un c a n a l d e l a r c h i v o o r i g i n a l
[ y , Fs ]=wavread ( f i l e n a m e ) ;
x=y ( : , 1 ) ’ ;
cl ear y ;
% pa r a metr o s que n e c e s i t a specgram
s t e p = f i x ( 5 ∗ Fs / 1 0 0 0 ) ; % r eba na da s e s p e c t r a l e s de 5ms
window = f i x (2 0 ∗ Fs / 1 0 0 0 ) ; % venta na de d a t o s de 20
f f t n = 2ˆnextpow2( window ) ; % s i g u i e n t e p o t e n c i a de dos
[ S , f , t ] = specgram ( x , f f t n , Fs , window , window−s t e p ) ;
% graficacion
fi gure ( 1 ) ;
S = abs ( S ( 2 : f f t n ∗20000/ Fs , : ) ) ; % magnitud en e l r a ng o 0<=20000 Hz
S = S/max( S ( : ) ) ; % n o r m a l i z a r magnitud pa r a que e l ámximo s e a 0 d
S = max( S , 1 0 ˆ ( − 6 0 / 1 0 ) ) ; % c l i p a b a j o de −60 dB
S = min( S , 1 0 ˆ ( 0 / 1 0 ) ) ; % c l i p a r r i b a de 0 dB .
imagesc ( t , f , log10 ( S ) ) ; % mo str a r en e s c a l a ı́ l o g a r t m i c a
s et ( gca ( ) , ” y d i r ” , ” normal ” ) ;
t i t l e ( ’ n=16 , f s =44.1 e3 ’ ) ;
xlabel ( ’ tiempo ’ ) ;
ylabel ( ’ f r e c u e n c i a ’ ) ;
% print −c o l o r b1 6 r 4 4 1 . eps % pa r a g r a b a r l a imagen en a r c h i v o