TUTORIAL DE SEÑALES EN MATLAB

March 20, 2018 | Author: Stefany Florez | Category: Convolution, Euclidean Vector, Integral, Mathematical Objects, Algebra
Share Embed Donate


Short Description

Download TUTORIAL DE SEÑALES EN MATLAB...

Description

TUTORIAL DE SEÑALES EN MATLAB

SEÑALES ELEMENTALES El objeto básico usado en MATLAB es una matriz numérica con la posibilidad de almacenar números complejos. Los datos encontrados en el estudio de señales y sistemas son siempre, muy bien representados en forma de matrices. En esta sección se usará MATLAB para la generación de señales elementales como lo son las señales exponenciales, senoidales, etc. El ToolBox de procesamiento de señales de MATLAB posee una larga variedad de funciones para la generación de señales, estas señales requieren de una representación vectorial de la variable tiempo, de manera continua o discreta. Para realizar una simulación de un intervalo continuo, se usa un vector de valores discretos con un intervalo de muestreo muy pequeño. El siguiente comando genera un vector llamado t de valores que representan la variable tiempo, con un intervalo de muestreo de 1ms entre 0 y 1seg. t = 0:0.001:1; Para generar un vector llamado n de valores que representan la variable tiempo para una señal discreta en el intervalo de 0 a 1000, se puede usar el siguiente comando. n = 0:1000; Después de creado el vector que representa la variable tiempo, es posible iniciar el desarrollo de alguna señal de interés. En MATLAB una señal discreta en el tiempo se representa exactamente, porque los valores de la señal son representados como los elementos de un vector. Sin embargo las señales de tiempo continuo en MATLAB son tan solo aproximaciones. La aproximación consiste de un vector cuyos elementos son muestras de la verdadera señal de tiempo continuo. Cuando se usa esta técnica para la representación de señales continuas es importante escoger el intervalo de muestreo lo suficientemente pequeño para asegurar que las muestras capturan todos los detalles de la señal. SEÑALES PERIODICAS La generación de señales periódicas tales como ondas cuadradas y triangulares es una actividad muy fácil de realizar en MATLAB. Consideremos primero la generación de una onda cuadrada de amplitud A, frecuencia fundamental w (medida en radianes por segundo) y ciclo útil rho. Recordemos que el ciclo útil es la fracción de cada periodo en donde la señal es positiva. Para generar dicha señal se puede usar el siguiente conjunto de comandos: >> A = 1; >> w = 10 * pi;

>> >> >> >>

rho = 0.5; t = 0:0.001:1; sq = A*square(w*t+rho); plot(t,sq);

El resultado se puede observar en la siguiente gráfica:

En la segunda línea, pi es una función interna de matlab que calcula el número más cercano a la constante PI en formato de coma flotante. El último comando es usado para ver la señal generada. El comando plot dibuja líneas conectando los valores sucesivos de la señal y así da la apariencia de una señal en tiempo continuo. Consideremos ahora la generación de una onda triangular de amplitud A, frecuencia fundamental w y ancho Wdt . El periodo de la onda triangular será T con el máximo valor de la señal ocurriendo en t = WT . El comando básico para generar esta señal es: A * sawtooth(w * t + Wdt)

El listado complete de comandos sería: >> >> >> >> >> >>

A = 1; w = 10 * pi; Wdt = 0.5; t = 0:0.001:1; tri = A*sawtooth(w * t + Wdt); plot(t,tri);

El resultado se puede visualizar en la siguiente gráfica. Como se menciono anteriormente, una señal generada en MATLAB es inherentemente de naturaleza discreta. Para visualizar una señal en tiempo discreto se puede hacer uso del comando stem. Específicamente stem( n , x ),bosqueja los datos contenidos en el vector x como una señal de tiempo discreto con los valores de tiempo definidos por el vector n. Los vectores n y x deben tener dimensiones compatibles, es decir deben tener el mismo número de elementos. El siguiente ejemplo genera una señal cuadrada en tiempo discreto de amplitud igual a la unidad, ciclo útil igual a 50% y una frecuencia angular igual a

