1.2 Señales Discretas con Python

Referencia: Oppenheim 1.3.2 fig.1.25 p24, Lathi 1.3.1 p78, Hsu 1.2.A p1

Las señales discretas tienen un dominio que se especifica únicamente para valores finitos de tiempo, generalmente definidos con números enteros. Por ejemplo, para una señal discreta en un intervalo desde n0, con m muestras, tamaño de paso 1, se genera una secuencia numérica cuya gráfica es:

\sin [\omega n]

señal discreta

El muestreo para cada valor n se establece en el  intervalo [0, m) , para m muestras y con frecuencia ω = 2π/12 radianes/segundo.

Para el ejercicio se usa m=12

Semejante a las gráficas de señales contínua, el bloque de INICIO añade las librerías de Numpy y Matplotlib.

El bloque de INGRESO define los valores de los parámetros, la señal f(x) en formato simplificado lambda, con variable independiente n, el punto inicial n0 y el número de muestras m (recuerde contar el cero)

# Señales discretas
import numpy as np
import matplotlib.pyplot as plt

# INGRESO - parámetros
w  = 2*np.pi/12
fx = lambda n: np.sin(w*n)

n0 = 0  # intervalo en un periodo
muestras = 12+1

En el bloque de Procedimiento, los valores discretos de n se almacenan en un vector de tamaño m. La señal se puede crear usando la función sin() incluida en numpy.

# PROCEDIMIENTO
# vector ni discreto [n0,n0+muestras]
ni = np.arange(n0,n0+muestras,1)

senal = fx(ni)

Observe que los valores para n corresponden a una secuencia numérica.

El bloque de SALIDA puede mostrar los resultados en forma numérica o gráfica.

# SALIDA
np.set_printoptions(precision=4)
print('n: ')
print(ni)
print('señal x[n]: ')
print(senal)
n: 
[ 0  1  2  3  4  5  6  7  8  9 10 11 12]
señal x[n]: 
[ 0.0000e+00  5.0000e-01  8.6603e-01  1.0000e+00
  8.6603e-01  5.0000e-01  1.2246e-16 -5.0000e-01
 -8.6603e-01 -1.0000e+00 -8.6603e-01 -5.0000e-01
 -2.4493e-16]

Para observar el resultado de la señal, se grafica ni vs señal[n], añadiendo las etiquetas para cada eje, y mostrando el resultado con plt.show().

Se usa la gráfica stem() para obtener en la gráfica el punto y una línea que muestre la magnitud, semejante a las gráficas de los libros de texto.

# Gráficas
plt.stem(ni, senal)

plt.xlabel('n')
plt.ylabel('señal x[n]')
plt.grid()

plt.show()

Tarea

Para ésta sección, se cambiarán los parámetros de n y ω.

  • muestras = 50
  • ω0 = π/4 y ω0 = 15π/8
  • cambiar la función a np.cos()
  • ¿se puede cambiar la amplitud de la señal a 2 y ω0=1/6?

Instrucciones Python

# Señales discretas
import numpy as np
import matplotlib.pyplot as plt

# INGRESO - parámetros
w  = 2*np.pi/12
fx = lambda n: np.sin(w*n)

n0 = 0  # intervalo [n0,n0+muestras]
muestras = 12+1

# PROCEDIMIENTO
# vector n de muestras [n0,n0+muestras]
ni = np.arange(n0,n0+muestras,1)

senal = fx(ni)

# SALIDA
np.set_printoptions(precision=4)
print('n: ')
print(ni)
print('señal x[n]: ')
print(senal)

# Gráficas
plt.stem(ni, senal)
plt.xlabel('n')
plt.ylabel('señal x[n]')
plt.grid()
plt.show()

1.1 Señales Contínuas con Python

Referencia: Oppenheim 1.1 p1 pdf32, Lathi 1.3.1 p78, Hsu 1.2.A p1

Un ejemplo clásico de una señal contínua es una de forma sinusoidal.

\sin (\omega t)

La función de la señal en el tiempo se define en el intervalo [t0, tn) para n tramos y una frecuencia angular ω en radianes/segundo. Recordar que ω = 2πf, siendo f la frecuencia en Hz o unidades de 1/s, por si requiere hacer la conversión de frecuencias.

Para facilitar la tarea, en Python se usan las librerías para el manejo de vectores y gráficas:

    • vectores – numpy
    • gráficas – matplotlib.pyplot

Un resumen de gráficas en 2D de línea se presenta también en el curso MATG1052 de métodos numéricos. También se dispone de un video tutorial:  Funciones y Gráficas .

