Ejemplos de código para formar señales discretas en Matlab
El objeto más básico en Matlab es una matriz numérica con la posibilidad de almacenar números
complejos. Por supuesto, los datos obtenidos en el estudio de señales y sistemas son muy bien
representados en forma de matrices. En este post usaremos Matlab para la generación de señales
elementales: cuadrada, triangular, entre otras.
El ToolBox de procesamiento de señales de Matlab posee una gran 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.
Como vimos en post anteriores, el siguiente comando genera un vector llamado t de valores que
representan la variable tiempo, con un intervalo de muestreo de 1 ms entre 0 y 1 segundo.
t = 0:0.001:1;
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.
EJEMPLOS DE SEÑALES EN MATLAB
La generación de señales periódicas tales como ondas cuadradas y triangulares es una actividad
muy fácil de realizar en MATLAB.
1) SEÑAL CUADRADA
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 pueden escribir lo siguiente en la linea de comandos:
>> A = 1;
>> w = 10 * pi;
>> rho = 0.5;
>> t = 0:0.001:1;
>> sq = A*square(w*t+rho);
>> plot(t,sq);
En la segunda línea de este ejemplo, 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 vizualizar 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.
2) SEÑAL TRINGULAR
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 resultado se puede observar en la gráfica a la izquierda
3) SEÑAL ESCALÓN
En Matlab, el comando ones(M, N) genera una matriz de unos de tamaño MxN, 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: la señal escalón y la señal impulso.
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. Los comandos y los resultados se muestran a
continuación:
>> u=[zeros(1,10),ones(1,11);
>> t=-1:0.1:1;
>> plot(t,u)
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. Así, para este caso
para obtener la representación de esta señal en tiempo discreto creamos un vector-tiempo el cual
debe tener valores separados por una unidad.
>> u=[zeros(1,10), ones(1,11)];
>> n=-10:10;
>> stem(n,u)
Recuerde 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 la función Matlab
llamada size que devuelve como resultado un vector con las dimensiones de la matriz que se le pasa
como parámetro.
4) 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);
5) 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 se muestra a continuación:
>> t1=0:0.1:10;
>> rampa1=t1;
>> rampa=[zeros(1,101),rampa1];
>> t2=-10:0.1:0;
>> t=[t2,t1];
>> plot(t,rampa)
Función Stem en Scilab, Gráficas de
Datos Discretos.
5 ABRIL, 2014 / JULIO CÉSAR
Hasta ahora solo hemos hecho uso de la función plot( ) la cual nos permite graficar
los valores de un vector con respecto a otro (haciendo las veces de eje X y Y) y que
ademas, dicha función nos permite modificar algunas propiedades como el color, el
tipo de punto o linea que usamos y que normalmente solo dejamos los valores por
defecto y así vemos que cada vez que se nos presenta la grafica esta parece una
linea continua….¿pero si queremos representaciones discretas?
Probablemente si llegamos aquí buscando “función stem en Scilab” seguramente
es porque ya estamos familiarizados con Matlab y su conocida función Stem, la
cual nos permite realizar representaciones graficas discretas sin mayor
complicación y que funciona al igual que plot(t,y) -> stem(t,y), pues te tengo una
mala noticia Scilab no tiene esta función, en cambio nos proporciona la
función plot2d3(t,y), la cual nos grafica lineas rectas que parten desde la
abscisa ‘t’ hasta el valor que le corresponde en el eje‘y’ una comparación entre la
función stem() de Matlab y plot2d3() de Scilab aparece en las figuras 1 y 2, donde
se genera la gráfica de sin(t) para 50 muestras de t entre 0 y 2PI.
EN MATLAB:
Fig 1. Grafica generada por la función stem(t,y) de Matlab
EN SCILAB:
Fig 2. Gráfica generada por la función plot2d3(t,y) de Scilab.
Sin embargo como podemos observar en la gráfica que generamos en Scilab no es
tan estética como la que genera stem() de Matlab, aunque plot2d3( ) puede ser
mejorada si por ejemplo luego de graficar con plot2d3(t,y) graficamos sobre la
misma ventana con la función plot( ) y en cuya opción de ”tipo de linea” ponemos
la letra ‘o’ y quedaría de la siguiente forma:
Quedando de la siguiente manera la gráfica resultante:
Fig 3. Gráfica resultante al usar plot(t,y,’o’) sobre una gráfica previa plot2d3(t,y).
Para generar gráficas como la de la figura 3 en Scilab pudiésemos definir entonces
una función programada por notros mismos que se llame stem() y reciba como
parámetros un vector independiente ‘t’ y un y el vector dependiente ‘y’ tal vez de
la forma function []=stem(t,y) y en el cuerpo de la función se ponen los anteriores
códigos, aunque personalmente cuando necesito una gráfica de este tipo solo me
basta poner esa dos lineas y listo.
Recuerda que como muchas otras funciones como plot( ) y plot2d3( ) tienen
muchas propiedades que pueden ser modificadas para dar como resultado
representaciones más estéticas o mejores.
Espero que este corto ‘tutorial’ te haya sido de ayuda, si tienes alguna sugerencia
para futuros artículos no dudes en comentar.
Autor: Julio Echeverri.
Gráfica de señales continuas y discretas en Matlab
- Continuas
Supongamos que se quiere graficar por ejemplo e^(jw0t)
1. Definir t en un intervalo -20 a 20 con paso 0.1
t=-20:0.1:20;
2. Calcular f(t) con frecuencia 1/10*pi (i y pi representan el número imaginario y al número pi en Matlab
respectivamente)
ft=exp(i*1/10*pi*t);
3. Graficar f(t) contra el tiempo
plot(t,ft)
4. Resultado (sólo se grafica la parte real)
- Discretas
Supongamos que se quiere graficar por ejemplo e^(jw0n)
1. Definir n en un intervalo -10 a 10, como n son enteros el paso es 1
n=-20:1:20;
2. Calcular f[n] con frecuencia 1/10*pi (i y pi representan el número imaginario y al número pi en Matlab
respectivamente)
fn=exp(i*1/10*pi*n);
3a. Graficar f[n] contra el tiempo usando plot
plot(n,fn,'*')
4a. Resultado (sólo se grafica la parte real)
3b. Graficar f[n] contra el tiempo usando la función stem
stem(n,fn)
4b. Resultado (sólo se grafica la parte real)