Você está na página 1de 25

TUTORIAL BASICO PARA EL MANEJO

DE SEALES CON MATLAB


Introduccin
MATLAB significa "MATrix LABoratory". Es un programa para clculo tcnico y cientfico; sus
clculos numricos se hacen en forma matricial y dada su gran capacidad para realizar
diferentes grficos en dos y tres dimensiones y un lenguaje de programacin propio se ha
posicionado como una de las herramientas de mayor uso por parte de la comunidad tcnica y
cientfica.
MATLAB es un entorno de computacin y desarrollo de aplicaciones totalmente integrado
orientado para llevar a cabo proyectos en donde se encuentren implicados elevados clculos
matemticos y la visualizacin grfica de los mismos. MATLAB integra anlisis numrico,
clculo matricial, proceso de seal y visualizacin grfica en un entorno completo donde los
problemas y sus soluciones son expresados del mismo modo en que se escribiran
tradicionalmente, sin necesidad de hacer uso de programacin tradicional, es por esto que
MATLAB es una excelente herramienta de alto nivel para desarrollar aplicaciones tcnicas, es
fcil de utilizar y aumenta la productividad de los programadores respecto a otros entornos de
desarrollo.
MATLAB en la actualidad dispone de una amplia cantidad de programas de apoyo
especializados, denominados Toolboxes, estos extienden significativamente el nmero de
funciones incorporadas en el programa principal. Estos Toolboxes cubren en la actualidad
prcticamente casi todas las reas principales en el mundo de la ingeniera y la simulacin, por
ejemplo estn los 'toolbox' para proceso de imgenes, procesamiento digital de seales,
control robusto, estadstica, anlisis financiero, matemticas simblicas, redes neurales, lgica
difusa, entre otros.
Combinando MATLAB con Signal Processing Toolbox, Wavelet Toolbox y un conjunto de
herramientas complementarias, se puede crear un ambiente de anlisis personalizado de
seales y desarrollo de algoritmos DSP. Para simulacin y desarrollo de prototipos se puede
agregar el Simulink y el DSP Blockset para modelar y simular sistemas DSP, y luego usar RealTime Workshop para generar cdigo C para su hardware designado.
MATLAB integra todos los requisitos claves de un sistema de computacin tcnico: clculo
numrico, grficos, herramientas para aplicaciones especficas y capacidad de ejecucin en
mltiples plataformas como Windows 95/98/XP/NT, Macintosh, Unix y Linux.

Objetivo
Introducir al estudiante tanto de pregrado como de la especializacin de la Carrera de
Composicin con Medios Electroacsticos de la Universidad Nacional de Quilmes en el manejo
correcto de MATLAB, ya que esta herramienta proporciona al estudiante un medio de carcter
nico, para resolver los problemas ms complejos y difciles.

La Interfase de Matlab

Ventana Inicial de MATLAB Version 6.5 Release 13


Command Window, es la ventana principal donde se digitan todos los comandos, es como si
se tratase de la mesa de trabajo, aqu se puede apreciar el prompt con el smbolo >>, por
defecto este smbolo siempre aparecer.
Command History es la ventana encargada de almacenar todos los comandos que se
escriben en el Command Window.
Workspace es la ventana encargada de almacenar todas las variables ya sean Vectores,
Matrices o ans (respuesta, de la palabra en ingls answer) con sus correspondientes longitudes
o tamaos.
Por defecto todos los archivos se guardan en un directorio llamado Work, este directorio se
encuentra dentro de MATLAB (D:\MATLAB6p5\Work en Wndows, /usr/share/matlab en Unix o
Linux), siempre es importante saber donde voy a guardar mi trabajo, razn por la cual al crear
un directorio en otra posicin del disco duro, hay que buscarlo y posicionarse en l por medio
del Current Directory.

Operaciones bsicas con Matlab


En el siguiente apartado se expondrn los elementos bsicos para tener en cuenta al
momento de trabajar con Matlab.

Vectores y Matrices
Clculos

Creacin de vectores y matrices

Operaciones

Grficos

Primero es importante resaltar algunas particularidades del programa:

Matlab es dependiente del contexto, es decir, las letras maysculas y minsculas son
diferentes, por ejemplo X es diferente de x, Var es diferente de var, plot es diferente
de PLOT.

La comilla sencilla ' se emplea para ingresar texto en una funcin, como por ejemplo
ejemplo: title('Esta grfica corresponde a una seal digital'). En un
teclado espaol estndar este carcter se encuentra en la tecla de la interrogacin.

El signo = se emplea para asignar un valor a una variable. Ejemplo: y=5 (En la variable y
se almacena el valor 5).

El punto y coma (;) al final de una instruccin se emplea para indicar a MATLAB que
realice el clculo sin presentar en pantalla el procedimiento o el resultado.

Cualquier tipo de comentario o mensaje se escribe precedido por el carcter


Ejemplo: %As se escriben los comentarios o mensajes.

Con la ayuda podemos obtener una informacin ms detallada en cuanto a la sintaxis y


comandos, basta con escribir help seguido del comando en el prompt. Ejemplo: help

%.

plot

Vectores y Matrices
Dado que Matlab fue programado para anlisis matricial, se hace indispensable hablar sobre
los conceptos bsicos de los vectores y matrices.
Una matriz es un arreglo rectangular de nmeros y su tamao esta dado por m x n, siendo m
el nmero de filas y n el nmero de columnas.

Arreglo Matricial

El elemento aij, es el nmero que aparece en la fila i y la columna j de la matriz.


Un Vector Fila es un conjunto ordenado de n nmeros escritos de la siguiente forma

Vector Fila

Un Vector Columna es un conjunto ordenado de n nmeros escritos de la siguiente forma

Vector Columna

Para sumar dos matrices es condicin necesaria que sean de igual tamao. Para multiplicarlas
es necesario que el nmero de columnas de la primera sea igual al nmero de columnas de la
segunda.
Para multiplicar una matriz por un vector, la longitud de la fila de la matriz (es decir, el nmero
de columnas) debe ser igual a la longitud del vector columna, o la longitud de la columna de la
matriz debe ser igual a la longitud del vector fila.

Clculos
Las operaciones o clculos que no se asignan a una variable especfica, se asignan por defecto
a la variable ans (answer).

>>7+10+3
ans = 20
Las operaciones se evalan por orden de prioridad: primero las potencias, despus las
multiplicaciones y divisiones y, finalmente, las sumas y restas. Las operaciones de igual
prioridad se evalan de izquierda a derecha:

>>10/2*4
ans = 20
>>10/(2*4)
ans = 1.2500
En el siguiente ejemplo se genera un matriz de dimensin 1x1. A una variable x se asigna el
valor 7, el punto y coma al final indica que no se debe presentar el resultado

>> x=7;
Por ejemplo aqu no aparece ans con su respuesta.
Para visualizar el contenido de una variable se escribe el nombre de la variable

>> x
ans= 7
Recuerde que al poner un ; al final no se presentan lo resultados, ms sin embargo
igualmente la variable ans tendr el resultado.
Para visualizar la longitud del vector, se emplea el comando length(variable)

>> length(x)
ans= 1
Para visualizar la dimensin del arreglo, se emplea el comando size(variable)

>> size(x);
ans= 1 1
La operacin x=7 en el rea de trabajo de Matlab se vera de la siguiente forma

Ventana de trabajo

Obsrvese que en la ventana Command Window se realizaron tres ejecuciones: la asignacin


valor a la variable x (x=7), la ejecucin del comando length y la ejecucin del comando

size.

En la ventana Command History se almacena todo lo que se ha escrito, por ejemplo las variables y los
comandos.

En la ventana Workspace aparece el tamao de las variables, por ejemplo la dimensin de x


es 1x1.

Creacin de vectores y matrices


Los componentes de un vector o matriz siempre deben ir entre corchetes

>> vectorfila= [ 1 2 3 4 5 6 7]
vectorfila = 1 2 3 4 5 6 7
>> vectorcolumna = [1; 2; 3; 4]
vector columna=
1
2
3
4
Las filas deben ir separadas por punto y coma

>> Matriz= [1 2 3; 4 5 6; 7 8 9]
matriz=
1 2 3
4 5 6
7 8 9

Acceso a posiciones
Para posicionarse en el valor 6 de la variable Matriz determinada en el ejemplo anterior y que
corresponde a la segunda fila con tercera columna tres, se indica entre parntesis la posicin.
En el siguiente ejemplo se asigna el valor de la posicin iniciada a la variable posicion.

>>posicion=Matriz(2,3)
ans = 6
Si se deseara asignar toda la tercera fila como un solo vector entonces se cambiara el parmetro
correspondiente a la columna por el caracter : con lo cual se indica que corresponde a todas las

columnas.

>> fila=Matriz(3,:)
ans = 7 8 9
Similar al caso anterior, si se desea la tercera columna en su totalidad entonces se reemplaza
el parmetro de la fila por el caracter : con lo cual se indica que corresponde a todas las filas.

>> columna=Matriz(:,3)
ans =
3
6
9

Creacin de Rangos
La definicin de rangos en Matlab se especifica segn la sintaxis

Variable=Cominezo:Intervalo:Final
Para ms informacin digitar en el prompt

help colon

Si se desea declarar un vector con un rango de 1 a 5 con intervalo de a uno se emplea la


siguiente declaracin

>> n=1:5
ans = 1 2 3 4 5
Si se quiere declarar un vector con un rango de 0 a 20 con intervalo de a dos
>>n=0:2:20
ans = 0 2 4 6 8 10 12 14 16 18 20

Operaciones
Las operaciones de suma, resta, divisin y multiplicacin utilizan los operadores +, -, /, *
respectivamente.
Suma de vectores

>>vector1= [1 2 3 ];
>> vector2= [3 4 5;];
>> suma= vector1 + vector2
ans = [4 6 8]
Multiplicacin de matrices y vectores

>> vector1= [1 2 3 ];
>> vector2= [3 4 5];
>> vector1.*vector2
ans = 3 8 15
>> Matriz = [1 2 3;1 2 3; 1 1 1 ];

