Tutorial Laboratorio Pds Matlab 23884

42
| Introducción | Objetivo | 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 especificas y capacidad de ejecución en múltiples plataformas como Windows 95/98/XP/NT, Macintosh, Unix y Linux. Volver al inicio 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. Volver al inicio

description

PROSESAMIENTO DIGITAL DE SEÑALES

Transcript of Tutorial Laboratorio Pds Matlab 23884

Page 1: Tutorial Laboratorio Pds Matlab 23884

| Introducción | Objetivo |

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 especificas y capacidad de ejecución en múltiples plataformas como Windows 95/98/XP/NT, Macintosh, Unix y Linux.

Volver al inicio

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.

Volver al inicio

La Interfase de Matlab

Page 2: Tutorial Laboratorio Pds Matlab 23884

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 símbolo >>, por defecto este símbolo 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 inglés answer) con sus correspondientes longitudes o tamaños.

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, razón por la cual al crear un directorio en otra posición del disco duro, hay que buscarlo y posicionarse en él por medio del Current Directory.

Volver al inicio

Operaciones básicas con Matlab

En el siguiente apartado se expondran los elementos básicos para tener en cuenta al momento de trabajar con Matlab.

Vectores y Matrices Cálculos Creación de vectores y matrices Operaciones Gráficos

Primero es importante resaltar algunas particularidades del programa:

Matlab es dependiente del contexto, es decir, las letras mayúsculas y minúsculas 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 función, como por ejemplo ejemplo: title('Esta gráfica corresponde a una señal digital'). En un teclado español estándar este caracter se encuentra en la tecla de la interrogación.

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 instrucción se emplea para indicar a MATLAB que realice el cálculo 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 información más detallada en cuanto a la sintaxis y comandos, basta con escribir help seguido del comando en el prompt. Ejemplo: help plot

Page 3: Tutorial Laboratorio Pds Matlab 23884

Volver al inicio

Vectores y Matrices

Dado que Matlab fue programado para análisis matricial, se hace indispensable hablar sobre los conceptos básicos de los vectores y matrices.

Una matriz es un arreglo rectangular de números y su tamaño esta dado por m x n, siendo m el número de filas y n el número de columnas.

Arreglo Matricial

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

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

Vector Fila

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

Vector Columna

Para sumar dos matrices es condición necesaria que sean de igual tamaño. Para multiplicarlas es necesario que el número de columnas de la primera sea igual al número de columnas de la segunda.

