Señales Analógicas y Digitales

Señales Analógicas y Digitales

Señal Analógica vs Digital

Señales analógicas

Una señal se clasifica como analógica cuando su amplitud puede tomar un infinito numero de valores en un rango contínuo de tiempo.

Por ejemplo, una señal de sonido como la del archivo: Alarm01.wav

Descargue el archivo use un programa como windows media player para escuchar su contenido.

Algoritmo Python

Para observar en una gráfica la señal del archivo anterior, use las siguientes instrucciones:

# Señales analógicas
# propuesta: edelros@espol.edu.ec

import numpy as np
import matplotlib.pyplot as plt
import scipy.io.wavfile as waves

# INGRESO
# archivo = input('archivo de audio: ')
archivo = 'Alarm01.wav'
muestreo, sonido = waves.read(archivo)
# SALIDA - Observacion intermedia
print('frecuencia de muestreo: ', muestreo)
print('dimensiones de matriz: ', np.shape(sonido))
print('datos de sonido: ')
print(sonido)
frecuencia de muestreo:  22050
dimensiones de matriz:  (122868, 2)
datos de sonido: 
[[0 0]
 [0 0]
 [0 0]
 ..., 
 [0 0]
 [0 0]
 [0 0]]

Con los resultados mostrados, se observa que:

  • la señal de audio tiene frecuencia de muestreo de 22050 Hz
  • Las dimensiones de la matriz sonido (122868,2) indican que es de tipo estéreo por usar columnas
  • el valor de 122868 corresponde a la cantidad de muestras por canal.
  • Los índices para seleccionar un canal son 0 ó 1.

Para observar la forma del sonido se extrae solo un fragmento usando el canal 0.

Para observar otros fragmentos la señal de audio cambie los valores de  [inicia,termina).

# Fragmento de tiempo
inicia = 2600
termina = 2720
canal = 0

# Extrae el fragmento de sonido
dt = 1/muestreo
t = np.arange(inicia*dt,termina*dt,dt)
muestras = len(t)
fragmento = sonido[inicia:inicia+muestras, canal]

#SALIDA
plt.plot(t,fragmento)
plt.xlabel('t segundos')
plt.ylabel('sonido(t)')
plt.show()

Señales digitales

Una señal se clasifica como digital cuando la amplitud  puede tomar solo un número finito de valores, para un número finito de muestras en el tiempo.

Siguiendo el ejemplo de la señal de audio, las señales digitales se las asocia con computadoras. Para almacenar una señal de audio, se la cuantifica en amplitud a espacios iguales de tiempo dt.

Por ejemplo, datos del vector fragmento del audio del ejercicio anterior muestran el caracter finito, discreto, por muestras de la señal.

# SALIDA - datos del fragmento de audio
print(fragmento)
[  -36   -52    11  -280  -595  -186   656   800   141  -237   -53  -246  -910  -739   569  1347   620  -288  -195   -57  -812 -1229   -37  1419  1183   -51  -348    47  -424 -1322  -778   955  1531   432  -363   -62  -123 -1062 -1189   306  1514   910  -172  -224   -57  -720 -1191  -164  1241  1134    75  -295  -144  -533 -1035  -367   953  1144   262  -234  -202  -499  -931  -423   781  1095   344  -152  -174  -491  -916  -440   739  1088   353  -149  -158  -467  -901  -472   693  1116   405  -164  -172  -434  -906  -558   608  1139   478  -159  -181  -370  -870  -655   494  1151   565  -130  -180  -307  -812  -735   358  1149   666   -95  -213  -291  -785  -824   214  1143   784   -31  -217  -249  -727  -888    54]

los datos del fragmento de audio, muestran que la señal de audio se almacena como una señal discreta, o digital, por lo que una gráfica más apropiada es:

# grafica fragmento de sonido en forma discreta
n = np.arange(inicia,inicia+muestras,1)
plt.stem(n,fragmento)
plt.xlabel('n')
plt.ylabel('fragmento sonido[n]')
plt.show()

Observaciones

Los términos «contínuo en el tiempo» y «discreto en el tiempo» cuantifican la naturaleza de la señal solo en el eje de las abscisas (horizontal).

Los términos «analógicos» y «digitales» cuantifican la amplitud de la señal o eje de las ordenadas (vertical).

Una señal de audio, por su naturaleza es de tipo analógica, que para almacenarla o procesarla en un computador se convierte a digital al cuantificar sus valores de amplitud, de la forma mostrada en el ejercicio.

Tarea

  • cambie los rangos de observación de la señal de audio y repita las gráficas para su forma analógica aproximada (parte 1) y para su forma digital (parte 2)
  • comente sobre el fragmento inicial y final donde los valores de la señal son 0’s

Referencia: Lathi 1.3.2 pdf/p.61, Schaum pdf/p.13

Señales Discretas

De forma similar, siguiendo el ejemplo anterior para una señal contínua, se realiza el muestreo de la señal, generando una secuencia numérica:

\sin [\omega _0]

señal discreta 01

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

