tutorial basico para el manejo de señales con matlab_3

29
TUTORIAL BASICO PARA EL MANEJO DE SEÑALES CON MATLAB Introducción MATLAB significa "MATrix LABoratory". Es un programa para cálculo técnico y científico; sus cálculos numéricos se hacen en forma matricial y dada su gran capacidad para realizar diferentes gráficos en dos y tres dimensiones y un lenguaje de programación propio se ha posicionado como una de las herramientas de mayor uso por parte de la comunidad técnica y científica. MATLAB es un entorno de computación y desarrollo de aplicaciones totalmente integrado orientado para llevar a cabo proyectos en donde se encuentren implicados elevados cálculos matemáticos y la visualización gráfica de los mismos. MATLAB integra análisis numérico, cálculo matricial, proceso de señal y visualización gráfica en un entorno completo donde los problemas y sus soluciones son expresados del mismo modo en que se escribirían tradicionalmente, sin necesidad de hacer uso de programación tradicional, es por esto que MATLAB es una excelente herramienta de alto nivel para desarrollar aplicaciones técnicas, es fácil 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 número de funciones incorporadas en el programa principal. Estos Toolboxes cubren en la actualidad prácticamente casi todas las áreas principales en el mundo de la ingeniería y la simulación, por ejemplo están los 'toolbox' para proceso de imágenes, procesamiento digital de señales, control robusto, estadística, análisis financiero, matemáticas simbólicas, redes neurales, lógica difusa, entre otros. Combinando MATLAB con Signal Processing Toolbox, Wavelet Toolbox y un conjunto de herramientas complementarias, se puede crear un ambiente de análisis personalizado de señales y desarrollo de algoritmos DSP. Para simulación 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 código C para su hardware designado. MATLAB integra todos los requisitos claves de un sistema de computación técnico: cálculo numérico, gráficos, herramientas para aplicaciones específicas y capacidad de ejecución en múltiples plataformas como Windows 95/98/XP/NT, Macintosh, Unix y Linux. Objetivo Introducir al estudiante tanto de pregrado como de la especialización de la Carrera de Composición con Medios Electroacústicos de la Universidad Nacional de Quilmes en el manejo correcto de MATLAB, ya que esta herramienta proporciona al estudiante un medio de carácter único, para resolver los problemas más complejos y difíciles.

Upload: christianc15

Post on 28-Sep-2015

223 views

Category:

Documents


1 download

DESCRIPTION

Tutorial Basico Para El Manejo de Señales Con Matlab_3

TRANSCRIPT

TUTORIAL BASICO PARA EL MANEJO DE SEALES CON MATLABIntroduccin

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 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 13Command 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:FinalPara ms informacin digitar en el prompt help colonSi 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 x2Definicin 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 forEl 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

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

EqEqual==

neNot equal~=

ltLess than

leLess than or equal=

Por ejemplo:

[1 2 3 4 5 6] < 4

devuelve

[1 1 1 0 0 0]

Vectorizar la funcin Clipfunction [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 ([xhi]) 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.*[xhi]); y= (y.*[x>=lo]) +(lo .*[x