Inicio e Ingreso de parámetros

En el bloque de INICIO se añaden las librerías Numpy y Matplotlib. Luego se definen los parámetros de la señal a usar y se describe la señal con la expresión matemática en su forma simplificada lambda.

Se añade el intervalo de observación y el número de muestras para la gráfica.

# Señales continuas
import numpy as np
import matplotlib.pyplot as plt

# INGRESO
w  = 1
fx = lambda t: np.sin(w*t)

t0 = 0   # intervalo [t0,tn]
tn = 2*np.pi
muestras = 51

Procedimiento – calcular valores

Para la gráfica, las muestras de tiempo t se almacenan en un vector de tamaño n. Entre cada valor de t existe una diferencia dt determinada por n.

# PROCEDIMIENTO
# vector de tiempo
ti = np.linspace(t0,tn,muestras)

# señal
senal = fx(ti)

Salida – valores y gráfica

El resultado puede ser observado de dos formas:
– mostrando sus valores o
– sus gráficas.

Se presentan las dos opciones a escoger.

# SALIDA
np.set_printoptions(precision = 4)
print('tiempo: ')
print(ti)
print('señal: x(t) ')
print(senal)
tiempo: 
[0.     0.1257 0.2513 0.377  0.5027 0.6283 0.754 
 0.8796 1.0053 1.131  1.2566 1.3823 1.508  1.6336
 1.7593 1.885  2.0106 2.1363 2.2619 2.3876 2.5133
 2.6389 2.7646 2.8903 3.0159 3.1416 3.2673 3.3929
 3.5186 3.6442 3.7699 3.8956 4.0212 4.1469 4.2726
 4.3982 4.5239 4.6496 4.7752 4.9009 5.0265 5.1522
 5.2779 5.4035 5.5292 5.6549 5.7805 5.9062 6.0319
 6.1575]
señal: x(t) 
[ 0.0000e+00  1.2533e-01  2.4869e-01  3.6812e-01
  4.8175e-01  5.8779e-01  6.8455e-01  7.7051e-01
  8.4433e-01  9.0483e-01  9.5106e-01  9.8229e-01
  9.9803e-01  9.9803e-01  9.8229e-01  9.5106e-01
  9.0483e-01  8.4433e-01  7.7051e-01  6.8455e-01
  5.8779e-01  4.8175e-01  3.6812e-01  2.4869e-01
  1.2533e-01 -3.2162e-16 -1.2533e-01 -2.4869e-01
 -3.6812e-01 -4.8175e-01 -5.8779e-01 -6.8455e-01
 -7.7051e-01 -8.4433e-01 -9.0483e-01 -9.5106e-01
 -9.8229e-01 -9.9803e-01 -9.9803e-01 -9.8229e-01
 -9.5106e-01 -9.0483e-01 -8.4433e-01 -7.7051e-01
 -6.8455e-01 -5.8779e-01 -4.8175e-01 -3.6812e-01
 -2.4869e-01 -1.2533e-01]

Para observar el resultado de la señal, se grafica t vs señal. Para mejor identificación de ejes, se añade las etiquetas y las líneas de referencia.

# Gráfica
plt.plot(ti,senal)
plt.axhline(0, color='gray')
plt.axvline(0, color='gray')
plt.xlabel('t')
plt.ylabel('señal x(t)')
plt.grid()
plt.show()


Tarea

Para ésta sección, se cambiarán los parámetros de tiempo.

  • tn=8π
  • ω=2
  • cambiar la función a np.cos()
  • ¿se puede cambiar la amplitud de la señal a 4?

Instrucciones en Python

# Señales continuas
import numpy as np
import matplotlib.pyplot as plt

# INGRESO
w  = 1
fx = lambda t: np.sin(w*t)

t0 = 0   # intervalo [t0,tn]
tn = 2*np.pi
muestras = 51

# PROCEDIMIENTO
# vector de tiempo
ti = np.linspace(t0,tn,muestras)

# señal
senal = fx(ti)

# SALIDA
np.set_printoptions(precision = 4)
print('tiempo: ')
print(ti)
print('señal: x(t) ')
print(senal)

# Gráfica
plt.plot(ti,senal)
plt.axhline(0, color='gray')
plt.axvline(0, color='gray')
plt.xlabel('t')
plt.ylabel('señal x(t)')
plt.grid()
plt.show()

Ejemplos – soluciones propuestas

Ejercicios resueltos mostrando el desarrollo analítico y validados con los algoritmos en Python realizados en clase. Contienen tareas por desarrollar, observaciones a otras formas de algoritmos.