:

>> A = 1; >> omega = pi / 4; >> rho = 0.5; >>n = -10:10; >>x = A*square(omega*n +rho); >>stem(n,x);

El resultado se puede ver en la siguiente gráfica: SEÑALES EXPONENCIALES Las señales exponenciales se pueden clasificar según su comportamiento en decrecientes y crecientes. El comando en MATLAB para generar una señal exponencial decreciente es: B * exp(-a*t); Para generar una señal exponencial creciente se usa el comando: B * exp( a * t); En ambos casos el parámetro a es positivo. El siguiente ejemplo muestra la generación de una señal exponencial decreciente: >> >> >> >> >>

B = 5; a = 6; t = 0:0.001:1; x = B * exp( -a * t ); % señal exponencial decreciente. plot( t, x );

Siendo el resultado como sigue:

Para la generación de una señal exponencial creciente se puede usar el siguiente ejemplo:

>> >> >> >> >>

B = 1; a = 5; t = 0:0.001:1; x = B * exp( a * t ); plot( t, x ) ;

Existen casos particulares en los que la base de la operación de exponenciación no es el número irracional e, puede ser cualquier otro número. Para estos casos se usa una notación diferente la cual esta basada en la utilización del símbolo ^. Observando el ejemplo que sigue se nota que r es un número mientras que n es un vector, por lo tanto se usa una combinación del símbolo exponenciación con el carácter “.” Lo cual significa que a cada valor del vector le será aplicada la función.

El siguiente ejemplo genera la señal:

>> >> >> >> >>

B = 1; r = 0.85; n = -10:10; x = B * r .^ n; stem( n , x );

SEÑALES SENOISOIDALES. MATLAB también contiene funciones trigonométricas que pueden ser usadas para generar señales senosoidales. Una señal coseno de amplitud A, frecuencia w0 (medida en radianes por segundo) y ángulo de fase phi (en radianes) se obtiene usando el comando: A * cos ( w0 * t + phi);

Alternativamente se puede usar la función seno para generar una señal senosoidal usando el siguiente comando: A * sin ( w0 * t + phi ); En seguida se muestran ejemplos para cada uno de las señales respectivamente: >> A = 4; >> w0= 20 * pi; >> phi = pi / 6; >> t = 0:0.001:1; >> coseno = A * cos( w0 * t + phi); >> plot(t,coseno) ;

>> >> >> >> >> >>

A = 0.5; w0 = 20 * pi; phi = pi / 2; t = 0:0.001:1; seno = A * sin( w0 * t + phi); plot(t,seno);

SEÑALES SENOISOIDALES CON AMORTIGUACIÓN EXPONENCIAL. En todos los comandos de generación de señales descritos anteriormente, se ha generado la amplitud deseada de las señales, realizando una multiplicación por un escalar A. Esta operación se describe usando el símbolo asterisco “*”. Supongamos que se desea multiplicar una señal senosoidal por una señal exponencial para producir como resultado una señal con amortiguación exponencial. La siguiente ecuación describe mejor el supuesto caso:

Debido a que tanto la componente senosoidal de la señal como la exponencial son vectores, el procedimiento para la generación de la señal final requiere de una multiplicación de dos vectores elemento por elemento. En MATLAB este tipo de multiplicación se representa usando el símbolo punto (.) seguido por el símbolo asterisco (*). Así el comando para generar la ecuación anterior sería; A * sin( w0 * t + phi) .* exp ( -a * t); Y un ejemplo completo sería: >> A = 60; >> w0 = 20 * pi; >> phi = 0; >> a = 6; >> expsen = A * sin( w0 * t + phi) .* exp ( -a * t); >>plot(t,expsen); Dando como resultado la siguiente gráfica:

La versión discreta de la misma señal se puede obtener haciendo uso de los comandos mostrados anteriormente de la siguiente manera:

>> >> >> >> >>

A = 10; a = -0.1; w0 = 2 * pi / 12; phi = 0; n = -10 : 10;

