2.1 Muestreo y aliasing

[ muestras ] [ alias ] [ ejemplo ] [ algoritmo ] [ ejercicio alias ]
..


1. Muestras de una señal

Referencia: McClellan 4.1 p123

Una señal discreta en tiempo x[n], representa como una secuencia ordenada de números que puede ser almacenada para su uso y procesamiento posterior. Las muestras de una señal contínua o analógica x(t) se encuentran espaciadas en el tiempo separadas por un tiempo Ts.

x[n] = x(nTs) =x(n/fs)   ; -∞ <n < ∞

Cada valor de x[n] se denomina una muestra de la señal contínua x(t). Ts  también se expresa como frecuencia de muestreo fs = 1/Ts  en muestras/s.

1.1 Muestreo de una señal sinusoidal

Para obtener muestras de una señal x(t) = A cos(ωt+φ) se tiene que:

x[n] = x(nTs) = A cos(ωnTs +φ)
= A cos( (ωTs )n+φ)
= A cos(ωrad n+φ)

donde se tiene la frecuencia en radianes normalizada.
La frecuencia normalizada es un parámetro adimensional al quitar la unidad de tiempo de x(t), siendo ‘n‘ el índice de posición en la secuencia de muestras.

1.2. Ejemplo

Referencia: McClellan Figura 4.3 p126

Una señal tipo coseno de 100 Hz se toman muestras con una tasa fs = 500 muestras/s. Realice y observe las gráficas de t y n correspondientes

 x(t) = cos(2π(100)t)

muestreo: 11
 tamaño ki: 11
 tamaño ti: 101
fs: 500  ; dt: 0.002  ; fs_veces: 10
x(t): cos(100*t*(2*pi))
x[n]: cos(n*(2*pi)/5)

De la gráfica se puede observar que sin sobreponer la forma de onda x(t) sobre x[n] no es sencillo discernir la forma exacta de la forma de onda original. Para una mejor observación se sobre-muestrea 10 veces la señal para que sea más semejante a la forma contínua de x(t).

muestreo coseno 100Hz 011.3 Algoritmo

# ejercicio figura 4.1 p126 Muestreo de señales sinusoidales
# telg1034 DSP fiec-espol edelros@espol.edu.ec
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
import telg1034 as dsp
# variables continuas
from telg1034 import t,A,w,f,p,pi,DosPi,I,equivalentes
# variables discretas
n = sym.Symbol('n', integer=True, nonnegative=True)

# INGRESO
# señal continua
x = sym.cos(100*DosPi*t + 0)

fs = 500  # muestreo discreto
fs_veces = 10 # sobremuestreo para x(t)
muestrasN = 10 + 1  # para x[n]

# PROCEDIMIENTO
xn = x.subs(t,n/fs)
# muestreo x[n]
dt = 1/fs 
ki = np.arange(0,muestrasN,1,dtype=int)
# muestreo x(t)
dtc = dt/fs_veces # para x(t)
ti = np.arange(0,ki[muestrasN-1]*dt + dtc, dtc)
tki = ki*dt

xt = sym.lambdify(t,x, modules=equivalentes)
xki = xt(tki) 
xti = xt(ti)

# SALIDA
print('muestreo:',muestrasN)
print(' tamaño ki:',len(ki))
print(' tamaño ti:',len(ti))
print('fs:',fs,' ; dt:',dt, ' ; fs_veces:',fs_veces)
print('x(t):',x)
print('x[n]:',xn)

# GRAFICA x(t) y x[n]
plt.subplot(211) # x(t) contínua
plt.plot(ti,xti, color='gray',label='x(t)')
plt.stem(tki,xki,linefmt = 'C0:',
         label='x[n]')
plt.xlabel('t')
plt.ylabel('amplitud')
plt.title('x(t) vs x[n]')
plt.legend()

plt.subplot(212) # x[n] discreta
plt.stem(xki,linefmt = 'C0:',label='x[n]')
#plt.xticks(ki)
plt.xlabel('n')
plt.ylabel('amplitud')
plt.legend()
plt.show()

[ muestras ] [ alias ] [ ejemplo ] [ algoritmo ] [ ejercicio alias ]
..


2. Concepto de alias

Una definición simple de «alias» es de dos nombres para dos personas: «Pancho» y «Francisco». Dos señales diferentes en su forma discreta pueden tener la misma secuencia de valores.
..


2.1 Ejemplo

Referencia: McClellan 4.1.2 p127

Considere las siguientes señales y compare sus gráficas.

x1[n] = cos(0.4π n)

x2[n] = cos(2.4π n) = cos(0.4π n + 2π n )  = cos(0.4π n)

dado que 2πn es un número entero de periodos de la señal coseno.

Con Python se realiza las gráficas obteniendo las muestras usando fs para observar los puntos sobre x1(t) de ω=0.4π. Para suavizar la curva x(t) se usa fs_veces como sobremuestreo de la señal y crear la linea azul.
Se compara con x2(t) realizando el mismo proceso, que al unificar las gráficas se observa que los puntos  de muestra son válidos para ambas señales x1(t), x2(t).

muestreo: 13
 tamaño ki: 13
 tamaño ti: 145