>> vector= [3 ;4 ;5];


>> Matriz * vector
ans =
26
26
12
Transposicin de vectores

>> vector = [3;4;5]


ans =
3
4
5
>> vector'
ans = 3 4 5

Grficos
Consideremos el ejemplo de graficar la funcin x^2:

>> x=0:0.1:1; % x es un vector, que empieza en 0, con incrementos de 0.1


y finaliza en 1
>> y=x.^2;
>> plot (y),title(' Grafica de la funcin x^2')
>> grid on %permite visualizar las cuadriculas

Grfica de x2

Definicin de funciones con M-files


Un M-File es un archivo que contiene una lista de comandos a ser ejecutados por MATLAB.
Casi todas las funciones presentes en el programa estn definidas en un archivo de este tipo
en un directorio especial.
Tambin es posible crear archivos de este tipo con los cuales definir funciones propias para
emplearlas posteriormente, es decir, se pueden crear con el objetivo de programar nuevas
rutinas en MATLAB. El vocabulario que aqu que se escribe es expresado en trminos de otras
funciones existentes. Es importante tener en cuenta que toda funcin tiene que ser identificada
por un nombre diferente a las ya existentes en MATLAB pues MATLAB no maneja sobrecarga
de funciones.
Las sintaxis es la siguiente:

Palabra reservada function [variables de salida] = Nombre de la funcin


(Parmetros de entrada)
% informacin que se presentar como ayuda
% con el comando help 'Nombre de la funcin'
Estructura del programa, donde se utilizan variables que se destruyen
una vez utilizadas y/o funciones definidas en
Puede guardase este archivo en el directorio de trabajo para no tener necesidad de agregar
elementos extras.
A diferencia de los lenguajes de programacin formales, Matlab permite ms de una variable
de salida. Para retornar este valor no se emplea algn comando como return sino que se
asigna dicho nombre de variable durante la ejecucin al dato que se desea retornar.

[suma, resta, multiplicacion, division]=comandos(var_a, var_b)


%COMANDOS retorna la suma, resta, multiplicacin y divisin de dos variables.

var_a = primera variable


var_b = segunda variable
suma = resultado de la suma
resta = resultado de la resta
multiplicacion = resultado de la multiplicacin
divisin = resultado de la divisin

% $Revision: 1.1 $ $Date: 2004/20/06 19:12:36 $


suma=var_a+var_b;
resta=var_a-var_b;
multiplicacion=var_a*var_b;
division=var_a/var_b;
Hay que anotar un detalle especial. Al emplear el carcter ; al final de un comando se
indica que no debe presentar el resultado y si en la funcin anterior no se indicara esto
entonces se presentaran todos los comandos durante la ejecucin de la rutina.

Anlisis de una Onda Seno


Para poder generar ondas senosoidales que involucren parmetros tales como amplitud,
frecuencia, frecuencia de muestreo, tiempo y ngulo de fase, hay que definir la funcin
senosoidal. El siguiente es el cuerpo de la funcin.

function [x]=senosoidal(amplitud,frecuencia,fm,tiempo,fase)

%SENOSOIDAL crea una senosoidal


%
SENOSOIDAL(amp,fr,ph,samp,t) crea una senosoidal
%
amp = amplitud
%
fr = frecuencia
%
ph = fase
%
samp = frecuencia de muestreo
%
t = tiempo de muestreo
% Copyright (c) 2004 by Antonio Quintero
% $Revision: 1.1 $ $Date: 2004/20/06 19:12:36 $
for n=0:fm*tiempo-1
angulo=2*pi*frecuencia/fm;
x(n+1)=amplitud*sin((angulo*n)+fase);
% Como los vectores empiezan en 1, x arranca una
% posicin despus
end
Para verificar que la funcin senosoidal qued guardada en la carpeta Work, escribir pwd, esta
funcin devuelve todo el path de la funcin (D:\MATLAB6p5\Work\senosoidal.m) y al escribir
dir debe aparecer la funcin senosoidal.m
Siempre es importante tener en cuenta el teorema fundamental de muestreo el cual dice que
para representar digitalmente una seal que contiene componentes de frecuencia hasta x Hz
es necesario usar una frecuencia de muestreo de al menos 2x muestras por segundo.
Vamos ahora a analizar dos ondas senosoidales que solo varan en su frecuencia, las dos
seales van a tener los siguientes parmetros: una amplitud de 0.5, 1000 de frecuencia de
muestreo durante 1 segundo y con un ngulo de fase 0; las dos ondas solo se van a diferenciar
en sus frecuencias, una es a 440 Hz y la otra es a 441 Hz; se pide: graficar las ondas hasta
Nyquist y graficar sus correspondientes espectros.
Nota: Para poder representar digitalmente estas seales, la frecuencia de muestreo debera
ser como mnimo para 440 Hz, 880 Hz y para 441 Hz, 882 Hz, para nuestro ejemplo se esta
tomando solo la mitad de la frecuencia de muestreo, la cual es 500 Hz, esta frecuencia
corresponde a la frecuencia de Nyquist.
A una variable x1 se asigna el resultado de la funcin sinusoidal con todos sus parmetros