Para multiplicar una matriz por un vector, la longitud de la fila de la matriz (es decir, el número 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

Cálculos

Page 4: Tutorial Laboratorio Pds Matlab 23884

Las operaciones o cálculos que no se asignan a una variable específica, se asignan por defecto a la variable ans (answer).

>>7+10+3 ans = 20

Las operaciones se evalúan por orden de prioridad: primero las potencias, después las multiplicaciones y divisiones y, finalmente, las sumas y restas. Las operaciones de igual prioridad se evalúan de izquierda a derecha:

>>10/2*4 ans = 20 >>10/(2*4) ans = 1.2500

En el siguiente ejemplo se genera un matriz de dimensión 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, más 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 dimensión del arreglo, se umplea el comando size(variable)

>> size(x); ans= 1 1

La operación x=7 en el área de trabajo de Matlab se vería de la siguinte forma

Ventana de trabajo

Page 5: Tutorial Laboratorio Pds Matlab 23884

Obsérvese que en la ventana Command Window se realizaron tres ejecuciones: la asignación valor a la variable x (x=7), la ejecución del comando length y la ejecución 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 tamaño de las variables, por ejemplo la dimensión de x es 1x1.

Volver al inicio

Creación 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 paréntesis la posición. En el siguiente ejemplo se asigna el valor de la posición 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 cambiaría el parámetro 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 parámetro de la fila por el caracter : con lo cual se indica que corresponde a todas las filas.

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

Creación de Rangos

La definición de rangos en Matlab se especifica según la sintaxis Variable = Cominezo : Intervalo : Final

Page 6: Tutorial Laboratorio Pds Matlab 23884

Para mas información 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 declaración

>> 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, división y multiplicación utilizan los operadores +, -, /, * respectivamente.

Suma de vectores

>>vector1= [1 2 3 ]; >> vector2= [3 4 5;]; >> suma= vector1 + vector2 ans = [4 6 8]

Multiplicación 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

Transposición de vectores

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

Volver al inicio

Gráficos

Consideremos el ejemplo de graficar la función 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; 

Page 7: Tutorial Laboratorio Pds Matlab 23884

>> plot (y),title(' Grafica de la función x^2') >> grid on %permite visualizar las cuadriculas

Gráfica de x2

Volver al inicio

Definición 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 están definidas en un archivo de este tipo en un directorio especial.

También 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 términos de otras funciones existentes. Es importante tener en cuenta que toda función 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 función (Parámetros de entrada) % información que se presentará como ayuda % con el comando help 'Nombre de la función' 

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.

Page 8: Tutorial Laboratorio Pds Matlab 23884

A diferencia de los lenguajes de programación formales, Matlab permite más de una variable de salida. Para retornar este valor no se emplea algún comando como return sino que se asigna dicho nombre de variable durante la ejecución al dato que se desea retornar.

[suma, resta, multiplicacion, division]=comandos(var_a, var_b) %COMANDOS retorna la suma, resta, multiplicación y división 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 multiplicación     división = resultado de la división 

% $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 función anterior no se indicara esto entonces se presentarían todos los coamdnos durante la ejecución de la rutina.

Volver al inicio

 

Análisis de una Onda Seno

Para poder generar ondas senosoidales que involucren parámetros tales como amplitud, frecuencia, frecuencia de muestreo, tiempo y ángulo de fase, hay que definir la función senosoidal. El siguiente es el cuerpo de la función.

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 % posición después end

Para verificar que la función senosoidal quedó guardada en la carpeta Work, escribir pwd, esta función devuelve todo el path de la función (D:\MATLAB6p5\Work\senosoidal.m) y al escribir dir debe aparecer la función senosoidal.m

Siempre es importante tener en cuenta el teorema fundamental de muestreo el cual dice que para representar digitalmente una señal 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 varían en su frecuencia, las dos señales van a tener los siguientes parámetros: una amplitud de 0.5, 1000 de frecuencia de muestreo durante 1 segundo

Page 9: Tutorial Laboratorio Pds Matlab 23884

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 señales, la frecuencia de muestreo debería ser como mínimo 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 función senosoidal con todos sus parámetros

>> x1=senosoidal(0.5,440,500,1,0);

A una variable x2 se asigna el resultado de la función senosoidal con todos sus parámetros

>> 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 multiplicación 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, posición, numero de la figura), seguido del comando plot(figura) y un título para el gráfico.

>> 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')

Page 10: Tutorial Laboratorio Pds Matlab 23884

Gráficas de cada onda (440, 441, 440+441, 440*441)

Los siguientes son los sonidos que resultaron de la anterior práctica:

440 441 440+441 440*441

El siguiente paso corresponde al análisis de los espectros de cada una de estas ondas.

Primero se asigna a una variable espx el valor absoluto de la transformada rápida de Fourier de la función 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 gráfica

>> 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')

Page 11: Tutorial Laboratorio Pds Matlab 23884

Gráficas de los espectros de cada onda (440, 441, 440+441, 440*441)

Las gráficas expresan las simetrías de las energias de todas las ondas.

Hay otra manera de graficar los espectros por medio de la función stem(varible), esta función muestra la figura en forma de barras de tal manera que en algunos casos es más fácil observar que sucede en la gráfica.

En la siguiente figura se muestra un zoom hecho en cada gráfica con el fin de poder establecer en que valores están 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')

Page 12: Tutorial Laboratorio Pds Matlab 23884

Gráficas de los espectros de cada onda (440, 441, 440+441, 440*441)

Ya con todos estos datos, se podría preguntar cuál es la frecuencia de análisis, definida por la frecuencia de muestreo sobre la longitud de la señal y su intervalo de muestreo, definida a su vez como la unidad sobre la frecuencia de muestreo.

Volver al inicio

Optimización del   for

El proceso de convertir un bucle for en una operación 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 programación 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 opción, 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.

Page 13: Tutorial Laboratorio Pds Matlab 23884

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 condición es falsa y 1 si la condición 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 función Clip

function [y]= clip (matriz, limite_inf,limite_sup) 

%Versión relenta %CLIP crea La función 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 = límite 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 numéricos y emplearlos como mascaras (a través de la multiplicación) para seleccionar partes de la matriz x.

Por ejemplo ([x<=hi] +[x>hi]) es una tautología y por lo tanto todos sus valores son 1

Page 14: Tutorial Laboratorio Pds Matlab 23884

function [y]= clip (matriz, limite_inf,limite_sup) 

%Versión rápida %CLIP crea La función 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 = límite 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 más comprensión se le recomienda al lector consultar el operador : escribiendo help colon en le path de MATLAB, también si se quiere comparar el tiempo de ejecución de las funciones relenta y rápida, con la función etime y el número de operaciones en punto flotante con la función flops.

Vectorizar la función Senosoidal

Originalmente ya habiamos definido la función senosoidal de la siguiente forma:

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

%Versión 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 % posición después end

Optimizando la función este sería el resultado:

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

%Versión 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);

Page 15: Tutorial Laboratorio Pds Matlab 23884

Efecto Clipping

El Clipping ocurre cuando una señal excede los límites del diseño, causando distorsión por sus altos componentes de frecuencia.

Onda seno dentro del rango [-1 1]

En la anterior gráfica se puede apreciar que la señal no excede los límites de una señal sinusoidal, definida en el rango [-1,1]. En este caso la señal es exactamente una replica de la señal de entrada.

Page 16: Tutorial Laboratorio Pds Matlab 23884

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

En la anterior gráfica se puede apreciar cómo la onda sobrepasa los niveles para los cuales está definida una onda senosoidal. En este caso la señal sobrepaso los niveles de la señal de entrada ocurriendo el efecto de Clipping.

Onda seno corregida

Page 17: Tutorial Laboratorio Pds Matlab 23884

En esta gráfica se puede ver cómo la señal se corrige, eliminando los componentes altos de frecuencia, razón por la cual los componentes que están por encima de 1 y por debajo de -1 se pierden.

Manejo de archivos de sonido

Para capturar una señal por la entrada auxiliar de la tarjeta de sonido del computador, MATLAB cuenta con la función wavrecord(t*Fs,Fs,Ch) cuyos parámetros corresponden al tiempo en segundos de captura de la señal, 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 señal en stereo con 5 segundos de duración, con una frecuencia de muestreo de 11.025 podemos emplear las siguients funciones:

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

Para guardar una señal capturada en formato wav se puede hacer uso de la función wavwrite(y,Fs,NBits,'Nombre.wav') cuyos parámetros corresponden a la señal grabada, la frecuencia de muestreo, el número 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 estén 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 están dentro del rango [-1,1] ya que los valores que están fuera del rango son clipeados.

Si se emplea sound(var,Fs,Bits) sonará con una frecuencia de muestreo definida por el usuario y determinados número de Bits por muestra.

Por ejemplo, para escuchar la señal 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 número de bits NBits por muestra, se emplea la siguientes sintaxis:

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

Page 18: Tutorial Laboratorio Pds Matlab 23884

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 número de bits por muestra del archivo con formato wav. Si se desea saber la dimensión 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 dimensión 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 información adicional contenida en un archivo de formato wav, como el copyright o el título, 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 número de bits por muestra y en la variable Opts se almacena el resto de la información.

FFT

