Está en la página 1de 22

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), ones(1,11)];


>> n=-10:10;
>> stem(n,u)
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 21 1 21 1 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:

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

>> t1=0:0.1:10;
>> 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

Transformada de
Series de Fourier
Continuas Fourier
( FS )
( FT )

Series discretas de Transformada discreta


Discretas Fourier de Fourier
( DTFS ) ( DTFT)

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

Tiempo Periódicas No periódicas


Series de Fourier Transformada de Fourier

Continuas
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.4619 - 0.1913i 0.0000 + 0.0000i -0.0000 + 0.0000i -0.0000


+ 0.0000i

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 -0.0000 + 0.0000i -0.0000 +


0.0000i

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<kh, entonces el cálculo se realiza
convolucionando los primeros p valores de h[n] con una señal paso de longitud p. Es decir
se construye un vector h’ con los primeros pvalores diferentes de cero de la respuesta al
impulso h, luego se define una señal paso de duración p con el siguiente
comando u=ones(1,p), y entonces se evalúa la siguiente convolución s = conv(u,h). El
primer elemento de s corresponde a el tiempo kh y los primeros p valores de s representan
los primeros p valores de la respuesta paso. Los valores sobrantes de s no corresponden a la
respuesta paso.

Por ejemplo se podría determinar los 50 primeros valores de la respuesta paso del sistema
con la siguiente respuesta al impulso:

Con a = 0.9 los comandos de Matlab serían:

>> 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.

También podría gustarte