>> x1=senosoidal(0.5,440,500,1,0);
A una variable x2 se asigna el resultado de la funcin sinusoidal con todos sus parmetros
>> x2=senosoidal(0.5,441,500,1,0);
A una variable x se asigna el resultado de la suma de las dos ondas senosoidales
>> x=x1+x2;
A una variable xx se asigna el resultado de la multiplicacin de las dos ondas senosoidales
>> xx=x1.*x2;
Para poder graficar todas las ondas con sus resultados, se utiliza el comando
subplot(cantidad de figuras, posicin, numero de la figura), seguido del comando
plot(figura) y un ttulo para el grfico.
>> subplot(4,1,1),plot(x1),grid on,zoom,title('Onda Seno 440 Hz')

>> subplot(4,1,2),plot(x2),grid on,zoom,title('Onda Seno 441 Hz')


>> subplot(4,1,3),plot(x),grid on,zoom,title('Onda Seno 440 Hz + Onda Seno 441 Hz')
>> subplot(4,1,4),plot(xx),grid on,zoom,title('Onda Seno 440 Hz * Onda Seno 441 Hz')

Grficas de cada onda (440, 441, 440+441, 440*441)

Los siguientes son los sonidos que resultaron de la anterior prctica:

440
441

440+441

440*441

El siguiente paso corresponde al anlisis de los espectros de cada una de estas ondas.
Primero se asigna a una variable espx el valor absoluto de la transformada rpida de Fourier
de la funcin seno a 440 Hz almacenada anteriormente en la variable x1
>> espx1=abs(fft(x1));

Seguidamente se hace el mismo proceso para las otras ondas generadas.


>> espx2=abs(fft(x2));
>> espx=abs(fft(x));
>> espxx=abs(fft(xx));

Ahora se grafican las respuestas en una sola grfica