>> x = A * sin( w0 * n + phi); >> y = exp( a * n); >> z = x .* y; >> tem(n,z)

SEÑALES IMPULSO, PASO Y RAMPA. En MATLAB, el comando ones(M, N) genera una matriz de unos de tamaño M x N, y el comando zeros(M, N)es una matriz de ceros del mismo tamaño. Se puede hacer uso de estas dos matrices para generar dos señales comúnmente usadas. 

Señal Paso:

Una señal paso de amplitud uno, puede ser generada con el siguiente comando. U = [zeros(1, 10), ones(1, 11)]; Para la versión continua creamos un vector que represente el tiempo el cual tenga muestras de un intervalo separados por valores muy pequeños mientras que para la representación de esta señal en tiempo discreto creamos un vector que represente el tiempo el cual debe tener valores separados por una unidad. Los comandos y los resultados para ambos tipos de señal se muestran a continuación: >> u=[zeros(1,10),ones(1,11); >> t=-1:0.1:1; >> plot(t,u)

>> u=[zeros(1,10), >> n=-10:10; >> stem(n,u)

ones(1,11)];

De los comandos anteriores es de notar que para poder usar las funciones plot() y stem(), es requisito que los vectores (t y u) ó (n y u) tengan iguales dimensiones. Por esta razón el vector u se forma como una composición de diez ceros y 11 unos, debido a que los arreglos t y n, tienen dimensión 21 dado que incluyen un elemento central el cual es el número cero. Para probar este hecho, se puede hacer uso de otra función de MATLAB llamada size() que devuelve como resultado un vector con las dimensiones de la matriz que se le pasa como parámetro así:



>> size(n)

>> size(u)

>> size(t)

ans =

ans =

ans =

1

1

1

21

21

21

Señal Impulso:

La versión discreta de la señal impulso se puede también generar con ayuda de las funciones zeros() y ones(), realizando una composición como sigue:

>> delta = [ zeros( 1 ,10 ), 1 , zeros( 1 ,10 ) ]; >> n = -10:10; >> stem(n,delta);

Una versión continua podría evidentemente generarse usando la misma técnica que se usó en el apartado anterior, sin embargo es necesario aumentar el número de muestras a fin de maximizar la pendiente de la señal, en seguida se verán dos ejemplos con diferentes número de muestras en el mismo intervalo de tiempo, como se puede ver la correspondencia entre las dimensiones de los vectores se mantienen así que al aumentar el tamaño de muestras del vector que representa el tiempo es necesario aumentar el valor de ceros y de unos con el cual se esta creando la señal. En el ejemplo se puede ver que a mayor numero de muestras, la pendiente de la señal se hace mayor y la aproximación a la señal verdadera es más cercana.

>>delta=[zeros(1,10),1,zeros(1,10)]; >>t=-1:0.1:1; >>plot(t,delta)

>> delta = [ zeros( 1 , 1000 ), 1 , zeros( 1 , 1000 ) ]; >> t=-1:0.001:1; >> plot(t,delta)



Señal Rampa

Para generar la señal rampa, tan solo es necesario recordar que esta función puede ser creada, como la composición de una recta Y(x) = x a partir de cero y de la recta Y(x) = 0 para valores de x menores de cero, así la versión discreta y continua se muestran a continuación:

>> >> >> >> >>

rampa

>> t1=0:0.1:10;

rampa1=n1; n1=0:30; rampa1=n1; = [zeros(1,29),rampa1]; stem(n,rampa)

>> >> >> >> >>

rampa1=t1; rampa=[zeros(1,101),rampa1]; t2=-10:0.1:0; t=[t2,t1]; plot(t,rampa)

EXPERIMENTOS 1. Desarrollar un conjunto de comandos MATLAB para aproximar las siguientes señales periódicas en tiempo continuo, dibujando 5 ciclos de cada una: a. Onda Cuadrada, de amplitud 5 Volts, frecuencia fundamental 20 Hz y ciclo útil del 60%. b. Señal diente de sierra, amplitud 5 Volts y frecuencia fundamental 20Hz 2. La solución a una ecuación diferencial esta dada por la siguiente expresión:

Usando MATLAB, grafique la solución de la ecuación en el siguiente intervalo [0,5] con una frecuencia de muestreo de 100 Hz 3. Repita el problema número dos para la siguiente expresión:

4. Una señal senosoidal con amortiguación exponencial esta definida por la siguiente expresión:

Donde el parámetro a es variable y toma valores sobre el siguiente conjunto: 500, 750, 1000. Usando MATLAB, investigar el efecto de variar dicho parámetro en la señal en el intervalo [-2,2].

REPRESENTACIONES DE FOURIER PARA LAS SEÑALES Existen cuatro representaciones distintas de Fourier, cada una aplicable a diferentes tipos de señales. Estas cuatro clases están definidas por las propiedades de periodicidad de una señal y si el tiempo es de tipo continuo o discreto. Las señales periódicas tienen representación en series de Fourier. La Serie de Fourier (FS) aplica a señales periódicas de tiempo continuo mientras que la Serie Discreta de Fourier (DTFS) aplica a señales periódicas de tiempo discreto. Las señales no periódicas tienen representación en forma de transformada. Si la señal es continua en el tiempo y no periódica, la representación es llamada Transformada de Fourier (FT). Si la señal es discreta en el tiempo y no periódica entonces la representación usada es la transformada de Fourier en tiempo discreto (DTFT). La siguiente tabla ilustra la relación entre las propiedades de tiempo de una señal y la representación de Fourier adecuada. Tiempo

Periódicas

No periódicas

Continuas

Series de Fourier ( FS )

Transformada de Fourier ( FT )

Discretas

Series discretas de Fourier ( DTFS )

Transformada discreta de Fourier ( DTFT)

La siguiente tabla muestra las relaciones matemáticas utilizadas para calcular las representaciones de Fourier. Tiempo

Continuas

Periódicas

No periódicas

Series de Fourier

Transformada de Fourier

Series discretas de Fourier

Transformada discreta de Fourier

Discretas

La Transformada Discreta de Fourier (DTFS) La DTFS es la única representación de Fourier que es de valor discreto tanto en el tiempo como en la frecuencia y de esta manera implícitamente conveniente para una implementación computacional en MATLAB. Las expresiones utilizadas para esta representación son fácilmente implementables en MATLAB como archivos. Sin embargo los comandos built-in de MATLAB fft y ifft pueden también ser utilizados para evaluar la DTFS. Dado un vector llamado x de longitud N representando un periodo de una señal periódica x[n]. el comando: >> X=fft(x)/N Produce un vector llamado X de longitud N que contiene los coeficientes de la DTFS. Matlab asume que el periodo evaluado en la señal es desde 0 hasta N-1, de manera que el primer elemento de x y X corresponden a x[0] y X[0] respectivamente, mientras que los últimos elementos corresponden a x[N-1] y X[N-1]. Nótese que la división porN es completamente necesaria, debido a que el comando fft evalúa la siguiente expresión sin realizar la división porN.

Similarmente, dados los coeficientes de una DTFS en un vector llamado X el comando: >>x=ifft(X)*N Produce un vector x que representa un periodo de la señal en el tiempo. Nótese que el comando ifft debe estar multiplicado por N para evaluar la siguiente ecuación.

Los comandos fft e ifft son computados usando un algoritmo rápido o numéricamente eficiente, conocido como “Fast Fourier Transform”. Considere el siguiente ejemplo: Determinar los coeficientes DTFS para la siguiente señal:

La señal tiene un periodo de 24, de manera que tan solo se hace necesario definir un periodo y evaluar sobre este periodo la DTFS. Los comandos usados para realizar dicho cálculo son: >> n = 0:23; >> x = ones(1,24) + sin( (n * pi / 12) + (3 * pi / 8 ) ); >> X = fft(x)/24; El resultado teórico del ejemplo es el siguiente:

El resultado obtenido mediante los comandos presentados anteriormente es: X= Columns 1 through 5 1.0000 + 0.0000i

0.4619 - 0.1913i 0.0000 + 0.0000i -0.0000 + 0.0000i -0.0000

Columns 6 through 10

-0.0000 - 0.0000i 0.0000 - 0.0000i 0.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 - 0.0000i Columns 11 through 15 -0.0000 - 0.0000i -0.0000 - 0.0000i 0.0000i

0

-0.0000 + 0.0000i -0.0000 +

Columns 16 through 20 -0.0000 + 0.0000i 0.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i Columns 21 through 24 -0.0000 - 0.0000i -0.0000 - 0.0000i 0.0000 - 0.0000i 0.4619 + 0.1913i

Como se puede ver, tres componentes tienen valor diferente de cero. Un uso común de la transformada de Fourier, es encontrar las componentes frecuenciales de una señal en el dominio del tiempo que esta contaminada con ruido. Considérese dos señales senoidales que tienen frecuencias fundamentales de 50Hz y 120Hz, luego considérese estas señales contaminadas con ruido aleatorio. Los comandos para generar una señal con las especificaciones anteriormente mostradas son los siguientes:

>> t = 0:0.001:0.6; >> x = sin ( 2 * pi * 50 * t ) + sin ( 2 * pi * 120 * t ); >> y = x + 2 * randn ( size ( t ) ); >> plot( 1000 * t (1:50), y (1:50) )

Es de gran dificultad identificar las componentes de frecuencia mirando la señal original. Sin embargo al realizar la conversión de esta señal al dominio de la frecuencia, la identificación de estas componentes se hace más sencilla. La conversión de la señal al dominio de la frecuencia se hace calculando la Transformada R ápida de Fourier, tomando para el cálculo los primeros 512 puntos de la señal. El espectro de potencia es una medida de la potencia a varias frecuencias, y este puede ser calculado con los siguientes comandos. >>Pyy = Y .* conj (Y) / 512; Para realizar la gráfica se puede tener en cuenta que la información que aparece en el arreglo Pyy es por propiedades de la transformada, simétrica con respecto a la frecuencia media, es decir que si tenemos 512 puntos de muestra, la señal que esta almacenada en el arreglo es simétrica con respecto a la muestra 256, por lo tanto dibujar las ultimas 256 muestras del arreglo será completamente innecesario. De manera que para visualizar el espectro de potencia los comandos deben ser como se muestran a continuación:

>> f = 1000*(0:256)/512; >> plot(f,Pyy(1:257))

Para ver todas las muestras y entender la característica de simetría descrita anteriormente se pueden utilizar los siguientes comandos:

>> f = 1000*(0:511)/512; >> plot(f,Pyy)

Del espectro de potencia se puede visualizar que las componentes con mayor frecuencia se encuentran a los 50 y 120 Hz respectivamente. Comprobando así que las señales de las cuales se formo la señal contaminada con ruido tienen estas frecuencias fundamentales.

Representación en el dominio del tiempo Los computadores digitales son ideales para la implementación de descripciones en el dominio del tiempo de sistemas discretos, porque naturalmente el computador almacena y manipula secuencias de números. Por ejemplo, la suma de convolución describe la relación entre la entrada y la salida de un sistema de tiempo discreto, y es fácilmente evaluada en un computador como la suma de productos de números. En contraste, los sistemas de tiempo continuo, son descritos en términos de funciones continuas, las cuales no son fácilmente representadas o manipuladas en un computador digital. Por ejemplo, la salida de un sistema en tiempo continuo esta descrita por la integral de convolucion. La evaluación de la integral de convolucion con un computador requiere el uso de integración numérica o de técnicas de manipulación simbólica, ambas fuera del alcance de este tutorial. Por lo tanto la exploración con Matlab se centra en el estudio de sistemas en tiempo discreto.

Una segunda limitación en la exploración de señales y sistemas es la que se impone por la memoria finita o por la capacidad de almacenamiento finita que es inherente en un computador digital. Por lo tanto se manejaran únicamente señales de duración finita. Por ejemplo si la respuesta al impulso de un sistema tiene duración infinita y la entrada es de duración infinita, entonces la suma de convolución equivale a la suma de un infinito número de productos. Aun si fuese posible almacenar señales de longitud infinita en el computador, la suma infinita podría no ser calculada en una cantidad finita de tiempo. Debido a esta limitación, el comportamiento de un sistema en respuesta una señal de longitud infinita podría a menudo ser inferida de su respuesta a una señal de longitud finita que presente ciertas particularidades. CONVOLUCIÓN Es de recordar que la suma convolución expresa la salida de un sistema de tiempo discreto en términos de la entrada y la respuesta al impulso del sistema. Matlab tiene una función

llamada conv que evalúa la convolución de señales de tiempo discreto de duración finita. Si x y h son vectores representado señales, entonces el siguiente comando de Matlab genera un vector llamado y representando la convolución de la señales representadas por x yh. y = conv(x, h) El número de elementos en el vector y es dado por la suma de el numero de elementos en x y h menos uno. Nótese que se debe conocer el tiempo de origen de las señales representadas por x y h con el fin de determinar el tiempo de origen de la convolución. En general, si el primer elemento de x corresponde al tiempo n=kx y el primer elemento de h corresponde a n=kh, entonces el primer elemento de y corresponde al tiempo n= kx+kh. Para ilustrar este hecho, considere el siguiente ejemplo: 

Asuma el sistema LTI el cual tiene la siguiente respuesta al impulso.

Determine la salida de este sistema en respuesta a la siguiente entrada.

Aquí el primer elemento diferente de cero en la respuesta al impulso del sistema ocurre en el tiempo n = -1 y el primer elemento de la entrada x ocurre en el tiempo n = 0. La anterior convolución se puede calcular en Matlab de la siguiente manera:

>> h = [1, 2, 1]; >> x = [2, 3, -2]; >> y = conv(x,h) y= 2 7 6 -1 -2 >> n = -1:3; >> stem(n,y);

El primer elemento en el vector y corresponde al tiempo n = 0 + (-1 ) = -1.

En el siguiente ejemplo, se determinará la salida de un sistema con respuesta al impulso dada por:

Y entrada

Se puede en este caso usar el comando conv para calcular la respuesta del sistema. En este caso, la respuesta al impulso consiste de diez unos consecutivos comenzando en el tiempo n = 0, y la entrada consiste de cinco unos consecutivos comenzando en el tiempo n = 2. Estas señales pueden ser definidas en Matlab usando los siguientes comandos:

>> h = ones(1,10); >> x = ones(1,5); La salida se obtiene y es graficada usando los siguientes comandos: >> n = 2:15; >> y = conv(x, h); >> stem(n, y); En este ejemplo, el primer elemento del vector y corresponde al tiempo n = 2 + 0 como se muestra en la siguiente figura.

RESPUESTAS EN ESTADO ESTABLE A ENTRADAS ESCALÓN UNITARIO La respuesta escalón, es la salida de un sistema en respuesta a una señal de entrada escalón unitario. Esta respuesta es infinita en general. Sin embargo, es posible evaluar los primeros p valores de la respuesta escalón usando la función conv. Si la respuesta al impulso es cero para los tiempos n> h = (-0.9).^[0:49]; >> u = ones(1,50); >> s= conv(u, h); El vector s tienen 99 valores, los primeros 50 corresponden a la respuesta impulso y es mostrada en la siguiente figura usando el siguiente comando:

>>stem([0:49],s(1:50));

En este ultimo comando se pasan a la función stem dos parámetros diferentes a los mostrados en los anteriores ejemplos, el primero es un vector anónimo de 50 posiciones desde 0 hasta 49 que representa el tiempo, se dice que el vector es anónimo puesto que no se le ha definido algún nombre. El segundo parámetro es el vector s que se había calculado anteriormente, pero en este caso se agrega la fracción de código (1:50) que indica a Matlab que debe usar tan solo los elementos de s que están almacenados desde la posición 1 hasta la 50.

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF