Anda di halaman 1dari 40

| Introduccin | Objetivo |

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 Real-Time 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 especificas y capacidad de ejecucin en mltiples plataformas
como Windows 95/98/XP/NT, Macintosh, Unix y Linux.
Volver al inicio

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.
Volver al inicio

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.
Volver al inicio

Operaciones bsicas con Matlab


En el siguiente apartado se expondran 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 caracter se encuentra en la tecla de la interrogacin.

El signo = se emplea para asignar un valor a una variable. Ejemplo: y=5 (En la varibale 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 caracter %. 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
Volver al inicio

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.
Volver al inicio

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 umplea el comando size(variable)

>> size(x);
ans= 1 1
La operacin x=7 en el rea de trabajo de Matlab se vera de la siguinte 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.
Volver al inicio

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=
123
456
789

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 inicada 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 mas 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
Volver al inicio

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
Volver al inicio

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
Volver al inicio

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 caracter ; 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
coamdnos durante la ejecucin de la rutina.
Volver al inicio

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 senosoidal con todos sus parmetros
>> x1=senosoidal(0.5,440,500,1,0);
A una variable x2 se asigna el resultado de la funcin senosoidal 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 energias 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 espectro.
>> 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.
Volver al inicio

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
zeros(m,n),
es
ones(m,n), es una matriz con unos

para
una

sumar
matriz

dos
con

vectores.
ceros

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
ne
lt
gt
le
ge

Equal
Not equal
Less than
Greater than
Less than or equal
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 condiconales 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 le 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 habiamos 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);

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 senosoidal. 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 stereo).
Si se desea capturar una seal en stereo con 5 segundos de duracin, con una frecuencia de muestreo
de 11.025 podemos emplear las siguients 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
Si no se determina una Fs, el programa asume por defecto 8000 Hz.

por

defecto

16

Bits.

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 siguientes 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 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
length(v) retorna
length(f) retorna
Dimensin
size(v)
retorna
42860X1,
lo
que
indica
que
es
size(f) retorna 97064X1, lo que indica que es una seal monofnica

una

seal

muestra
42860
97064
vectorial
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

Espectro del sonido despus de pasarlo por la ventana


Compare el sonido original con el sonido resultante

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