>> subplot(4,1,1),plot(espx1),grid on,zoom,title('Espectro Onda Seno 440 Hz')
>> subplot(4,1,2),plot(espx2),grid on,zoom,title('Espectro Onda Seno 441 Hz')
>> subplot(4,1,3),plot(espx),grid on,zoom,title('Espectro de la Onda Seno 440 Hz
+ Onda Seno 441 Hz')

>> subplot(4,1,4),plot(espxx),grid on,zoom,title('Espectro de la Onda Seno 440


Hz * Onda Seno 441 Hz')

Grficas de los espectros de cada onda (440, 441, 440+441, 440*441)

Las grficas expresan las simetras de las energas de todas las ondas.
Hay otra manera de graficar los espectros por medio de la funcin stem(varible), esta
funcin muestra la figura en forma de barras de tal manera que en algunos casos es ms fcil
observar que sucede en la grfica.
En la siguiente figura se muestra un zoom hecho en cada grfica con el fin de poder
establecer en que valores estn exactamente los espectros.
>> subplot(4,1,1),stem(espx1),grid on,zoom,title('Espectro Onda Seno 440 Hz')
>> subplot(4,1,2),stem(espx2),grid on,zoom,title('Espectro Onda Seno 441 Hz')
>> subplot(4,1,3),stem(espx),grid on,zoom,title('Espectro de la Onda Seno 440 Hz
+ Onda Seno 441 Hz')
>> subplot(4,1,4),stem(espxx),grid on,zoom,title('Espectro de la Onda Seno 440
Hz * Onda Seno 441 Hz')

Grficas de los espectros de cada onda (440, 441, 440+441, 440*441)

Ya con todos estos datos, se podra preguntar cul es la frecuencia de anlisis, definida por
la frecuencia de muestreo sobre la longitud de la seal y su intervalo de muestreo, definida a
su vez como la unidad sobre la frecuencia de muestreo.

Optimizacin del for


El proceso de convertir un bucle for en una operacin matricial o vectorial se llama vectorizar,
en MATLAB es importante evitar los bucles for si se usan para hacer operaciones sobre
elementos de un vector, en este caso la programacin es ineficiente debido a que los bucles
for son interpretados en Matlab lo cual hace lento el proceso, este bucle se debe utilizar como
ltima opcin, no con motivos de calculo, sino en operaciones de control solamente.
Hay algunas funciones definidas en MATLAB que son de mucha ayuda:
sum, se utiliza para sumar dos vectores.
zeros(m,n), es una matriz con ceros
ones(m,n), es una matriz con unos
Por ejemplo para sumar los elementos de un vector fila se puede obtener multiplicando dicho vector por un vector
columna de ceros.
Si se quiere crear una matriz que tenga 10 filas, donde cada una es una copia de x y el resultado se multiplica por un
vector fila x.

xx=ones(10,1)*x
%x es un vector fila de longitud L
%xx es una matriz formada por el producto externo 10XL

Condicionales
Los condicionales en MATLAB devuelven 0 si la condicin es falsa y 1 si la condicin es verdadero, son los siguientes

Eq Equal

==

ne Not equal

~=

lt Less than

<

gt Greater than

>

le Less than or equal

<=

ge Greater than or equal >=


Por ejemplo:
[1 2 3 4 5 6] < 4
devuelve
[1 1 1 0 0 0]

Vectorizar la funcin Clip


function [y]= clip (matriz, limite_inf,limite_sup)
%Versin relenta
%CLIP crea La funcin clip
% clip(x,lo,hi) recorta los elementos que se encuentran por encima del %limite
superior y por debajo del limite inferior de la matriz x .
% x = matriz o vector de entrada
% lo = lmite inferior
%hi = limite superior
% $Revision: 1.1 $ $Date: 2004/20/06 19:12:36 $
[M,N]= size(x);
for m:1:M
for n=1:N
if x(M,N)>hi
x(M,N)=hi
else
if x(M,N)< lo
x(M,N)=lo
end;
end;
y=x
Aqu se puede apreciar el siguiente problema, se est utilizando un doble for para recorrer todos los
elementos de la matriz.
Con las operaciones vectoriales se puede optimizar utilizando los condicionales que
devuelven true o false, o sea uno o cero, los cuales pueden ser empleados como valores

numricos y emplearlos como mascaras (a travs de la multiplicacin) para seleccionar partes


de la matriz x.
Por ejemplo ([x<=hi] +[x>hi]) es una tautologa y por lo tanto todos sus valores son 1
function [y]= clip (matriz, limite_inf,limite_sup)
%Versin rpida
%CLIP crea La funcin clip
% clip(x,lo,hi) recorta los elementos que se encuentran por encima del %limite
superior y por debajo del limite inferior de la matriz x .
% x = matriz o vector de entrada
% lo = lmite inferior
%hi = limite superior
% $Revision: 1.1 $ $Date: 2004/20/06 19:12:36 $
y= (x.*[x<=hi]) +(hi .*[x>hi]);
y= (y.*[x>=lo]) +(lo .*[x<lo]);
Para obtener ms comprensin se le recomienda al lector consultar el operador: escribiendo
help colon en el path de MATLAB, tambin si se quiere comparar el tiempo de ejecucin de las
funciones relenta y rpida, con la funcin etime y el nmero de operaciones en punto flotante
con la funcin flops.

Vectorizar la funcin Senosoidal


Originalmente ya habamos definido la funcin senosoidal de la siguiente forma:
function [x]=senosoidal(amplitud,frecuencia,fm,tiempo,fase)
%Versin con for
%SENOSOIDAL crea una senosoidal
% SENOSOIDAL(amp,fr,ph,samp,t) crea una senosoidal
% amp = amplitud
% fr = frecuencia
% ph = fase
% samp = frecuencia de muestreo
% t = tiempo de muestreo
% Copyright (c) 2004 by Antonio Quintero
% $Revision: 1.1 $ $Date: 2004/20/06 19:12:36 $
for n=0:fm*tiempo-1
angulo=2*pi*frecuencia/fm;
x(n+1)=amplitud*sin((angulo*n)+fase);
% Como los vectores empiezan en 1, x arranca una
% posicin despus
end
Optimizando la funcin este sera el resultado:
function [x]=senosoidal(amplitud,frecuencia,fm,tiempo,fase)
%Versin sin for

%SENOSOIDAL crea una senosoidal


% SENOSOIDAL(amp,fr,ph,samp,t) crea una senosoidal
% amp = amplitud
% fr = frecuencia
% ph = fase
% samp = frecuencia de muestreo
% t = tiempo de muestreo
% Copyright (c) 2004 by Antonio Quintero
% $Revision: 1.1 $ $Date: 2004/20/06 19:12:36 $
n=0:1:fm*tiempo-1;
angulo=2*pi*frecuencia/fm;
x(n+1)=amplitud*sin((angulo*n)+fase);

ANALISIS DE ONDAS
Efecto Clipping
El Clipping ocurre cuando una seal excede los lmites del diseo, causando distorsin por sus
altos componentes de frecuencia.

Onda seno dentro del rango [-1 1]

En la anterior grfica se puede apreciar que la seal no excede los lmites de una seal
sinusoidal, definida en el rango [-1,1]. En este caso la seal es exactamente una replica de la
seal de entrada.

Onda seno con valores fuera del rango [-1 1]

En la anterior grfica se puede apreciar cmo la onda sobrepasa los niveles para los cuales
est definida una onda senoidal. En este caso la seal sobrepaso los niveles de la seal de
entrada ocurriendo el efecto de Clipping.

Onda seno corregida

En esta grfica se puede ver cmo la seal se corrige, eliminando los componentes altos de
frecuencia, razn por la cual los componentes que estn por encima de 1 y por debajo de -1 se
pierden.

Manejo de archivos de sonido


Para capturar una seal por la entrada auxiliar de la tarjeta de sonido del computador, MATLAB
cuenta con la funcin wavrecord(t*Fs,Fs,Ch) cuyos parmetros corresponden al tiempo en
segundos de captura de la seal, frecuencia de muestreo (admite 8000, 11025, 22050 y
44100), el tipo de canal (1 para mono y 2 para estreo).
Si se desea capturar una seal en estreo con 5 segundos de duracin, con una frecuencia de
muestreo de 11.025 podemos emplear las siguientes funciones:

Fs = 11025;
y = wavrecord(5*Fs, Fs, 2);

Para guardar una seal capturada en formato wav se puede hacer uso de la funcin
wavwrite(y,Fs,NBits,'Nombre.wav') cuyos parmetros corresponden a la seal
grabada, la frecuencia de muestreo, el nmero de bits (puede ser 8, 16, 24 o 32) y el nombre
del archivo en el cual se grabar el sonido. Hay que tener en cuenta que los valores de
amplitud que estn fuera del rango [-1,+1] son clipeados.
Si no se especifican los NBits el programa asume por defecto 16 Bits.
Si no se determina una Fs, el programa asume por defecto 8000 Hz.
Por ejemplo, para guardar el sonido capturado anteriormente se emplear el siguiente
comando:

wavwrite(y,Fs,16,'sonido_uno.wav')
Para escuchar o manipular vectorialmente un sonido almacenado en formato wav se utilizan
dos comandos.

wavread('File.wav')
sound(Var)
Para el ejemplo anterior File es el nombre del archivo que se desea escuchar, los valores de
amplitud deben estar en el rango [-1,+1].
La variable Var corresponde al vector que se desea escuchar cuya frecuencia de muestreo por
defecto ser de 8192 Hz.
Si se utiliza sound(var,Fs) el resultado ser un sonido con una frecuencia de muestreo
definida por el usuario. Se asume que los valores estn dentro del rango [-1,1] ya que los
valores que estn fuera del rango son clipeados.
Si se emplea sound(var,Fs,Bits) sonar con una frecuencia de muestreo definida por el
usuario y determinados nmero de Bits por muestra.
Por ejemplo, para escuchar la seal guardada anteriormente como sonido_uno, se asigna a
una variable s el comando wavread y luego se escucha con el comando sound.

s= wavread('sonido_uno.wav');
sound(s,44100)
Si se desean conocer los datos de un archivo en formato wav, como los valores del vector, su
frecuencia de muestreo o el nmero de bits NBits por muestra, se emplea la siguiente
sintaxis:

[y,Fs,NBits]=wavread('file.wav')
En la variable y se almacenan los valores del vector, en la variable Fs se almacena la
frecuencia de muestreo y en la variable Nbits se almacena el nmero de bits por muestra del
archivo con formato wav. Si se desea saber la dimensin de los canales del archivo en formato
wav, se utiliza el siguiente comando:

siz=wavread('file.wav','size')
En la variable siz se almacena la dimensin del archivo en formato wav.
Si se desean leer las primeras N muestras del archivo en formato wav se emplea el siguiente
comando:

[n]=wavread('file.wav',Num)
En donde la variable Num corresponde a la cantidad de muestras que se desean tomar del
archivo.
Si se desea obtener la informacin adicional contenida en un archivo de formato wav, como el
copyright
o
el
ttulo,
se
emplea
el
siguiente
comando

[y,Fs,NBits,Opts]=wavread('file.wav')

En la variable y se almacenan los valores del vector, en la variable Fs se almacena la


frecuencia de muestreo, en la variable Nbits se almacena el nmero de bits por muestra y en
la variable Opts se almacena el resto de la informacin.

FFT
Si

se

(Transformada Rpida de Fourier)


desea

obtener

la

transformada

rpida

de

Fourier,

se

utiliza

la

sentencia

x=abs(fft(vector a trabajar)) en donde abs se refiere al valor absoluto o a la


magnitud. Por su parte fft(x) es la transformada discreta de Fourier de un vector x.
Los archivos violin.wav y flauta.wav se almacenaron anteriormente con el comando
wavwrite. Se necesita hacer una grfica espectral de sus seales, adems se desea saber
cul fue el tamao de las muestras y si las seales capturadas tienen uno o dos canales
(Dimensin Vectorial).

v=wavread('violin.wav');
f=wavread('flauta.wav');
sound(v)
sound(f)
espv=abs(fft(v));
espf=abs(fft(f));
subplot(2,1,1),plot(espv),grid on,zoom,title('Espectro de un violin')
subplot(2,1,2),plot(espf),grid on,zoom,title('Espectro de una flauta')

Espectros de las ondas de violn y flauta


En las grficas se pueden observar la cantidad de componentes armnicas para estos dos
instrumentos.

Tamao de cada muestra


length(v) retorna 42860
retorna 97064

Dimensin vectorial
size(v) retorna 42860X1, lo que indica que es length(f)
una seal monofnica.
size(f) retorna 97064X1, lo que indica que es una seal
monofnica.

Convolucin
Si se desea obtener la Convolucin entre dos vectores (seales) se utiliza la funcin
conv(Vector1, vector2).
Los archivos chivo.wav y shamen.wav se almacenaron anteriormente con un editor de
ondas. Se necesita hacer una grfica de la convolucin de estas dos seales.
chivo=wavread('chivo.wav');
shamen=wavread('shamen.wav');
convolucion=conv(chivo,shamen);
subplot(3,1,1),plot(chivo),title('chivo.wav'),grid on, zoom on
subplot(3,1,2),plot(shamen),title('shamen.wav'),grid on, zoom on
subplot(3,1,3),plot(convolucion),title('convolucion.wav'),grid on, zoom on

Espectros de las ondas chivo, shamen y su convolucin


Se deja al estudiante la grabacin del resultado de la convolucin en un archivo de sonido. Puede descargar el archivo
de muestra.
Otro Ejemplo:
Los archivos voice.wav y take.wav se almacenaron anteriormente con un editor de ondas. Se necesita hacer una grfica
de la convolucin de estas dos seales.

voice=wavread('voice.wav');
take=wavread('take.wav');
convolucion=conv(voice,take);
subplot(3,1,1),plot(voice),title('Voice.wav'),grid on, zoom on
subplot(3,1,2),plot(take),title('Take.wav'),grid on, zoom on
subplot(3,1,3),plot(Convolucion),title('convolucion.wav'),grid on, zoom on

Espectros de las ondas voice, take y su convolucin


Se deja al estudiante la grabacin del resultado de la convolucin en un archivo de sonido. Puede descargar el archivo
de muestra.

Deconvolucin
Si se desea obtener la deconvolucin de dos vectores (seales) se utiliza la funcin deconv(Vector1, vector2) en
donde Vector1 es el vector que tiene la seal compleja (convolucionada) y Vector2 es el vector que se desea extraer de
la seal compleja (convolucin).
Los archivos aplausos.wav y dingdong.wav se almacenaron anteriormente con un editor de ondas. Estas dos seales se
convolucionaron obtenindose una seal compleja. Se dese extraer el sonido del Aplauso de tal manera que solo quede
el sonido del Ding Dong. Una vez hecho esto graficar todas las seales involucradas.
aplausos=wavread('aplausos.wav');
ding_dong=wavread('dingdong.wav');
convolucion=conv(aplauso,ding_dong);
deconvolucion= deconv(convolucion, aplausos);
subplot(4,1,1),plot(aplausos),title('aplausos.wav'),grid on, zoom on
subplot(4,1,2),plot(ding_dong),title('dingdong.wav'),grid on, zoom on
subplot(4,1,3),plot(convolucion),title('convolucion'),grid on, zoom on
subplot(4,1,4),plot(deconvolucion),title('deconvolucion del sonido aplausos, queda el sonido ding dong'),grid on, zoom
on

Espectros de las ondas ding dong, aplausos, su convolucin y la extraccin por deconvolucin
Compare la grfica del ding dong con la grfica despus de la convolucin.
Se deja al estudiante la grabacin del resultado de la deconvolucin en un archivo de sonido. Puede descargar el
archivo de muestra.

Ventaneo
Se utiliza con el fin de evitar que las discontinuidades introducidas al analizar solo una fraccin de la seal o al introducir
muestras con valor de cero introduzcan componentes de alta frecuencia en el espectro, que son mas bien un artificio de
las discontinuidades introducidas y no de la seal. Ya que la transformada rpida de Fourier asume que la seal es
peridica, es conveniente siempre hacerle un procedimiento de ventaneo a la seal con la que se quiere trabajar.

MATLAB cuenta con diferentes tipos de ventanas como:

Hamming
Hanning

Bartlett

Blackman

Boxcar

Triangular

Gauss

Blackmanharris

Kaiser

Dolph-Chebyshev

Ventana Hamming
w=wavread('danih.wav');
h=hamming(length(w));
x=w.*h;
subplot(3,1,1),plot(w),grid on, zoom,title('hola.wav')
subplot(3,1,2),plot(h),grid on, zoom,title('ventana hamming')
subplot(3,1,3),plot(x),grid on, zoom,title('multiplicacion de hola con la ventana hamming')

Sonido y resultado despus de pasarlo pro la ventana Hamming


Ahora visualizamos el espectro
esp=abs(fft(x);
plot(esp),title('Espectro con la Ventana Hamming'),grid on, zoom on

Ventana Hanning

w=wavread('danih.wav');
h=hanning(length(w));
x=w.*h;
subplot(3,1,1),plot(w),grid on, zoom,title('hola.wav')
subplot(3,1,2),plot(h),grid on, zoom,title('ventana hanning')
subplot(3,1,3),plot(x),grid on, zoom,title('multiplicacion de hola con la ventana hanning')

Sonido y resultado despus de pasarlo pro la ventana Hanning

Ahora visualizamos el espectro

esp=abs(fft(x);
plot(esp),title('Espectro con la Ventana Hanning'),grid on, zoom on

Espectro del sonido despus de pasarlo por la ventana


Compare el sonido original con el sonido resultante

Ventana Bartlett
w=wavread('danih.wav');
h=bartlett(length(w));
x=w.*h;
subplot(3,1,1),plot(w),grid on, zoom,title('hola.wav')
subplot(3,1,2),plot(h),grid on, zoom,title('ventana bartlett')
subplot(3,1,3),plot(x),grid on, zoom,title('multiplicacion de hola con la ventana bartlett')

Sonido y resultado despus de pasarlo pro la ventana Bartlett


Ahora visualizamos el espectro
esp=abs(fft(x);
plot(esp),title('Espectro con la Ventana Bartlett'),grid on, zoom on

Espectro del sonido despus de pasarlo por la ventana


Compare el sonido original con el sonido resultante

Ventana Blackman
w=wavread('danih.wav');
h=blackman(length(w));
x=w.*h;
subplot(3,1,1),plot(w),grid on, zoom,title('hola.wav')
subplot(3,1,2),plot(h),grid on, zoom,title('ventana blackman')
subplot(3,1,3),plot(x),grid on, zoom,title('multiplicacion de hola con la ventana blackman')

Sonido y resultado despus de pasarlo pro la ventana Blackman


Ahora visualizamos el espectro
esp=abs(fft(x);
plot(esp),title('Espectro con la Ventana Blackman'),grid on, zoom on

Espectro del sonido despus de pasarlo por la ventana


Compare el sonido original con el sonido resultante

Ventana Boxcar
w=wavread('danih.wav');
h=boxcar(length(w));
x=w.*h;
subplot(3,1,1),plot(w),grid on, zoom,title('hola.wav')
subplot(3,1,2),plot(h),grid on, zoom,title('ventana boxcar')
subplot(3,1,3),plot(x),grid on, zoom,title('multiplicacion de hola con la ventana boxcar')

Sonido y resultado despus de pasarlo pro la ventana Boxcar


Ahora visualizamos el espectro
esp=abs(fft(x);
plot(esp),title('Espectro con la Ventana Boxcar'),grid on, zoom on

Espectro del sonido despus de pasarlo por la ventana


Compare el sonido original con el sonido resultante

Ventana Triangular
w=wavread('danih.wav');
h=triang(length(w));
x=w.*h;
subplot(3,1,1),plot(w),grid on, zoom,title('hola.wav')
subplot(3,1,2),plot(h),grid on, zoom,title('ventana triangular')
subplot(3,1,3),plot(x),grid on, zoom,title('multiplicacion de hola con la ventana triangular')

Sonido y resultado despus de pasarlo pro la ventana Triangular


Ahora visualizamos el espectro
esp=abs(fft(x);
plot(esp),title('Espectro con la Ventana Triangular'),grid on, zoom on

Espectro del sonido despus de pasarlo por la ventana


Compare el sonido original con el sonido resultante

Ventana Gauss
w=wavread('danih.wav');
h=gausswin(length(w));
x=w.*h;
subplot(3,1,1),plot(w),grid on, zoom,title('hola.wav')
subplot(3,1,2),plot(h),grid on, zoom,title('ventana gausswin')
subplot(3,1,3),plot(x),grid on, zoom,title('multiplicacion de hola con la ventana de Gauss')

Sonido y resultado despus de pasarlo pro la ventana Gausswin


Compare el sonido original con el sonido resultante

Ventana Blackmanharris
w=wavread('danih.wav');
h=blackmanharris(length(w));
x=w.*h;
subplot(3,1,1),plot(w),grid on, zoom,title('hola.wav')
subplot(3,1,2),plot(h),grid on, zoom,title('ventana blackmanharris')
subplot(3,1,3),plot(x),grid on, zoom,title('multiplicacion de hola con la ventana blackmanharris')

Sonido y resultado despus de pasarlo pro la ventana blackmanharris


Compare el sonido original con el sonido resultante

Ventana Kaiser
w=wavread('danih.wav');
h=kaiser(length(w), 0.2);
x=w.*h;
subplot(3,1,1),plot(w),grid on, zoom,title('hola.wav')
subplot(3,1,2),plot(h),grid on, zoom,title('ventana kaiser')
subplot(3,1,3),plot(x),grid on, zoom,title('multiplicacion de hola con la ventana kaiser')

Sonido y resultado despus de pasarlo pro la ventana kaiser


Ahora visualizamos el espectro
esp=abs(fft(x);
plot(esp),title('Espectro con la Ventana kaiser'),grid on, zoom on

Espectro del sonido despus de pasarlo por la ventana


Compare el sonido original con el sonido resultante

Ventana Dolph-Chebyshev
w=wavread('danih.wav');
h=chebwin(length(w), 10);
x=w.*h;
subplot(3,1,1),plot(w),grid on, zoom,title('hola.wav')
subplot(3,1,2),plot(h),grid on, zoom,title('ventana Dolph-Chebyshev')
subplot(3,1,3),plot(x),grid on, zoom,title('multiplicacion de hola con la ventana de Dolph-Chebyshev')

Sonido y resultado despus de pasarlo pro la ventana Dolph-Chebyshev


Ahora visualizamos el espectro
esp=abs(fft(x);
plot(esp),title('Espectro con la Ventana Dolph-Chebyshev'),grid on, zoom on

Espectro del sonido despus de pasarlo por la ventana


Compare el sonido original con el sonido resultante

Espectro del sonido despus de pasarlo por la ventana


Compare el sonido original con el sonido resultante