fs: 60  ; dt: 0.016666666666666666  ; fs_veces: 12
cos(0.4*pi*n)
cos(7.5398223686155*n)

La gráfica permite mostrar que las muestras son iguales en cada dt=1/fs para ambas señales.

muestreo Alias coseno dos señales
[ muestras ] [ alias ] [ ejemplo ] [ algoritmo ] [ ejercicio alias ]
..


2.2 Instrucciones en Python

 

# ejercicio 4.2 p128 Muestreo de señales sinusoidales
# telg1034 DSP fiec-espol edelros@espol.edu.ec
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
import telg1034 as dsp

# variables continuas
from telg1034 import t,A,w,f,p,pi,DosPi,I,equivalentes
# variables discretas
from telg1034 import n

# INGRESO
# usar np.pi para evitar frecuencia fundamental automatica de sympy
x1 = sym.cos(0.4*pi*n) 
x2 = sym.cos(2.4*np.pi*n)

x_senales = [x1,x2]
x_etiqueta = ['x1[n]','x2[n]']

fs = 60  # muestreo discreto
fs_veces = 12 # sobremuestreo para x(t)

muestrasN = 12 + 1  # para x[n]

# PROCEDIMIENTO
x_conteo = len(x_senales)
# muestreo x[n]
dt = 1/fs 
ki = np.arange(0,muestrasN,1,dtype=int)
# muestreo x(t)
dtc = dt/fs_veces # para x(t)
ti = np.arange(0,ki[muestrasN-1]*dt+dtc,dtc)
x_muestras = {}
for k in range(0,x_conteo,1):
    unasenal = x_senales[k]
    xtk = unasenal.subs(n,t*fs)
    xt = sym.lambdify(t,xtk, modules=equivalentes)
    xki = xt(ki*dt) 
    xti = xt(ti)
    x_muestras[k] = {'ki':ki,'xki':xki,
                     'ti':ti,'xti':xti,}

# SALIDA
print('muestreo:',muestrasN)
print(' tamaño ki:',len(ki))
print(' tamaño ti:',len(ti))
print('fs:',fs,' ; dt:',dt, ' ; fs_veces:',fs_veces)
for unasenal in x_senales:
    print(unasenal)

# GRAFICA
for i in range(0,len(x_muestras),1):
    color_i = dsp._graf_lineacolor_i(i)
    estilo_i = ':' # estilo de la línea
    if i%2 == 0:  #es impar
        estilo_i = '--'
    # muestreo x[n]
    ki = x_muestras[i]['ki']
    xki = x_muestras[i]['xki']
    puntofmt = color_i + estilo_i
    plt.stem(ki*dt, xki, linefmt = puntofmt,
             label='x'+str(i)+'[n]')
    # muestreo x(t)
    ti = x_muestras[i]['ti']
    xti = x_muestras[i]['xti']
    plt.plot(ti,xti, '-', color = color_i,
             label='x'+str(i)+'(t)')
plt.axhline(0,color='black')
plt.xlabel('t')
plt.ylabel('amplitud')
plt.title('muestreo y alias')
plt.legend()
plt.show()

[ muestras ] [ alias ] [ ejemplo ] [ algoritmo ] [ ejercicio alias ]
..


3. Ejercicios con alias

Referencia: McClellan ejercicio 42 p128

Muestre que x2[n] es un alias de x1[n] y encuentre dos frecuencias que sean alias de 0.4π rad.

x1[n] = 7 cos(0.4π n – 0.2π)

x2[n] = 7 cos(8.4π n – 0.2π) = cos(0.4π n + 4(2π n) – 0.2π )  = cos(0.4π n- 0.2π)

Usando el algoritmo del numeral anterior se realiza la gráfica.

muestreo Alias coseno

Para los alias se usa la frecuencia normalizada en radianes: ωrad , considerando que si se suma varias veces 2π se obtiene un alias.

ωalias= 0.4π + 2π k   ; donde k = 0,1,2,3…

El alias principal se define como la frecuencia única en e intervalo entre
-π <ωalias < π , que para el ejercicio es 0.4π por lo que se propone usar como alias:

x3[n] = 7 cos((0.4π + 2π )n – 0.2π)

x4[n] = 7 cos((0.4π + 2(2π) )n – 0.2π)

muestreoAlias04_cosenoEl bloque de ingreso para el algoritmo del ejercicio es:

# INGRESO
# usar np.pi para evitar frecuencia fundamental automatica
x1 = 7*sym.cos(0.4*np.pi*n - 0.2*pi)
x2 = 7*sym.cos(8.4*np.pi*n - 0.2*pi)
x3 = 7*sym.cos((0.4*np.pi+2*pi*(1))*n - 0.2*pi )
x4 = 7*sym.cos((0.4*np.pi+2*pi*(2))*n - 0.2*pi)

##x_senales = [x1,x2]
##x_etiqueta = ['x1[n]','x2[n]']
x_senales = [x1,x3,x4]
x_etiqueta = ['x1[n]','x3[n]','x4[n]']

fs = 60  # muestreo discreto, freq_sampling
fs_veces = 40 # sobremuestreo para x(t)

muestrasN = 5 + 1  # para x[n]

[ muestras ] [ alias ] [ ejemplo ] [ algoritmo ] [ ejercicio alias ]