Para el ejercicio se usa m=20

# Señales discretas
# propuesta: edelros@espol.edu.ec

import numpy as np
import matplotlib.pyplot as plt

# INGRESO - parámetros
n0 = 0
m = 20
w0 = 2*np.pi/12

Los valores discretos de n se almacenan en un vector de tamaño m.

La señal se puede crear usando la funcion sin() incluida en numpy, obteniendo como resultado:

# PROCEDIMIENTO
# vector n discreto
n = np.arange(n0,m,1)
# señal
senal = np.sin(w0*n)

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

# SALIDA
print('n: ')
print(n)
print('señal x[n]: ')
print(senal)
n: 
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
señal x[n]: 
[  0.00000000e+00   5.00000000e-01   8.66025404e-01   1.00000000e+00   8.66025404e-01   5.00000000e-01   1.22464680e-16  -5.00000000e-01  -8.66025404e-01  -1.00000000e+00  -8.66025404e-01  -5.00000000e-01  -2.44929360e-16   5.00000000e-01   8.66025404e-01   1.00000000e+00   8.66025404e-01   5.00000000e-01   3.67394040e-16  -5.00000000e-01]

Para observar el resultado de la señal, se grafica n 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(n, senal)
plt.xlabel('n')
plt.ylabel('señal x[n]')
plt.show()

señal discreta 01

Tarea

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

  • m = 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?

Referencia: Oppenheim 1.3.2 fig.1.25 pdf/p.52, Schaum 1.2.A p.12

Señales Contínuas

Para la clasificación se señales empezamos con un ejemplo clásico de una señal contínua:

\sin (\omega t)

El tiempo se define en el intervalo [t0, tn) para n muestras y una frecuencia ω en radianes/segundo.

Para facilitar la tarea se usan las librerias para el manejo de vectores y gráficas:

    • vectores – numpy
    • gráficas – matplotlib.pyplot
# Señales continuas
# propuesta: edelros@espol.edu.ec

import numpy as np
import matplotlib.pyplot as plt

# INGRESO parámetros
t0 = 0
tn = 2*np.pi
n = 50
w = 1

Los valores de tiempo t se almacenan en un vector de tamaño n.
Entre cada valor de t existe una diferencia dt deteminada por n.

# PROCEDIMIENTO
# vector de tiempo
dt = (tn-t0)/n
t = np.arange(t0,tn,dt)

# señal
senal = np.sin(w*t)

El resultado puede ser observado de dos formas:
– mostrando sus valores o
– sus gráficas.
Se presentan las dos opciones a escoger.

# SALIDA
print('tiempo: ')
print(t)
print('señal: x(t) ')
print(senal)
tiempo: 
[ 0.          0.12566371  0.25132741  0.37699112  0.50265482  0.62831853  0.75398224  0.87964594  1.00530965  1.13097336  1.25663706  1.38230077  1.50796447  1.63362818  1.75929189  1.88495559  2.0106193   2.136283  2.26194671  2.38761042  2.51327412  2.63893783  2.76460154  2.89026524  3.01592895  3.14159265  3.26725636  3.39292007  3.51858377  3.64424748  3.76991118  3.89557489  4.0212386   4.1469023   4.27256601  4.39822972  4.52389342  4.64955713  4.77522083  4.90088454  5.02654825  5.15221195  5.27787566  5.40353936  5.52920307  5.65486678  5.78053048  5.90619419  6.03185789  6.1575216 ]
señal: x(t) 
[  0.00000000e+00   1.25333234e-01   2.48689887e-01   3.68124553e-01   4.81753674e-01   5.87785252e-01   6.84547106e-01   7.70513243e-01   8.44327926e-01   9.04827052e-01   9.51056516e-01   9.82287251e-01   9.98026728e-01   9.98026728e-01   9.82287251e-01   9.51056516e-01   9.04827052e-01   8.44327926e-01   7.70513243e-01   6.84547106e-01   5.87785252e-01   4.81753674e-01   3.68124553e-01   2.48689887e-01   1.25333234e-01  -3.21624530e-16  -1.25333234e-01  -2.48689887e-01  -3.68124553e-01  -4.81753674e-01  -5.87785252e-01  -6.84547106e-01  -7.70513243e-01  -8.44327926e-01  -9.04827052e-01  -9.51056516e-01  -9.82287251e-01  -9.98026728e-01  -9.98026728e-01  -9.82287251e-01  -9.51056516e-01  -9.04827052e-01  -8.44327926e-01  -7.70513243e-01  -6.84547106e-01  -5.87785252e-01  -4.81753674e-01  -3.68124553e-01  -2.48689887e-01  -1.25333234e-01]

Para observar el resuldado de la señal, se grafica t vs señal. Para mejor identificación de ejes, se añade las etiquetas.

# Gráficas
plt.plot(t,senal)
plt.xlabel('t')
plt.ylabel('señal x[(t)]')
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?

Referencia: Oppenheim 1.1 pdf/p.29, Lathi 1.3.1 pdf/p.60, Schaum 1.2.A pdf/p.12