Si se desea obtener la transformada rápida 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 gráfica espectral de sus señales, además se desea saber cuál fue el tamaño de las muestras y si las señales capturadas tienen uno o dos canales (Dimensión 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')

Page 19: Tutorial Laboratorio Pds Matlab 23884

Espectros de las ondas de violín y flauta

En las gráficas se pueden observar la cantidad de componentes armónicas para estos dos instrumentos.

Tamaño de cada muestra length(v) retorna 42860 length(f) retorna 97064 Dimensión vectorial size(v) retorna 42860X1, lo que indica que es una señal monofónica. size(f) retorna 97064X1, lo que indica que es una señal monofónica

Convolución

Si se desea obtener la Convolución entre dos vectores (señales) se utiliza la función conv(Vector1, vector2).

Los archivos chivo.wav y shamen.wav se almacenaron anteriormente con un editor de ondas. Se necesita hacer una gráfica de la convolución de estas dos señales.

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

Page 20: Tutorial Laboratorio Pds Matlab 23884

Espectros de las ondas chivo, shamen y su convolución

Se deja al estudiante la grabación del resultado de la convolución 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 gráfica de la convolución de estas dos señales.

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

Page 21: Tutorial Laboratorio Pds Matlab 23884

Espectros de las ondas voice, take y su convolución

Se deja al estudiante la grabación del resultado de la convolución en un archivo de sonido. Puede descargar el archivo de muestra.

Deconvolución

Si se desea obtener la deconvolución de dos vectores (señales) se utiliza la función deconv(Vector1, vector2) en donde Vector1 es el vector que tiene la señal compleja (convolucionada) y Vector2 es el vector que se desea extraer de la señal compleja (convolución).

Los archivos aplausos.wav y dingdong.wav se almacenaron anteriormente con un editor de ondas. Estas dos señales se convolucionaron obteniéndose una señal 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 señales 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

Page 22: Tutorial Laboratorio Pds Matlab 23884

Espectros de las ondas ding dong, aplausos, su convolución y la extracción por deconvolución

Compare la gráfica del ding dong con la gráfica después de la convolución.

Se deja al estudiante la grabación del resultado de la deconvolución 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 fracción de la señal 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 señal. Ya que la transformada rápida de Fourier asume que la señal es periódica, es conveniente siempre hacerle un procedimiento de ventaneo a la señal 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

Page 23: Tutorial Laboratorio Pds Matlab 23884

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 después 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

Page 24: Tutorial Laboratorio Pds Matlab 23884

Espectro del sonido después 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')

Page 25: Tutorial Laboratorio Pds Matlab 23884

Sonido y resultado después 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

Page 26: Tutorial Laboratorio Pds Matlab 23884

Espectro del sonido después 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')

Page 27: Tutorial Laboratorio Pds Matlab 23884

Sonido y resultado después 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

Page 28: Tutorial Laboratorio Pds Matlab 23884

Espectro del sonido después 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')

Page 29: Tutorial Laboratorio Pds Matlab 23884

Sonido y resultado después 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

Page 30: Tutorial Laboratorio Pds Matlab 23884

Espectro del sonido después 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')

Page 31: Tutorial Laboratorio Pds Matlab 23884

Sonido y resultado después 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

Page 32: Tutorial Laboratorio Pds Matlab 23884

Espectro del sonido después 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')

Page 33: Tutorial Laboratorio Pds Matlab 23884

Sonido y resultado después 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

Page 34: Tutorial Laboratorio Pds Matlab 23884

Espectro del sonido después 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')

Page 35: Tutorial Laboratorio Pds Matlab 23884

Sonido y resultado después 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')

Page 36: Tutorial Laboratorio Pds Matlab 23884

Sonido y resultado después 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')

Page 37: Tutorial Laboratorio Pds Matlab 23884

Sonido y resultado después 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

Page 38: Tutorial Laboratorio Pds Matlab 23884

Espectro del sonido después 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')

Page 39: Tutorial Laboratorio Pds Matlab 23884

Sonido y resultado después 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

Page 40: Tutorial Laboratorio Pds Matlab 23884

Espectro del sonido después de pasarlo por la ventana

Compare el sonido original con el sonido resultante